/ Hex Artifact Content
Login

Artifact 5e5fc50bda07b83d8f602218dae3099c9b7ee7b71d6d59dfa642dc074877ec35:


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 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
2200: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
2210: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65    }.  pParse->ne
2220: 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  sted++;.  memcpy
2230: 28 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f  (saveBuf, PARSE_
2240: 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50 41  TAIL(pParse), PA
2250: 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20  RSE_TAIL_SZ);.  
2260: 6d 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41 49  memset(PARSE_TAI
2270: 4c 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50 41  L(pParse), 0, PA
2280: 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20  RSE_TAIL_SZ);.  
2290: 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72  sqlite3RunParser
22a0: 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26  (pParse, zSql, &
22b0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
22c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
22d0: 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
22e0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c  3DbFree(db, zSql
22f0: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41 52 53  );.  memcpy(PARS
2300: 45 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20  E_TAIL(pParse), 
2310: 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54  saveBuf, PARSE_T
2320: 41 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73  AIL_SZ);.  pPars
2330: 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a  e->nested--;.}..
2340: 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
2350: 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f  AUTHENTICATION./
2360: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
2370: 20 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74 68   if zTable is th
2380: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79  e name of the sy
2390: 73 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74 20  stem table that 
23a0: 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c 69  stores the.** li
23b0: 73 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64 20  st of users and 
23c0: 74 68 65 69 72 20 61 63 63 65 73 73 20 63 72 65  their access cre
23d0: 64 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e 74  dentials..*/.int
23e0: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
23f0: 54 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  Table(const char
2400: 20 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65 74   *zTable){.  ret
2410: 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72 69  urn sqlite3_stri
2420: 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c  cmp(zTable, "sql
2430: 69 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a 7d  ite_user")==0;.}
2440: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c  .#endif../*.** L
2450: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
2460: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
2470: 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70  at describes a p
2480: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
2490: 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65  se.** table give
24a0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
24b0: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
24c0: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
24d0: 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  me of the.** dat
24e0: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
24f0: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2500: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
2510: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
2520: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
2530: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
2540: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
2550: 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  he table and the
2560: 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69  .** first matchi
2570: 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75  ng table is retu
2580: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
2590: 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ing for duplicat
25a0: 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73  e table.** names
25b0: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
25c0: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20  search order is 
25d0: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
25e0: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a   MAIN, then any.
25f0: 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ** auxiliary dat
2600: 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69  abases added usi
2610: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
2620: 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  mmand..**.** See
2630: 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63   also sqlite3Loc
2640: 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54  ateTable()..*/.T
2650: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e  able *sqlite3Fin
2660: 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  dTable(sqlite3 *
2670: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
2680: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
2690: 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20  r *zDatabase){. 
26a0: 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20   Table *p = 0;. 
26b0: 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 6c   int i;..  /* Al
26c0: 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65  l mutexes are re
26d0: 71 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d  quired for schem
26e0: 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20  a access.  Make 
26f0: 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65  sure we hold the
2700: 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  m. */.  assert( 
2710: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c 20  zDatabase!=0 || 
2720: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2730: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
2740: 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53  );.#if SQLITE_US
2750: 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
2760: 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20  N.  /* Only the 
2770: 61 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61 6c  admin user is al
2780: 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68  lowed to know th
2790: 61 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75 73  at the sqlite_us
27a0: 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65 78  er table.  ** ex
27b0: 69 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64 62  ists */.  if( db
27c0: 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c  ->auth.authLevel
27d0: 3c 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26 20  <UAUTH_Admin && 
27e0: 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54  sqlite3UserAuthT
27f0: 61 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20 29  able(zName)!=0 )
2800: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2810: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68 69    }.#endif.  whi
2820: 6c 65 28 31 29 7b 0a 20 20 20 20 66 6f 72 28 69  le(1){.    for(i
2830: 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c  =OMIT_TEMPDB; i<
2840: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2850: 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c       int j = (i<
2860: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20  2) ? i^1 : i;   
2870: 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62  /* Search TEMP b
2880: 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20  efore MAIN */.  
2890: 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73      if( zDatabas
28a0: 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53  e==0 || sqlite3S
28b0: 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65  trICmp(zDatabase
28c0: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62  , db->aDb[j].zDb
28d0: 53 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  SName)==0 ){.   
28e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
28f0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
2900: 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b  eld(db, j, 0) );
2910: 0a 20 20 20 20 20 20 20 20 70 20 3d 20 73 71 6c  .        p = sql
2920: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
2930: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
2940: 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65  ->tblHash, zName
2950: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2960: 20 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20   ) return p;.   
2970: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f     }.    }.    /
2980: 2a 20 4e 6f 74 20 66 6f 75 6e 64 2e 20 20 49 66  * Not found.  If
2990: 20 74 68 65 20 6e 61 6d 65 20 77 65 20 77 65 72   the name we wer
29a0: 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 77 61  e looking for wa
29b0: 73 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 6d 61  s temp.sqlite_ma
29c0: 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 6e  ster.    ** then
29d0: 20 63 68 61 6e 67 65 20 74 68 65 20 6e 61 6d 65   change the name
29e0: 20 74 6f 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f   to sqlite_temp_
29f0: 6d 61 73 74 65 72 20 61 6e 64 20 74 72 79 20 61  master and try a
2a00: 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  gain. */.    if(
2a10: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2a20: 7a 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  zName, MASTER_NA
2a30: 4d 45 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ME)!=0 ) break;.
2a40: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
2a50: 73 74 72 69 63 6d 70 28 7a 44 61 74 61 62 61 73  stricmp(zDatabas
2a60: 65 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44  e, db->aDb[1].zD
2a70: 62 53 4e 61 6d 65 29 21 3d 30 20 29 20 62 72 65  bSName)!=0 ) bre
2a80: 61 6b 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  ak;.    zName = 
2a90: 54 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d 45  TEMP_MASTER_NAME
2aa0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2ab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
2ac0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
2ad0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
2ae0: 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69  escribes a parti
2af0: 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a  cular database.*
2b00: 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  * table given th
2b10: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74  e name of that t
2b20: 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e  able and (option
2b30: 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f  ally) the name o
2b40: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
2b50: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
2b60: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
2b70: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
2b80: 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61  d.  Also leave a
2b90: 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  n.** error messa
2ba0: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
2bb0: 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rrMsg..**.** The
2bc0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
2bd0: 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
2be0: 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64   and sqlite3Find
2bf0: 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20  Table() is that 
2c00: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
2c10: 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20  leaves an error 
2c20: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
2c30: 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65  e->zErrMsg where
2c40: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54  .** sqlite3FindT
2c50: 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e  able() does not.
2c60: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
2c70: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20  e3LocateTable(. 
2c80: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2c90: 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65          /* conte
2ca0: 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72  xt in which to r
2cb0: 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a  eport errors */.
2cc0: 20 20 75 33 32 20 66 6c 61 67 73 2c 20 20 20 20    u32 flags,    
2cd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 43 41           /* LOCA
2ce0: 54 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43 41 54  TE_VIEW or LOCAT
2cf0: 45 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63 6f 6e  E_NOERR */.  con
2d00: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
2d10: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2d20: 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
2d30: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20  looking for */. 
2d40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2d50: 61 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ase     /* Name 
2d60: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
2d70: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
2d80: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
2d90: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2da0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
2db0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
2dc0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
2dd0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2de0: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
2df0: 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
2e00: 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
2e10: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
2e20: 2e 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e  . */.  if( (db->
2e30: 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41  mDbFlags & DBFLA
2e40: 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 29  G_SchemaKnownOk)
2e50: 3d 3d 30 20 0a 20 20 20 26 26 20 53 51 4c 49 54  ==0 .   && SQLIT
2e60: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
2e70: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 0a  dSchema(pParse).
2e80: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2e90: 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71  0;.  }..  p = sq
2ea0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
2eb0: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65  b, zName, zDbase
2ec0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
2ed0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ee0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2ef0: 45 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  E.    /* If zNam
2f00: 65 20 69 73 20 74 68 65 20 6e 6f 74 20 74 68 65  e is the not the
2f10: 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65   name of a table
2f20: 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63   in the schema c
2f30: 72 65 61 74 65 64 20 75 73 69 6e 67 0a 20 20 20  reated using.   
2f40: 20 2a 2a 20 43 52 45 41 54 45 2c 20 74 68 65 6e   ** CREATE, then
2f50: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
2f60: 20 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20   it is the name 
2f70: 6f 66 20 61 6e 20 76 69 72 74 75 61 6c 20 74 61  of an virtual ta
2f80: 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ble that.    ** 
2f90: 63 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d  can be an eponym
2fa0: 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ous virtual tabl
2fb0: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  e. */.    if( pP
2fc0: 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 56 74 61  arse->disableVta
2fd0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d 6f  b==0 ){.      Mo
2fe0: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
2ff0: 64 75 6c 65 2a 29 73 71 6c 69 74 65 33 48 61 73  dule*)sqlite3Has
3000: 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75  hFind(&db->aModu
3010: 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  le, zName);.    
3020: 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20 26 26    if( pMod==0 &&
3030: 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
3040: 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d 61  p(zName, "pragma
3050: 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  _", 7)==0 ){.   
3060: 20 20 20 20 20 70 4d 6f 64 20 3d 20 73 71 6c 69       pMod = sqli
3070: 74 65 33 50 72 61 67 6d 61 56 74 61 62 52 65 67  te3PragmaVtabReg
3080: 69 73 74 65 72 28 64 62 2c 20 7a 4e 61 6d 65 29  ister(db, zName)
3090: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30a0: 69 66 28 20 70 4d 6f 64 20 26 26 20 73 71 6c 69  if( pMod && sqli
30b0: 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73  te3VtabEponymous
30c0: 54 61 62 6c 65 49 6e 69 74 28 70 50 61 72 73 65  TableInit(pParse
30d0: 2c 20 70 4d 6f 64 29 20 29 7b 0a 20 20 20 20 20  , pMod) ){.     
30e0: 20 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e     return pMod->
30f0: 70 45 70 6f 54 61 62 3b 0a 20 20 20 20 20 20 7d  pEpoTab;.      }
3100: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
3110: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4c 4f    if( flags & LO
3120: 43 41 54 45 5f 4e 4f 45 52 52 20 29 20 72 65 74  CATE_NOERR ) ret
3130: 75 72 6e 20 30 3b 0a 20 20 20 20 70 50 61 72 73  urn 0;.    pPars
3140: 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
3150: 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
3160: 49 73 56 69 72 74 75 61 6c 28 70 29 20 26 26 20  IsVirtual(p) && 
3170: 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 56  pParse->disableV
3180: 74 61 62 20 29 7b 0a 20 20 20 20 70 20 3d 20 30  tab ){.    p = 0
3190: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 3d 3d  ;.  }..  if( p==
31a0: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
31b0: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 66 6c 61 67  har *zMsg = flag
31c0: 73 20 26 20 4c 4f 43 41 54 45 5f 56 49 45 57 20  s & LOCATE_VIEW 
31d0: 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22  ? "no such view"
31e0: 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c   : "no such tabl
31f0: 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 61  e";.    if( zDba
3200: 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  se ){.      sqli
3210: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3220: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c  se, "%s: %s.%s",
3230: 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a   zMsg, zDbase, z
3240: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
3250: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
3260: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3270: 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20  "%s: %s", zMsg, 
3280: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
3290: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  }..  return p;.}
32a0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
32b0: 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66  he table identif
32c0: 69 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a  ied by *p..**.**
32d0: 20 54 68 69 73 20 69 73 20 61 20 77 72 61 70 70   This is a wrapp
32e0: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
32f0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20  3LocateTable(). 
3300: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
3310: 65 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65  etween.** sqlite
3320: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61  3LocateTable() a
3330: 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
3340: 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
3350: 6e 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73  nction restricts
3360: 0a 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 74  .** the search t
3370: 6f 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63  o schema (p->pSc
3380: 68 65 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e  hema) if it is n
3390: 6f 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68  ot NULL. p->pSch
33a0: 65 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f  ema may be.** no
33b0: 6e 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20  n-NULL if it is 
33c0: 70 61 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f  part of a view o
33d0: 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  r trigger progra
33e0: 6d 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65  m definition. Se
33f0: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53  e.** sqlite3FixS
3400: 72 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74  rcList() for det
3410: 61 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  ails..*/.Table *
3420: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
3430: 6c 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20  leItem(.  Parse 
3440: 2a 70 50 61 72 73 65 2c 20 0a 20 20 75 33 32 20  *pParse, .  u32 
3450: 66 6c 61 67 73 2c 0a 20 20 73 74 72 75 63 74 20  flags,.  struct 
3460: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a  SrcList_item *p.
3470: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
3480: 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20  *zDb;.  assert( 
3490: 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c  p->pSchema==0 ||
34a0: 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30   p->zDatabase==0
34b0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 63   );.  if( p->pSc
34c0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74 20  hema ){.    int 
34d0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
34e0: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
34f0: 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  e->db, p->pSchem
3500: 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70 50  a);.    zDb = pP
3510: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
3520: 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 7d  b].zDbSName;.  }
3530: 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20  else{.    zDb = 
3540: 70 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20  p->zDatabase;.  
3550: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
3560: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
3570: 61 72 73 65 2c 20 66 6c 61 67 73 2c 20 70 2d 3e  arse, flags, p->
3580: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a  zName, zDb);.}..
3590: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
35a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
35b0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
35c0: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
35d0: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
35e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
35f0: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
3600: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
3610: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
3620: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
3630: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
3640: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
3650: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
3660: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
3670: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
3680: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
3690: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
36a0: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
36b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
36c0: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
36d0: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
36e0: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
36f0: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
3700: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
3710: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
3720: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
3730: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
3740: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
3750: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
3760: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
3770: 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  e3FindIndex(sqli
3780: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
3790: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
37a0: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
37b0: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
37c0: 69 6e 74 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20  int i;.  /* All 
37d0: 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71 75  mutexes are requ
37e0: 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20  ired for schema 
37f0: 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75  access.  Make su
3800: 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e  re we hold them.
3810: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44   */.  assert( zD
3820: 62 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42  b!=0 || sqlite3B
3830: 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65  treeHoldsAllMute
3840: 78 65 73 28 64 62 29 20 29 3b 0a 20 20 66 6f 72  xes(db) );.  for
3850: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
3860: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
3870: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
3880: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f  2) ? i^1 : i;  /
3890: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
38a0: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
38b0: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
38c0: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53   = db->aDb[j].pS
38d0: 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72  chema;.    asser
38e0: 74 28 20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  t( pSchema );.  
38f0: 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c    if( zDb && sql
3900: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
3910: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53   db->aDb[j].zDbS
3920: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
3930: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
3940: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
3950: 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29  Held(db, j, 0) )
3960: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
3970: 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68 65  3HashFind(&pSche
3980: 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61  ma->idxHash, zNa
3990: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
39a0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
39b0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
39c0: 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d   Reclaim the mem
39d0: 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20 69  ory used by an i
39e0: 6e 64 65 78 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ndex.*/.void sql
39f0: 69 74 65 33 46 72 65 65 49 6e 64 65 78 28 73 71  ite3FreeIndex(sq
3a00: 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78  lite3 *db, Index
3a10: 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53 51   *p){.#ifndef SQ
3a20: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a  LITE_OMIT_ANALYZ
3a30: 45 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74  E.  sqlite3Delet
3a40: 65 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 64 62  eIndexSamples(db
3a50: 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  , p);.#endif.  s
3a60: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3a70: 28 64 62 2c 20 70 2d 3e 70 50 61 72 74 49 64 78  (db, p->pPartIdx
3a80: 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
3a90: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
3aa0: 64 62 2c 20 70 2d 3e 61 43 6f 6c 45 78 70 72 29  db, p->aColExpr)
3ab0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
3ac0: 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66  e(db, p->zColAff
3ad0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65  );.  if( p->isRe
3ae0: 73 69 7a 65 64 20 29 20 73 71 6c 69 74 65 33 44  sized ) sqlite3D
3af0: 62 46 72 65 65 28 64 62 2c 20 28 76 6f 69 64 20  bFree(db, (void 
3b00: 2a 29 70 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 23 69  *)p->azColl);.#i
3b10: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3b20: 4c 45 5f 53 54 41 54 34 0a 20 20 73 71 6c 69 74  LE_STAT4.  sqlit
3b30: 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f 77  e3_free(p->aiRow
3b40: 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  Est);.#endif.  s
3b50: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3b60: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f   p);.}../*.** Fo
3b70: 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c 6c  r the index call
3b80: 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69 63  ed zIdxName whic
3b90: 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68  h is found in th
3ba0: 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c 0a  e database iDb,.
3bb0: 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20 69  ** unlike that i
3bc0: 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54 61  ndex from its Ta
3bd0: 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65 20  ble then remove 
3be0: 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a  the index from.*
3bf0: 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68  * the index hash
3c00: 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20   table and free 
3c10: 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  all memory struc
3c20: 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
3c30: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64  .** with the ind
3c40: 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ex..*/.void sqli
3c50: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
3c60: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  teIndex(sqlite3 
3c70: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
3c80: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61  nst char *zIdxNa
3c90: 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  me){.  Index *pI
3ca0: 6e 64 65 78 3b 0a 20 20 48 61 73 68 20 2a 70 48  ndex;.  Hash *pH
3cb0: 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ash;..  assert( 
3cc0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
3cd0: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
3ce0: 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d 20  0) );.  pHash = 
3cf0: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53  &db->aDb[iDb].pS
3d00: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a  chema->idxHash;.
3d10: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
3d20: 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61  e3HashInsert(pHa
3d30: 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30 29  sh, zIdxName, 0)
3d40: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
3d50: 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69 66  Index) ){.    if
3d60: 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ( pIndex->pTable
3d70: 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78  ->pIndex==pIndex
3d80: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
3d90: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
3da0: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
3db0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3dc0: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
3dd0: 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74     /* Justificat
3de0: 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b  ion of ALWAYS();
3df0: 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74    The index must
3e00: 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20   be on the list 
3e10: 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69  of.      ** indi
3e20: 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20  ces. */.      p 
3e30: 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
3e40: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
3e50: 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29  while( ALWAYS(p)
3e60: 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49   && p->pNext!=pI
3e70: 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70  ndex ){ p = p->p
3e80: 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66  Next; }.      if
3e90: 28 20 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d  ( ALWAYS(p && p-
3ea0: 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20  >pNext==pIndex) 
3eb0: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  ){.        p->pN
3ec0: 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  ext = pIndex->pN
3ed0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
3ee0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 72   }.    sqlite3Fr
3ef0: 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  eeIndex(db, pInd
3f00: 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6d  ex);.  }.  db->m
3f10: 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41  DbFlags |= DBFLA
3f20: 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  G_SchemaChange;.
3f30: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68  }../*.** Look th
3f40: 72 6f 75 67 68 20 74 68 65 20 6c 69 73 74 20 6f  rough the list o
3f50: 66 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  f open database 
3f60: 66 69 6c 65 73 20 69 6e 20 64 62 2d 3e 61 44 62  files in db->aDb
3f70: 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79  [] and if.** any
3f80: 20 68 61 76 65 20 62 65 65 6e 20 63 6c 6f 73 65   have been close
3f90: 64 2c 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66  d, remove them f
3fa0: 72 6f 6d 20 74 68 65 20 6c 69 73 74 2e 20 20 52  rom the list.  R
3fb0: 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a  eallocate the.**
3fc0: 20 64 62 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63   db->aDb[] struc
3fd0: 74 75 72 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65  ture to a smalle
3fe0: 72 20 73 69 7a 65 2c 20 69 66 20 70 6f 73 73 69  r size, if possi
3ff0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79  ble..**.** Entry
4000: 20 30 20 28 74 68 65 20 22 6d 61 69 6e 22 20 64   0 (the "main" d
4010: 61 74 61 62 61 73 65 29 20 61 6e 64 20 65 6e 74  atabase) and ent
4020: 72 79 20 31 20 28 74 68 65 20 22 74 65 6d 70 22  ry 1 (the "temp"
4030: 20 64 61 74 61 62 61 73 65 29 0a 2a 2a 20 61 72   database).** ar
4040: 65 20 6e 65 76 65 72 20 63 61 6e 64 69 64 61 74  e never candidat
4050: 65 73 20 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c  es for being col
4060: 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  lapsed..*/.void 
4070: 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44  sqlite3CollapseD
4080: 61 74 61 62 61 73 65 41 72 72 61 79 28 73 71 6c  atabaseArray(sql
4090: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
40a0: 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a   i, j;.  for(i=j
40b0: 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =2; i<db->nDb; i
40c0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
40d0: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
40e0: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
40f0: 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  Db->pBt==0 ){.  
4100: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4110: 65 28 64 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e  e(db, pDb->zDbSN
4120: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  ame);.      pDb-
4130: 3e 7a 44 62 53 4e 61 6d 65 20 3d 20 30 3b 0a 20  >zDbSName = 0;. 
4140: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
4150: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69     }.    if( j<i
4160: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   ){.      db->aD
4170: 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69  b[j] = db->aDb[i
4180: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b  ];.    }.    j++
4190: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 44 62 20  ;.  }.  db->nDb 
41a0: 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e  = j;.  if( db->n
41b0: 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62  Db<=2 && db->aDb
41c0: 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20  !=db->aDbStatic 
41d0: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62  ){.    memcpy(db
41e0: 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d  ->aDbStatic, db-
41f0: 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64  >aDb, 2*sizeof(d
4200: 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20  b->aDb[0]));.   
4210: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4220: 62 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20  b, db->aDb);.   
4230: 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
4240: 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a  DbStatic;.  }.}.
4250: 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65  ./*.** Reset the
4260: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20   schema for the 
4270: 64 61 74 61 62 61 73 65 20 61 74 20 69 6e 64 65  database at inde
4280: 78 20 69 44 62 2e 20 20 41 6c 73 6f 20 72 65 73  x iDb.  Also res
4290: 65 74 20 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73  et the.** TEMP s
42a0: 63 68 65 6d 61 2e 20 20 54 68 65 20 72 65 73 65  chema.  The rese
42b0: 74 20 69 73 20 64 65 66 65 72 72 65 64 20 69 66  t is deferred if
42c0: 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b   db->nSchemaLock
42d0: 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2e 0a 2a 2a   is not zero..**
42e0: 20 44 65 66 65 72 72 65 64 20 72 65 73 65 74 73   Deferred resets
42f0: 20 6d 61 79 20 62 65 20 72 75 6e 20 62 79 20 63   may be run by c
4300: 61 6c 6c 69 6e 67 20 77 69 74 68 20 69 44 62 3c  alling with iDb<
4310: 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
4320: 65 33 52 65 73 65 74 4f 6e 65 53 63 68 65 6d 61  e3ResetOneSchema
4330: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
4340: 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 69 3b  t iDb){.  int i;
4350: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64  .  assert( iDb<d
4360: 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 69 66 28  b->nDb );..  if(
4370: 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61   iDb>=0 ){.    a
4380: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
4390: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
43a0: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
43b0: 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64   DbSetProperty(d
43c0: 62 2c 20 69 44 62 2c 20 44 42 5f 52 65 73 65 74  b, iDb, DB_Reset
43d0: 57 61 6e 74 65 64 29 3b 0a 20 20 20 20 44 62 53  Wanted);.    DbS
43e0: 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 31  etProperty(db, 1
43f0: 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64  , DB_ResetWanted
4400: 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c  );.    db->mDbFl
4410: 61 67 73 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53  ags &= ~DBFLAG_S
4420: 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 3b 0a 20 20  chemaKnownOk;.  
4430: 7d 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 63  }..  if( db->nSc
4440: 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  hemaLock==0 ){. 
4450: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
4460: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
4470: 20 20 20 69 66 28 20 44 62 48 61 73 50 72 6f 70     if( DbHasProp
4480: 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 52  erty(db, i, DB_R
4490: 65 73 65 74 57 61 6e 74 65 64 29 20 29 7b 0a 20  esetWanted) ){. 
44a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63         sqlite3Sc
44b0: 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44  hemaClear(db->aD
44c0: 62 5b 69 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20  b[i].pSchema);. 
44d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
44e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
44f0: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
4500: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20  mation from all 
4510: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
4520: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a  es (including.**
4530: 20 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d   "main" and "tem
4540: 70 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  p") for a single
4550: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
4560: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
4570: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
4580: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
4590: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
45a0: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
45b0: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
45c0: 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  b);.  for(i=0; i
45d0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
45e0: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
45f0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
4600: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20  f( pDb->pSchema 
4610: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  ){.      if( db-
4620: 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20  >nSchemaLock==0 
4630: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4640: 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44  e3SchemaClear(pD
4650: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
4660: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4670: 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28    DbSetProperty(
4680: 64 62 2c 20 69 2c 20 44 42 5f 52 65 73 65 74 57  db, i, DB_ResetW
4690: 61 6e 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 0a  anted);.      }.
46a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e      }.  }.  db->
46b0: 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e 28 44 42  mDbFlags &= ~(DB
46c0: 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67  FLAG_SchemaChang
46d0: 65 7c 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b  e|DBFLAG_SchemaK
46e0: 6e 6f 77 6e 4f 6b 29 3b 0a 20 20 73 71 6c 69 74  nownOk);.  sqlit
46f0: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74  e3VtabUnlockList
4700: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  (db);.  sqlite3B
4710: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
4720: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68  ;.  if( db->nSch
4730: 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  emaLock==0 ){.  
4740: 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73    sqlite3Collaps
4750: 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64  eDatabaseArray(d
4760: 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  b);.  }.}../*.**
4770: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4780: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   called when a c
4790: 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f  ommit occurs..*/
47a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
47b0: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
47c0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
47d0: 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20  .  db->mDbFlags 
47e0: 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63 68 65 6d  &= ~DBFLAG_Schem
47f0: 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  aChange;.}../*.*
4800: 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20  * Delete memory 
4810: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
4820: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f  e column names o
4830: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
4840: 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e  w (the.** Table.
4850: 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a  aCol[] array)..*
4860: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
4870: 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
4880: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
4890: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69  le *pTable){.  i
48a0: 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  nt i;.  Column *
48b0: 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  pCol;.  assert( 
48c0: 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69  pTable!=0 );.  i
48d0: 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c  f( (pCol = pTabl
48e0: 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20  e->aCol)!=0 ){. 
48f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
4900: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  able->nCol; i++,
4910: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
4920: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4930: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCol->zName);.
4940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
4950: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  rDelete(db, pCol
4960: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
4970: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4980: 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a  , pCol->zColl);.
4990: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
49a0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
49b0: 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d  le->aCol);.  }.}
49c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
49d0: 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73  he memory data s
49e0: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
49f0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
4a00: 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e  ven.** Table.  N
4a10: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
4a20: 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68  de to disk by th
4a30: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
4a40: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a  * This routine j
4a50: 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20  ust deletes the 
4a60: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20  data structure. 
4a70: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c   It does not unl
4a80: 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ink.** the table
4a90: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
4aa0: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
4ab0: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65  ble.  But it doe
4ac0: 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  s destroy.** mem
4ad0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
4ae0: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e  f the indices an
4af0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  d foreign keys a
4b00: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
4b10: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  ** the table..**
4b20: 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61 6d  .** The db param
4b30: 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61 6c  eter is optional
4b40: 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65 64 20  .  It is needed 
4b50: 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  if the Table obj
4b60: 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ect .** contains
4b70: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
4b80: 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65 63  y.  (Table objec
4b90: 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ts in the schema
4ba0: 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c   do not use.** l
4bb0: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2c  ookaside memory,
4bc0: 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d 65   but some epheme
4bd0: 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  ral Table object
4be0: 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a 2a  s do.)  Or the.*
4bf0: 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 63  * db parameter c
4c00: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
4c10: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
4c20: 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20   to measure the 
4c30: 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20 62  memory.** used b
4c40: 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  y the Table obje
4c50: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
4c60: 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  id SQLITE_NOINLI
4c70: 4e 45 20 64 65 6c 65 74 65 54 61 62 6c 65 28 73  NE deleteTable(s
4c80: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
4c90: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e  e *pTable){.  In
4ca0: 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e  dex *pIndex, *pN
4cb0: 65 78 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ext;..#ifdef SQL
4cc0: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 52  ITE_DEBUG.  /* R
4cd0: 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
4ce0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
4cf0: 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61  lookaside alloca
4d00: 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d 61 20  tions in schema 
4d10: 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72 69 6f  Tables.  ** prio
4d20: 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 66  r to doing any f
4d30: 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 73  ree() operations
4d40: 2e 20 53 69 6e 63 65 20 73 63 68 65 6d 61 20 54  . Since schema T
4d50: 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 75 73 65  ables do not use
4d60: 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c  .  ** lookaside,
4d70: 20 74 68 69 73 20 6e 75 6d 62 65 72 20 73 68 6f   this number sho
4d80: 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20  uld not change. 
4d90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 6d 61  .  **.  ** If ma
4da0: 6c 6c 6f 63 20 68 61 73 20 61 6c 72 65 61 64 79  lloc has already
4db0: 20 66 61 69 6c 65 64 2c 20 69 74 20 6d 61 79 20   failed, it may 
4dc0: 62 65 20 74 68 61 74 20 69 74 20 66 61 69 6c 65  be that it faile
4dd0: 64 20 77 68 69 6c 65 20 61 6c 6c 6f 63 61 74 69  d while allocati
4de0: 6e 67 0a 20 20 2a 2a 20 61 20 54 61 62 6c 65 20  ng.  ** a Table 
4df0: 6f 62 6a 65 63 74 20 74 68 61 74 20 77 61 73 20  object that was 
4e00: 67 6f 69 6e 67 20 74 6f 20 62 65 20 6d 61 72 6b  going to be mark
4e10: 65 64 20 65 70 68 65 6d 65 72 61 6c 2e 20 53 6f  ed ephemeral. So
4e20: 20 64 6f 20 6e 6f 74 20 63 68 65 63 6b 0a 20 20   do not check.  
4e30: 2a 2a 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61  ** that no looka
4e40: 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 75  side memory is u
4e50: 73 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  sed in this case
4e60: 20 65 69 74 68 65 72 2e 20 2a 2f 0a 20 20 69 6e   either. */.  in
4e70: 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 30  t nLookaside = 0
4e80: 3b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 64  ;.  if( db && !d
4e90: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4ea0: 26 26 20 28 70 54 61 62 6c 65 2d 3e 74 61 62 46  && (pTable->tabF
4eb0: 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
4ec0: 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  ral)==0 ){.    n
4ed0: 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 73 71 6c 69  Lookaside = sqli
4ee0: 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64  te3LookasideUsed
4ef0: 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  (db, 0);.  }.#en
4f00: 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  dif..  /* Delete
4f10: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
4f20: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
4f30: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f  s table. */.  fo
4f40: 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c  r(pIndex = pTabl
4f50: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  e->pIndex; pInde
4f60: 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29  x; pIndex=pNext)
4f70: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
4f80: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
4f90: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
4fa0: 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65  >pSchema==pTable
4fb0: 2d 3e 70 53 63 68 65 6d 61 0a 20 20 20 20 20 20  ->pSchema.      
4fc0: 20 20 20 7c 7c 20 28 49 73 56 69 72 74 75 61 6c     || (IsVirtual
4fd0: 28 70 54 61 62 6c 65 29 20 26 26 20 70 49 6e 64  (pTable) && pInd
4fe0: 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c  ex->idxType!=SQL
4ff0: 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
5000: 45 46 29 20 29 3b 0a 20 20 20 20 69 66 28 20 28  EF) );.    if( (
5010: 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42  db==0 || db->pnB
5020: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
5030: 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
5040: 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  le) ){.      cha
5050: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65  r *zName = pInde
5060: 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20  x->zName; .     
5070: 20 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65   TESTONLY ( Inde
5080: 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69  x *pOld = ) sqli
5090: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 0a 20  te3HashInsert(. 
50a0: 20 20 20 20 20 20 20 20 26 70 49 6e 64 65 78 2d          &pIndex-
50b0: 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
50c0: 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20  h, zName, 0.    
50d0: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
50e0: 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69  t( db==0 || sqli
50f0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
5100: 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78  ld(db, 0, pIndex
5110: 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
5120: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64      assert( pOld
5130: 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64  ==pIndex || pOld
5140: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
5150: 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65   sqlite3FreeInde
5160: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
5170: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
5180: 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  any foreign keys
5190: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 69   attached to thi
51a0: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71  s table. */.  sq
51b0: 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62  lite3FkDelete(db
51c0: 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a  , pTable);..  /*
51d0: 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c   Delete the Tabl
51e0: 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  e structure itse
51f0: 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  lf..  */.  sqlit
5200: 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61  e3DeleteColumnNa
5210: 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  mes(db, pTable);
5220: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
5230: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  (db, pTable->zNa
5240: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
5250: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  Free(db, pTable-
5260: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
5270: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
5280: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65  (db, pTable->pSe
5290: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
52a0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
52b0: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  b, pTable->pChec
52c0: 6b 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  k);.#ifndef SQLI
52d0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
52e0: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74  ABLE.  sqlite3Vt
52f0: 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62  abClear(db, pTab
5300: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  le);.#endif.  sq
5310: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5320: 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56  pTable);..  /* V
5330: 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f  erify that no lo
5340: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 77  okaside memory w
5350: 61 73 20 75 73 65 64 20 62 79 20 73 63 68 65 6d  as used by schem
5360: 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73  a tables */.  as
5370: 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65  sert( nLookaside
5380: 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64  ==0 || nLookasid
5390: 65 3d 3d 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73  e==sqlite3Lookas
53a0: 69 64 65 55 73 65 64 28 64 62 2c 30 29 20 29 3b  ideUsed(db,0) );
53b0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  .}.void sqlite3D
53c0: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
53d0: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
53e0: 54 61 62 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20  Table){.  /* Do 
53f0: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74  not delete the t
5400: 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72  able until the r
5410: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
5420: 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a  eaches zero. */.
5430: 20 20 69 66 28 20 21 70 54 61 62 6c 65 20 29 20    if( !pTable ) 
5440: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 28  return;.  if( ((
5450: 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  !db || db->pnByt
5460: 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20 28  esFreed==0) && (
5470: 2d 2d 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65  --pTable->nTabRe
5480: 66 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  f)>0) ) return;.
5490: 20 20 64 65 6c 65 74 65 54 61 62 6c 65 28 64 62    deleteTable(db
54a0: 2c 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f  , pTable);.}.../
54b0: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20  *.** Unlink the 
54c0: 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d  given table from
54d0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73   the hash tables
54e0: 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20   and the delete 
54f0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72  the.** table str
5500: 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20  ucture with all 
5510: 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20  its indices and 
5520: 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f  foreign keys..*/
5530: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c  .void sqlite3Unl
5540: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c  inkAndDeleteTabl
5550: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  e(sqlite3 *db, i
5560: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68  nt iDb, const ch
5570: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20  ar *zTabName){. 
5580: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20   Table *p;.  Db 
5590: 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
55a0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
55b0: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
55c0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
55d0: 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20  ssert( zTabName 
55e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
55f0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
5600: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
5610: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 7a  );.  testcase( z
5620: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b  TabName[0]==0 );
5630: 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68    /* Zero-length
5640: 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65   table names are
5650: 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44   allowed */.  pD
5660: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
5670: 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ];.  p = sqlite3
5680: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
5690: 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
56a0: 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b  h, zTabName, 0);
56b0: 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  .  sqlite3Delete
56c0: 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20  Table(db, p);.  
56d0: 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20  db->mDbFlags |= 
56e0: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61  DBFLAG_SchemaCha
56f0: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  nge;.}../*.** Gi
5700: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74  ven a token, ret
5710: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
5720: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  t consists of th
5730: 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a  e text of that.*
5740: 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20  * token.  Space 
5750: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
5760: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
5770: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
5780: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
5790: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
57a0: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
57b0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  ** function..**.
57c0: 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e  ** Any quotation
57d0: 20 6d 61 72 6b 73 20 28 65 78 3a 20 20 22 6e 61   marks (ex:  "na
57e0: 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61  me", 'name', [na
57f0: 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20  me], or `name`) 
5800: 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64  that.** surround
5810: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
5820: 20 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76   token are remov
5830: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73  ed..**.** Tokens
5840: 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20   are often just 
5850: 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68  pointers into th
5860: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74  e original SQL t
5870: 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72  ext and so.** ar
5880: 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69  e not \000 termi
5890: 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f  nated and are no
58a0: 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54  t persistent.  T
58b0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
58c0: 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65  ng.** is \000 te
58d0: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20  rminated and is 
58e0: 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63  persistent..*/.c
58f0: 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65  har *sqlite3Name
5900: 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65  FromToken(sqlite
5910: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
5920: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
5930: 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  ame;.  if( pName
5940: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
5950: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
5960: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d  (db, (char*)pNam
5970: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
5980: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
5990: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  ote(zName);.  }e
59a0: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  lse{.    zName =
59b0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
59c0: 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zName;.}../*.**
59d0: 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   Open the sqlite
59e0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74  _master table st
59f0: 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65  ored in database
5a00: 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a   number iDb for.
5a10: 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20  ** writing. The 
5a20: 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  table is opened 
5a30: 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a  using cursor 0..
5a40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f  */.void sqlite3O
5a50: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50  penMasterTable(P
5a60: 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62  arse *p, int iDb
5a70: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
5a80: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29  qlite3GetVdbe(p)
5a90: 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  ;.  sqlite3Table
5aa0: 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53  Lock(p, iDb, MAS
5ab0: 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53  TER_ROOT, 1, MAS
5ac0: 54 45 52 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c  TER_NAME);.  sql
5ad0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
5ae0: 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  t(v, OP_OpenWrit
5af0: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
5b00: 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66  T, iDb, 5);.  if
5b10: 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a  ( p->nTab==0 ){.
5b20: 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b      p->nTab = 1;
5b30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  .  }.}../*.** Pa
5b40: 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f  rameter zName po
5b50: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65  ints to a nul-te
5b60: 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20  rminated buffer 
5b70: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
5b80: 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61  ame.** of a data
5b90: 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  base ("main", "t
5ba0: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
5bb0: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
5bc0: 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  db). This.** fun
5bd0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
5be0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
5bf0: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
5c00: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a   db->aDb[], or.*
5c10: 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  * -1 if the name
5c20: 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66  d db cannot be f
5c30: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
5c40: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73  ite3FindDbName(s
5c50: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
5c60: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
5c70: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20    int i = -1;   
5c80: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5c90: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66  e number */.  if
5ca0: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44  ( zName ){.    D
5cb0: 62 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f 72 28  b *pDb;.    for(
5cc0: 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70  i=(db->nDb-1), p
5cd0: 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20  Db=&db->aDb[i]; 
5ce0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d  i>=0; i--, pDb--
5cf0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
5d00: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
5d10: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a  pDb->zDbSName, z
5d20: 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20  Name) ) break;. 
5d30: 20 20 20 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69       /* "main" i
5d40: 73 20 61 6c 77 61 79 73 20 61 6e 20 61 63 63 65  s always an acce
5d50: 70 74 61 62 6c 65 20 61 6c 69 61 73 20 66 6f 72  ptable alias for
5d60: 20 74 68 65 20 70 72 69 6d 61 72 79 20 64 61 74   the primary dat
5d70: 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 65  abase.      ** e
5d80: 76 65 6e 20 69 66 20 69 74 20 68 61 73 20 62 65  ven if it has be
5d90: 65 6e 20 72 65 6e 61 6d 65 64 20 75 73 69 6e 67  en renamed using
5da0: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
5db0: 5f 4d 41 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a  _MAINDBNAME. */.
5dc0: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 26        if( i==0 &
5dd0: 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  & 0==sqlite3_str
5de0: 69 63 6d 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61  icmp("main", zNa
5df0: 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  me) ) break;.   
5e00: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5e10: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  i;.}../*.** The 
5e20: 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e  token *pName con
5e30: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
5e40: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69  f a database (ei
5e50: 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a  ther "main" or.*
5e60: 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  * "temp" or the 
5e70: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
5e80: 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f  hed db). This ro
5e90: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
5ea0: 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68  e.** index of th
5eb0: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
5ec0: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
5ed0: 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  r -1 if the name
5ee0: 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d db .** does no
5ef0: 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  t exist..*/.int 
5f00: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71  sqlite3FindDb(sq
5f10: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
5f20: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *pName){.  int 
5f30: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f50: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
5f60: 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ber */.  char *z
5f70: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
5f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5f90: 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61   Name we are sea
5fa0: 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  rching for */.  
5fb0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
5fc0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
5fd0: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73   pName);.  i = s
5fe0: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
5ff0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73  (db, zName);.  s
6000: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
6010: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
6020: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74  n i;.}../* The t
6030: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20  able or view or 
6040: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20  trigger name is 
6050: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
6060: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
6070: 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20  s.** pName1 and 
6080: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
6090: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
60a0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
60b0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
60c0: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
60d0: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a  xx.yyy (...);.**
60e0: 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31   .** Then pName1
60f0: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
6100: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
6110: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
6120: 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74  hand if.** the t
6130: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
6140: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
6150: 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52  , i.e.:.**.** CR
6160: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
6170: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ..);.**.** Then 
6180: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
6190: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
61a0: 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54  2 is ""..**.** T
61b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
61c0: 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70   the *ppUnqual p
61d0: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
61e0: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
61f0: 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65  ame1 or.** pName
6200: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
6210: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
6220: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
6230: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
6240: 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69  database "xxx" i
6250: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
6260: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
6270: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
6280: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
6290: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
62a0: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
62b0: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
62c0: 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20  pName1,      /* 
62d0: 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65  The "xxx" in the
62e0: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
62f0: 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f  or "xxx" */.  To
6300: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
6310: 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69    /* The "yyy" i
6320: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
6330: 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  yyy" */.  Token 
6340: 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a  **pUnqual     /*
6350: 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61   Write the unqua
6360: 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61  lified object na
6370: 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  me here */.){.  
6380: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
6390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
63a0: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
63b0: 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
63c0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
63d0: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73  arse->db;..  ass
63e0: 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 29  ert( pName2!=0 )
63f0: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e  ;.  if( pName2->
6400: 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  n>0 ){.    if( d
6410: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b  b->init.busy ) {
6420: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
6430: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6440: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
6450: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
6460: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a   -1;.    }.    *
6470: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32  pUnqual = pName2
6480: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
6490: 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e  te3FindDb(db, pN
64a0: 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69  ame1);.    if( i
64b0: 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  Db<0 ){.      sq
64c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
64d0: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  arse, "unknown d
64e0: 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61  atabase %T", pNa
64f0: 6d 65 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75  me1);.      retu
6500: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn -1;.    }.  }
6510: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
6520: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
6530: 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75  0 || db->init.bu
6540: 73 79 20 7c 7c 20 49 4e 5f 52 45 4e 41 4d 45 5f  sy || IN_RENAME_
6550: 4f 42 4a 45 43 54 0a 20 20 20 20 20 20 20 20 20  OBJECT.         
6560: 20 20 20 20 7c 7c 20 28 64 62 2d 3e 6d 44 62 46      || (db->mDbF
6570: 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f 56 61  lags & DBFLAG_Va
6580: 63 75 75 6d 29 21 3d 30 29 3b 0a 20 20 20 20 69  cuum)!=0);.    i
6590: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
65a0: 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  b;.    *pUnqual 
65b0: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20  = pName1;.  }.  
65c0: 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f  return iDb;.}../
65d0: 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 50 52 41  *.** True if PRA
65e0: 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
65f0: 65 6d 61 20 69 73 20 4f 4e 0a 2a 2f 0a 69 6e 74  ema is ON.*/.int
6600: 20 73 71 6c 69 74 65 33 57 72 69 74 61 62 6c 65   sqlite3Writable
6610: 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a  Schema(sqlite3 *
6620: 64 62 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  db){.  testcase(
6630: 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c   (db->flags&(SQL
6640: 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c  ITE_WriteSchema|
6650: 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65  SQLITE_Defensive
6660: 29 29 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  ))==0 );.  testc
6670: 61 73 65 28 20 28 64 62 2d 3e 66 6c 61 67 73 26  ase( (db->flags&
6680: 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68  (SQLITE_WriteSch
6690: 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e  ema|SQLITE_Defen
66a0: 73 69 76 65 29 29 3d 3d 0a 20 20 20 20 20 20 20  sive))==.       
66b0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57          SQLITE_W
66c0: 72 69 74 65 53 63 68 65 6d 61 20 29 3b 0a 20 20  riteSchema );.  
66d0: 74 65 73 74 63 61 73 65 28 20 28 64 62 2d 3e 66  testcase( (db->f
66e0: 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72 69  lags&(SQLITE_Wri
66f0: 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f  teSchema|SQLITE_
6700: 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20  Defensive))==.  
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
6720: 49 54 45 5f 44 65 66 65 6e 73 69 76 65 20 29 3b  ITE_Defensive );
6730: 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 64 62  .  testcase( (db
6740: 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f  ->flags&(SQLITE_
6750: 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49  WriteSchema|SQLI
6760: 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d  TE_Defensive))==
6770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6780: 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68  (SQLITE_WriteSch
6790: 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e  ema|SQLITE_Defen
67a0: 73 69 76 65 29 20 29 3b 0a 20 20 72 65 74 75 72  sive) );.  retur
67b0: 6e 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51  n (db->flags&(SQ
67c0: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
67d0: 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76  |SQLITE_Defensiv
67e0: 65 29 29 3d 3d 53 51 4c 49 54 45 5f 57 72 69 74  e))==SQLITE_Writ
67f0: 65 53 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  eSchema;.}../*.*
6800: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
6810: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
6820: 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72  if the UTF-8 str
6830: 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c  ing zName is a l
6840: 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66  egal.** unqualif
6850: 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ied name for a n
6860: 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  ew schema object
6870: 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20   (table, index, 
6880: 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67  view or.** trigg
6890: 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61  er). All names a
68a0: 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20  re legal except 
68b0: 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e  those that begin
68c0: 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67   with the string
68d0: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69  .** "sqlite_" (i
68e0: 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f  n upper, lower o
68f0: 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54  r mixed case). T
6900: 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  his portion of t
6910: 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20  he namespace.** 
6920: 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  is reserved for 
6930: 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2a  internal use..**
6940: 0a 2a 2a 20 57 68 65 6e 20 70 61 72 73 69 6e 67  .** When parsing
6950: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
6960: 65 72 20 74 61 62 6c 65 2c 20 74 68 69 73 20 72  er table, this r
6970: 6f 75 74 69 6e 65 20 61 6c 73 6f 20 63 68 65 63  outine also chec
6980: 6b 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75  ks to.** make su
6990: 72 65 20 74 68 65 20 22 74 79 70 65 22 2c 20 22  re the "type", "
69a0: 6e 61 6d 65 22 2c 20 61 6e 64 20 22 74 62 6c 5f  name", and "tbl_
69b0: 6e 61 6d 65 22 20 63 6f 6c 75 6d 6e 73 20 61 72  name" columns ar
69c0: 65 20 63 6f 6e 73 69 73 74 65 6e 74 0a 2a 2a 20  e consistent.** 
69d0: 77 69 74 68 20 74 68 65 20 53 51 4c 2e 0a 2a 2f  with the SQL..*/
69e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
69f0: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 0a 20 20 50  kObjectName(.  P
6a00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
6a20: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
6a30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
6a40: 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  me,        /* Na
6a50: 6d 65 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74  me of the object
6a60: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 63   to check */.  c
6a70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
6a80: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65  ,        /* Type
6a90: 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20   of this object 
6aa0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
6ab0: 2a 7a 54 62 6c 4e 61 6d 65 20 20 20 20 20 20 2f  *zTblName      /
6ac0: 2a 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20 6e  * Parent table n
6ad0: 61 6d 65 20 66 6f 72 20 74 72 69 67 67 65 72 73  ame for triggers
6ae0: 20 61 6e 64 20 69 6e 64 65 78 65 73 20 2a 2f 0a   and indexes */.
6af0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
6b00: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
6b10: 20 69 66 28 20 73 71 6c 69 74 65 33 57 72 69 74   if( sqlite3Writ
6b20: 61 62 6c 65 53 63 68 65 6d 61 28 64 62 29 20 7c  ableSchema(db) |
6b30: 7c 20 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73  | db->init.impos
6b40: 74 65 72 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  terTable ){.    
6b50: 2f 2a 20 53 6b 69 70 20 74 68 65 73 65 20 65 72  /* Skip these er
6b60: 72 6f 72 20 63 68 65 63 6b 73 20 66 6f 72 20 77  ror checks for w
6b70: 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
6b80: 4e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  N */.    return 
6b90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
6ba0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
6bb0: 73 79 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  sy ){.    if( sq
6bc0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
6bd0: 79 70 65 2c 20 64 62 2d 3e 69 6e 69 74 2e 61 7a  ype, db->init.az
6be0: 49 6e 69 74 5b 30 5d 29 0a 20 20 20 20 20 7c 7c  Init[0]).     ||
6bf0: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
6c00: 28 7a 4e 61 6d 65 2c 20 64 62 2d 3e 69 6e 69 74  (zName, db->init
6c10: 2e 61 7a 49 6e 69 74 5b 31 5d 29 0a 20 20 20 20  .azInit[1]).    
6c20: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69   || sqlite3_stri
6c30: 63 6d 70 28 7a 54 62 6c 4e 61 6d 65 2c 20 64 62  cmp(zTblName, db
6c40: 2d 3e 69 6e 69 74 2e 61 7a 49 6e 69 74 5b 32 5d  ->init.azInit[2]
6c50: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  ).    ){.      i
6c60: 66 28 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67  f( sqlite3Config
6c70: 2e 62 45 78 74 72 61 53 63 68 65 6d 61 43 68 65  .bExtraSchemaChe
6c80: 63 6b 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  cks ){.        s
6c90: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6ca0: 50 61 72 73 65 2c 20 22 22 29 3b 20 2f 2a 20 63  Parse, ""); /* c
6cb0: 6f 72 72 75 70 74 53 63 68 65 6d 61 28 29 20 77  orruptSchema() w
6cc0: 69 6c 6c 20 73 75 70 70 6c 79 20 74 68 65 20 65  ill supply the e
6cd0: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
6ce0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
6cf0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
6d00: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
6d10: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  if( pParse->nest
6d20: 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 30  ed==0 .     && 0
6d30: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
6d40: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
6d50: 5f 22 2c 20 37 29 0a 20 20 20 20 29 7b 0a 20 20  _", 7).    ){.  
6d60: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6d70: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a  Msg(pParse, "obj
6d80: 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65  ect name reserve
6d90: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
6da0: 73 65 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20  se: %s",.       
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
6dc0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
6dd0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
6de0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
6df0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6e00: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
6e10: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
6e20: 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62 6c 65  index of a table
6e30: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
6e40: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
6e50: 78 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  x(Table *pTab){.
6e60: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 66 6f    Index *p;.  fo
6e70: 72 28 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  r(p=pTab->pIndex
6e80: 3b 20 70 20 26 26 20 21 49 73 50 72 69 6d 61 72  ; p && !IsPrimar
6e90: 79 4b 65 79 49 6e 64 65 78 28 70 29 3b 20 70 3d  yKeyIndex(p); p=
6ea0: 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 72 65  p->pNext){}.  re
6eb0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
6ec0: 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6c 75   Return the colu
6ed0: 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78  mn of index pIdx
6ee0: 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
6ef0: 73 20 74 6f 20 74 61 62 6c 65 0a 2a 2a 20 63 6f  s to table.** co
6f00: 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20 52 65 74 75  lumn iCol.  Retu
6f10: 72 6e 20 2d 31 20 69 66 20 6e 6f 74 20 66 6f 75  rn -1 if not fou
6f20: 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c 69 74  nd..*/.i16 sqlit
6f30: 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
6f40: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 31 36  Index *pIdx, i16
6f50: 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b   iCol){.  int i;
6f60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6f70: 4f 4d 49 54 5f 47 45 4e 45 52 41 54 45 44 5f 43  OMIT_GENERATED_C
6f80: 4f 4c 55 4d 4e 53 0a 20 20 54 61 62 6c 65 20 2a  OLUMNS.  Table *
6f90: 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61  pTab = pIdx->pTa
6fa0: 62 6c 65 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  ble;.  if( pTab-
6fb0: 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48  >tabFlags & TF_H
6fc0: 61 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  asVirtual ){.   
6fd0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 69 43 6f   for(i=0; i<=iCo
6fe0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
6ff0: 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  f( pTab->aCol[i]
7000: 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46  .colFlags & COLF
7010: 4c 41 47 5f 56 49 52 54 55 41 4c 20 29 20 69 43  LAG_VIRTUAL ) iC
7020: 6f 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ol++;.    }.  }.
7030: 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30  #endif.  for(i=0
7040: 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; i<pIdx->nColum
7050: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
7060: 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43   iCol==pIdx->aiC
7070: 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74 75 72  olumn[i] ) retur
7080: 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
7090: 6e 20 2d 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n -1;.}..#ifndef
70a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 4e   SQLITE_OMIT_GEN
70b0: 45 52 41 54 45 44 5f 43 4f 4c 55 4d 4e 53 0a 2f  ERATED_COLUMNS./
70c0: 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 69 43 6f 6c  *.** Of the iCol
70d0: 2d 74 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  -th column in ta
70e0: 62 6c 65 20 70 54 61 62 2c 20 72 65 74 75 72 6e  ble pTab, return
70f0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
7100: 61 74 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 61 73 20  at column.** as 
7110: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 2e 20  stored on disk. 
7120: 20 55 73 75 61 6c 6c 79 20 74 68 65 20 72 65 74   Usually the ret
7130: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
7140: 20 73 61 6d 65 20 61 73 20 74 68 65 20 69 43 6f   same as the iCo
7150: 6c 0a 2a 2a 20 69 6e 70 75 74 2c 20 68 6f 77 65  l.** input, howe
7160: 76 65 72 20 74 68 65 20 72 65 74 75 72 6e 20 76  ver the return v
7170: 61 6c 75 65 20 6d 61 79 20 62 65 20 6c 65 73 73  alue may be less
7180: 20 74 68 65 72 65 20 61 72 65 20 70 72 69 6f 72   there are prior
7190: 20 56 49 52 54 55 41 4c 0a 2a 2a 20 63 6f 6c 75   VIRTUAL.** colu
71a0: 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  mns..**.** If SQ
71b0: 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 4e 45 52 41  LITE_OMIT_GENERA
71c0: 54 45 44 5f 43 4f 4c 55 4d 4e 53 2c 20 74 68 69  TED_COLUMNS, thi
71d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
71e0: 6f 2d 6f 70 20 6d 61 63 72 6f 0a 2a 2f 0a 69 31  o-op macro.*/.i1
71f0: 36 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  6 sqlite3ColumnO
7200: 66 54 61 62 6c 65 28 54 61 62 6c 65 20 2a 70 54  fTable(Table *pT
7210: 61 62 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20  ab, i16 iCol){. 
7220: 20 69 6e 74 20 69 3b 0a 20 20 69 31 36 20 6e 3b   int i;.  i16 n;
7230: 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3c  .  assert( iCol<
7240: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
7250: 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
7260: 61 67 73 20 26 20 54 46 5f 48 61 73 56 69 72 74  ags & TF_HasVirt
7270: 75 61 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ual)==0 ) return
7280: 20 69 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30   iCol;.  for(i=0
7290: 2c 20 6e 3d 30 3b 20 69 3c 69 43 6f 6c 3b 20 69  , n=0; i<iCol; i
72a0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54  ++){.    if( (pT
72b0: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46  ab->aCol[i].colF
72c0: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 56  lags & COLFLAG_V
72d0: 49 52 54 55 41 4c 29 3d 3d 30 20 29 20 6e 2b 2b  IRTUAL)==0 ) n++
72e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
72f0: 3b 20 20 20 20 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;    .}.#endif..
7300: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73  /*.** Begin cons
7310: 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74  tructing a new t
7320: 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74  able representat
7330: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  ion in memory.  
7340: 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66  This is.** the f
7350: 69 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20  irst of several 
7360: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
7370: 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20  that get called 
7380: 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74  in response.** t
7390: 6f 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  o a CREATE TABLE
73a0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20   statement.  In 
73b0: 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73  particular, this
73c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
73d0: 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69  ed.** after seei
73e0: 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54  ng tokens "CREAT
73f0: 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61  E" and "TABLE" a
7400: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  nd the table nam
7410: 65 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a  e. The isTemp.**
7420: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
7430: 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c   the table shoul
7440: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
7450: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
7460: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e  abase.** file in
7470: 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20  stead of in the 
7480: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
7490: 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  le.  This is nor
74a0: 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a  mally the case.*
74b0: 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50  * when the "TEMP
74c0: 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22  " or "TEMPORARY"
74d0: 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20   keyword occurs 
74e0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52  in between.** CR
74f0: 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a  EATE and TABLE..
7500: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61  **.** The new ta
7510: 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e  ble record is in
7520: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75  itialized and pu
7530: 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  t in pParse->pNe
7540: 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f  wTable..** As mo
7550: 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  re of the CREATE
7560: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
7570: 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69   is parsed, addi
7580: 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a  tional action.**
7590: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62   routines will b
75a0: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20  e called to add 
75b0: 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
75c0: 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e   to this record.
75d0: 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
75e0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
75f0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  LE statement, th
7600: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
7610: 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  e() routine.** i
7620: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70  s called to comp
7630: 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75  lete the constru
7640: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77  ction of the new
7650: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a   table record..*
7660: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74  /.void sqlite3St
7670: 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73  artTable(.  Pars
7680: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
7690: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
76a0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
76b0: 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61  1,   /* First pa
76c0: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
76d0: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
76e0: 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
76f0: 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63  pName2,   /* Sec
7700: 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ond part of the 
7710: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
7720: 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69  e or view */.  i
7730: 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
7740: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
7750: 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20  is a TEMP table 
7760: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c  */.  int isView,
7770: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7780: 20 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20   this is a VIEW 
7790: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75  */.  int isVirtu
77a0: 61 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66  al,   /* True if
77b0: 20 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55   this is a VIRTU
77c0: 41 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  AL table */.  in
77d0: 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f  t noErr        /
77e0: 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20  * Do nothing if 
77f0: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
7800: 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ists */.){.  Tab
7810: 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68  le *pTable;.  ch
7820: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f  ar *zName = 0; /
7830: 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * The name of th
7840: 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
7850: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
7860: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
7870: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b  e *v;.  int iDb;
7880: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
7890: 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63  base number to c
78a0: 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  reate the table 
78b0: 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  in */.  Token *p
78c0: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75  Name;    /* Unqu
78d0: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
78e0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65  the table to cre
78f0: 61 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62  ate */..  if( db
7900: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 64  ->init.busy && d
7910: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d  b->init.newTnum=
7920: 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65  =1 ){.    /* Spe
7930: 63 69 61 6c 20 63 61 73 65 3a 20 20 50 61 72 73  cial case:  Pars
7940: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
7950: 61 73 74 65 72 20 6f 72 20 73 71 6c 69 74 65 5f  aster or sqlite_
7960: 74 65 6d 70 5f 6d 61 73 74 65 72 20 73 63 68 65  temp_master sche
7970: 6d 61 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20  ma */.    iDb = 
7980: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20  db->init.iDb;.  
7990: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
79a0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 53 43  3DbStrDup(db, SC
79b0: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29  HEMA_TABLE(iDb))
79c0: 3b 0a 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e  ;.    pName = pN
79d0: 61 6d 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame1;.  }else{. 
79e0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e     /* The common
79f0: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 69 44 62   case */.    iDb
7a00: 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
7a10: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
7a20: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
7a30: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69  Name);.    if( i
7a40: 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
7a50: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
7a60: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26  PDB && isTemp &&
7a70: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20   pName2->n>0 && 
7a80: 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb!=1 ){.      
7a90: 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61  /* If creating a
7aa0: 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65   temp table, the
7ab0: 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65   name may not be
7ac0: 20 71 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65   qualified. Unle
7ad0: 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ss .      ** the
7ae0: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
7af0: 73 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e  s "temp" anyway.
7b00: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
7b10: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7b20: 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61  e, "temporary ta
7b30: 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  ble name must be
7b40: 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a   unqualified");.
7b50: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
7b60: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49    }.    if( !OMI
7b70: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
7b80: 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 20 20  mp ) iDb = 1;.  
7b90: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
7ba0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
7bb0: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b, pName);.    i
7bc0: 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
7bd0: 45 43 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ECT ){.      sql
7be0: 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d  ite3RenameTokenM
7bf0: 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64  ap(pParse, (void
7c00: 2a 29 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 29 3b  *)zName, pName);
7c10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61  .    }.  }.  pPa
7c20: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20  rse->sNameToken 
7c30: 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 66 28 20  = *pName;.  if( 
7c40: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
7c50: 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
7c60: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
7c70: 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 69  pParse, zName, i
7c80: 73 56 69 65 77 3f 22 76 69 65 77 22 3a 22 74 61  sView?"view":"ta
7c90: 62 6c 65 22 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  ble", zName) ){.
7ca0: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
7cb0: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
7cc0: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69    if( db->init.i
7cd0: 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d  Db==1 ) isTemp =
7ce0: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
7cf0: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
7d00: 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20  ATION.  assert( 
7d10: 69 73 54 65 6d 70 3d 3d 30 20 7c 7c 20 69 73 54  isTemp==0 || isT
7d20: 65 6d 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  emp==1 );.  asse
7d30: 72 74 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c  rt( isView==0 ||
7d40: 20 69 73 56 69 65 77 3d 3d 31 20 29 3b 0a 20 20   isView==1 );.  
7d50: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
7d60: 73 74 20 75 38 20 61 43 6f 64 65 5b 5d 20 3d 20  st u8 aCode[] = 
7d70: 7b 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  {.       SQLITE_
7d80: 43 52 45 41 54 45 5f 54 41 42 4c 45 2c 0a 20 20  CREATE_TABLE,.  
7d90: 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41       SQLITE_CREA
7da0: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 2c 0a 20  TE_TEMP_TABLE,. 
7db0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45        SQLITE_CRE
7dc0: 41 54 45 5f 56 49 45 57 2c 0a 20 20 20 20 20 20  ATE_VIEW,.      
7dd0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
7de0: 45 4d 50 5f 56 49 45 57 0a 20 20 20 20 7d 3b 0a  EMP_VIEW.    };.
7df0: 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20      char *zDb = 
7e00: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
7e10: 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  SName;.    if( s
7e20: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
7e30: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
7e40: 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
7e50: 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20  BLE(isTemp), 0, 
7e60: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
7e70: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7e80: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
7e90: 69 66 28 20 21 69 73 56 69 72 74 75 61 6c 20 26  if( !isVirtual &
7ea0: 26 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  & sqlite3AuthChe
7eb0: 63 6b 28 70 50 61 72 73 65 2c 20 28 69 6e 74 29  ck(pParse, (int)
7ec0: 61 43 6f 64 65 5b 69 73 54 65 6d 70 2b 32 2a 69  aCode[isTemp+2*i
7ed0: 73 56 69 65 77 5d 2c 0a 20 20 20 20 20 20 20 20  sView],.        
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
7f00: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
7f10: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
7f20: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
7f30: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
7f40: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
7f50: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  the new table na
7f60: 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c  me does not coll
7f70: 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73  ide with an exis
7f80: 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
7f90: 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e  or table name in
7fa0: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
7fb0: 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72  se.  Issue an er
7fc0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20  ror message if. 
7fd0: 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54 68 65   ** it does. The
7fe0: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66   exception is if
7ff0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 62   the statement b
8000: 65 69 6e 67 20 70 61 72 73 65 64 20 77 61 73 20  eing parsed was 
8010: 70 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61  passed.  ** to a
8020: 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72  n sqlite3_declar
8030: 65 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e 20 49  e_vtab() call. I
8040: 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79  n that case only
8050: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
8060: 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70 65 73  s.  ** and types
8070: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 73   will be used, s
8080: 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  o there is no ne
8090: 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6e  ed to test for n
80a0: 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f  amespace.  ** co
80b0: 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  llisions..  */. 
80c0: 20 69 66 28 20 21 49 4e 5f 53 50 45 43 49 41 4c   if( !IN_SPECIAL
80d0: 5f 50 41 52 53 45 20 29 7b 0a 20 20 20 20 63 68  _PARSE ){.    ch
80e0: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
80f0: 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
8100: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
8110: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
8120: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
8130: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
8140: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
8150: 20 20 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20     }.    pTable 
8160: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
8170: 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  le(db, zName, zD
8180: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  b);.    if( pTab
8190: 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  le ){.      if( 
81a0: 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20  !noErr ){.      
81b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
81c0: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
81d0: 20 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73   %T already exis
81e0: 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  ts", pName);.   
81f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8200: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
8210: 6e 69 74 2e 62 75 73 79 20 7c 7c 20 43 4f 52 52  nit.busy || CORR
8220: 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20  UPT_DB );.      
8230: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
8240: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
8250: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a  , iDb);.      }.
8260: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
8270: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
8280: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
8290: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
82a0: 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20   zName, zDb)!=0 
82b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
82c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
82d0: 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
82e0: 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65  dy an index name
82f0: 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
8300: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
8310: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
8320: 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65   }.  }..  pTable
8330: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8340: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
8350: 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28  f(Table));.  if(
8360: 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20   pTable==0 ){.  
8370: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
8380: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
8390: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
83a0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
83b0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
83c0: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62  rr++;.    goto b
83d0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
83e0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e  ;.  }.  pTable->
83f0: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
8400: 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d   pTable->iPKey =
8410: 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70   -1;.  pTable->p
8420: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
8430: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  [iDb].pSchema;. 
8440: 20 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66   pTable->nTabRef
8450: 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 1;.#ifdef SQL
8460: 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45  ITE_DEFAULT_ROWE
8470: 53 54 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f  ST.  pTable->nRo
8480: 77 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69 74 65  wLogEst = sqlite
8490: 33 4c 6f 67 45 73 74 28 53 51 4c 49 54 45 5f 44  3LogEst(SQLITE_D
84a0: 45 46 41 55 4c 54 5f 52 4f 57 45 53 54 29 3b 0a  EFAULT_ROWEST);.
84b0: 23 65 6c 73 65 0a 20 20 70 54 61 62 6c 65 2d 3e  #else.  pTable->
84c0: 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30  nRowLogEst = 200
84d0: 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73  ; assert( 200==s
84e0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34  qlite3LogEst(104
84f0: 38 35 37 36 29 20 29 3b 0a 23 65 6e 64 69 66 0a  8576) );.#endif.
8500: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
8510: 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29  ->pNewTable==0 )
8520: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  ;.  pParse->pNew
8530: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
8540: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
8550: 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74   the magic sqlit
8560: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
8570: 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63   used by autoinc
8580: 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65  rement,.  ** the
8590: 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74  n record a point
85a0: 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  er to this table
85b0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
85c0: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a  abase structure.
85d0: 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53    ** so that INS
85e0: 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65  ERT can find the
85f0: 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20   table easily.. 
8600: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
8610: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
8620: 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61  EMENT.  if( !pPa
8630: 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73  rse->nested && s
8640: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  trcmp(zName, "sq
8650: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d  lite_sequence")=
8660: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
8670: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
8680: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
8690: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 54 61 62  , 0) );.    pTab
86a0: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  le->pSchema->pSe
86b0: 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20  qTab = pTable;. 
86c0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
86d0: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
86e0: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
86f0: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
8700: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
8710: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
8720: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
8730: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
8740: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
8750: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
8760: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
8770: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
8780: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
8790: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
87a0: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
87b0: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
87c0: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
87d0: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
87e0: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
87f0: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
8800: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
8810: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
8820: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
8830: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
8840: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
8850: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
8860: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
8870: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
8880: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
8890: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
88a0: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
88b0: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
88c0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  0 ){.    int add
88d0: 72 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65  r1;.    int file
88e0: 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20  Format;.    int 
88f0: 72 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33  reg1, reg2, reg3
8900: 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c 6c 52 6f 77  ;.    /* nullRow
8910: 5b 5d 20 69 73 20 61 6e 20 4f 50 5f 52 65 63 6f  [] is an OP_Reco
8920: 72 64 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61  rd encoding of a
8930: 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
8940: 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20 20 20 20 73  5 NULLs */.    s
8950: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
8960: 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d 20 7b 20 36   nullRow[] = { 6
8970: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20  , 0, 0, 0, 0, 0 
8980: 7d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  };.    sqlite3Be
8990: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
89a0: 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
89b0: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
89c0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
89d0: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56  ABLE.    if( isV
89e0: 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20  irtual ){.      
89f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8a00: 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b  0(v, OP_VBegin);
8a10: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
8a20: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
8a30: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63  e format and enc
8a40: 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74  oding in the dat
8a50: 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62  abase have not b
8a60: 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a  een set, .    **
8a70: 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20   set them now.. 
8a80: 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d     */.    reg1 =
8a90: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
8aa0: 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
8ab0: 65 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70  em;.    reg2 = p
8ac0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d  Parse->regRoot =
8ad0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
8ae0: 0a 20 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50  .    reg3 = ++pP
8af0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
8b00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8b10: 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b  3(v, OP_ReadCook
8b20: 69 65 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42  ie, iDb, reg3, B
8b30: 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  TREE_FILE_FORMAT
8b40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8b50: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
8b60: 44 62 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d  Db);.    addr1 =
8b70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8b80: 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p1(v, OP_If, reg
8b90: 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  3); VdbeCoverage
8ba0: 28 76 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72  (v);.    fileFor
8bb0: 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mat = (db->flags
8bc0: 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79   & SQLITE_Legacy
8bd0: 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20  FileFmt)!=0 ?.  
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bf0: 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  1 : SQLITE_MAX_F
8c00: 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20  ILE_FORMAT;.    
8c10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8c20: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
8c30: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49  e, iDb, BTREE_FI
8c40: 4c 45 5f 46 4f 52 4d 41 54 2c 20 66 69 6c 65 46  LE_FORMAT, fileF
8c50: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69  ormat);.    sqli
8c60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8c70: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
8c80: 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f 45  Db, BTREE_TEXT_E
8c90: 4e 43 4f 44 49 4e 47 2c 20 45 4e 43 28 64 62 29  NCODING, ENC(db)
8ca0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8cb0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
8cc0: 64 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  dr1);..    /* Th
8cd0: 69 73 20 6a 75 73 74 20 63 72 65 61 74 65 73 20  is just creates 
8ce0: 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72  a place-holder r
8cf0: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c  ecord in the sql
8d00: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
8d10: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  ..    ** The rec
8d20: 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f 65 73  ord created does
8d30: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79   not contain any
8d40: 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77  thing yet.  It w
8d50: 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a  ill be replaced.
8d60: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65      ** by the re
8d70: 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65  al entry in code
8d80: 20 67 65 6e 65 72 61 74 65 64 20 61 74 20 73 71   generated at sq
8d90: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e  lite3EndTable().
8da0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
8db0: 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
8dc0: 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65   new entry is le
8dd0: 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 70  ft in register p
8de0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e  Parse->regRowid.
8df0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74  .    ** The root
8e00: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
8e10: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 69 73  the new table is
8e20: 20 6c 65 66 74 20 69 6e 20 72 65 67 20 70 50 61   left in reg pPa
8e30: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20  rse->regRoot..  
8e40: 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 61    ** The rowid a
8e50: 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  nd root page num
8e60: 62 65 72 20 76 61 6c 75 65 73 20 61 72 65 20 6e  ber values are n
8e70: 65 65 64 65 64 20 62 79 20 74 68 65 20 63 6f 64  eeded by the cod
8e80: 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 73 71  e that.    ** sq
8e90: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69  lite3EndTable wi
8ea0: 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20  ll generate..   
8eb0: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
8ec0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
8ed0: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
8ee0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
8ef0: 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28  ALTABLE).    if(
8f00: 20 69 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72   isView || isVir
8f10: 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  tual ){.      sq
8f20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8f30: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
8f40: 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c  , reg2);.    }el
8f50: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
8f60: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 64        pParse->ad
8f70: 64 72 43 72 54 61 62 20 3d 0a 20 20 20 20 20 20  drCrTab =.      
8f80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8f90: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74  dOp3(v, OP_Creat
8fa0: 65 42 74 72 65 65 2c 20 69 44 62 2c 20 72 65 67  eBtree, iDb, reg
8fb0: 32 2c 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 29  2, BTREE_INTKEY)
8fc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
8fd0: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
8fe0: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  le(pParse, iDb);
8ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9000: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
9010: 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b  Rowid, 0, reg1);
9020: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9030: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f  AddOp4(v, OP_Blo
9040: 62 2c 20 36 2c 20 72 65 67 33 2c 20 30 2c 20 6e  b, 6, reg3, 0, n
9050: 75 6c 6c 52 6f 77 2c 20 50 34 5f 53 54 41 54 49  ullRow, P4_STATI
9060: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  C);.    sqlite3V
9070: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
9080: 49 6e 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c  Insert, 0, reg3,
9090: 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69   reg1);.    sqli
90a0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
90b0: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
90c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
90d0: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43  beAddOp0(v, OP_C
90e0: 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lose);.  }..  /*
90f0: 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72   Normal (non-err
9100: 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20  or) return. */. 
9110: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49   return;..  /* I
9120: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
9130: 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20  s, we jump here 
9140: 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  */.begin_table_e
9150: 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44  rror:.  sqlite3D
9160: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
9170: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
9180: 2a 20 53 65 74 20 70 72 6f 70 65 72 74 69 65 73  * Set properties
9190: 20 6f 66 20 61 20 74 61 62 6c 65 20 63 6f 6c 75   of a table colu
91a0: 6d 6e 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  mn based on the 
91b0: 28 6d 61 67 69 63 61 6c 29 0a 2a 2a 20 6e 61 6d  (magical).** nam
91c0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  e of the column.
91d0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .*/.#if SQLITE_E
91e0: 4e 41 42 4c 45 5f 48 49 44 44 45 4e 5f 43 4f 4c  NABLE_HIDDEN_COL
91f0: 55 4d 4e 53 0a 76 6f 69 64 20 73 71 6c 69 74 65  UMNS.void sqlite
9200: 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65  3ColumnPropertie
9210: 73 46 72 6f 6d 4e 61 6d 65 28 54 61 62 6c 65 20  sFromName(Table 
9220: 2a 70 54 61 62 2c 20 43 6f 6c 75 6d 6e 20 2a 70  *pTab, Column *p
9230: 43 6f 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  Col){.  if( sqli
9240: 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 70 43 6f  te3_strnicmp(pCo
9250: 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 5f 5f 68 69 64  l->zName, "__hid
9260: 64 65 6e 5f 5f 22 2c 20 31 30 29 3d 3d 30 20 29  den__", 10)==0 )
9270: 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46  {.    pCol->colF
9280: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
9290: 48 49 44 44 45 4e 3b 0a 20 20 7d 65 6c 73 65 20  HIDDEN;.  }else 
92a0: 69 66 28 20 70 54 61 62 20 26 26 20 70 43 6f 6c  if( pTab && pCol
92b0: 21 3d 70 54 61 62 2d 3e 61 43 6f 6c 20 26 26 20  !=pTab->aCol && 
92c0: 28 70 43 6f 6c 5b 2d 31 5d 2e 63 6f 6c 46 6c 61  (pCol[-1].colFla
92d0: 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44  gs & COLFLAG_HID
92e0: 44 45 4e 29 20 29 7b 0a 20 20 20 20 70 54 61 62  DEN) ){.    pTab
92f0: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
9300: 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a 20 20 7d 0a  _OOOHidden;.  }.
9310: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
9320: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
9330: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
9340: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
9350: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a  onstructed..**.*
9360: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
9370: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
9380: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f  once for each co
9390: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
93a0: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
93b0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
93c0: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
93d0: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
93e0: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
93f0: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
9400: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
9410: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
9420: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
9430: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9440: 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20  AddColumn(Parse 
9450: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
9460: 70 4e 61 6d 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  pName, Token *pT
9470: 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ype){.  Table *p
9480: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
9490: 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 54  r *z;.  char *zT
94a0: 79 70 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  ype;.  Column *p
94b0: 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Col;.  sqlite3 *
94c0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
94d0: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
94e0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
94f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
9500: 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e  ( p->nCol+1>db->
9510: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
9520: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
9530: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9540: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
9550: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20  many columns on 
9560: 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  %s", p->zName);.
9570: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
9580: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    z = sqlite3DbM
9590: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 4e 61  allocRaw(db, pNa
95a0: 6d 65 2d 3e 6e 20 2b 20 70 54 79 70 65 2d 3e 6e  me->n + pType->n
95b0: 20 2b 20 32 29 3b 0a 20 20 69 66 28 20 7a 3d 3d   + 2);.  if( z==
95c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
95d0: 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
95e0: 43 54 20 29 20 73 71 6c 69 74 65 33 52 65 6e 61  CT ) sqlite3Rena
95f0: 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73  meTokenMap(pPars
9600: 65 2c 20 28 76 6f 69 64 2a 29 7a 2c 20 70 4e 61  e, (void*)z, pNa
9610: 6d 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  me);.  memcpy(z,
9620: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
9630: 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 4e 61 6d 65 2d  ->n);.  z[pName-
9640: 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >n] = 0;.  sqlit
9650: 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20  e3Dequote(z);.  
9660: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
9670: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
9680: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
9690: 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  p(z, p->aCol[i].
96a0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
96b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
96c0: 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c  sg(pParse, "dupl
96d0: 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  icate column nam
96e0: 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  e: %s", z);.    
96f0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9700: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65  db, z);.      re
9710: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
9720: 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26    if( (p->nCol &
9730: 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   0x7)==0 ){.    
9740: 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20  Column *aNew;.  
9750: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    aNew = sqlite3
9760: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e  DbRealloc(db,p->
9770: 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29  aCol,(p->nCol+8)
9780: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b  *sizeof(p->aCol[
9790: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  0]));.    if( aN
97a0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
97b0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
97c0: 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   z);.      retur
97d0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  n;.    }.    p->
97e0: 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d  aCol = aNew;.  }
97f0: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
9800: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d  ol[p->nCol];.  m
9810: 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73  emset(pCol, 0, s
9820: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
9830: 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  ));.  pCol->zNam
9840: 65 20 3d 20 7a 3b 0a 20 20 73 71 6c 69 74 65 33  e = z;.  sqlite3
9850: 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73  ColumnProperties
9860: 46 72 6f 6d 4e 61 6d 65 28 70 2c 20 70 43 6f 6c  FromName(p, pCol
9870: 29 3b 0a 20 0a 20 20 69 66 28 20 70 54 79 70 65  );. .  if( pType
9880: 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ->n==0 ){.    /*
9890: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
98a0: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
98b0: 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65  columns have the
98c0: 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74   default affinit
98d0: 79 0a 20 20 20 20 2a 2a 20 27 42 4c 4f 42 27 20  y.    ** 'BLOB' 
98e0: 77 69 74 68 20 61 20 64 65 66 61 75 6c 74 20 73  with a default s
98f0: 69 7a 65 20 6f 66 20 34 20 62 79 74 65 73 2e 20  ize of 4 bytes. 
9900: 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66  */.    pCol->aff
9910: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
9920: 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f  FF_BLOB;.    pCo
9930: 6c 2d 3e 73 7a 45 73 74 20 3d 20 31 3b 0a 23 69  l->szEst = 1;.#i
9940: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
9950: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
9960: 4e 43 45 53 0a 20 20 20 20 69 66 28 20 34 3e 3d  NCES.    if( 4>=
9970: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
9980: 66 69 67 2e 73 7a 53 6f 72 74 65 72 52 65 66 20  fig.szSorterRef 
9990: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63  ){.      pCol->c
99a0: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
99b0: 41 47 5f 53 4f 52 54 45 52 52 45 46 3b 0a 20 20  AG_SORTERREF;.  
99c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c    }.#endif.  }el
99d0: 73 65 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20  se{.    zType = 
99e0: 7a 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65  z + sqlite3Strle
99f0: 6e 33 30 28 7a 29 20 2b 20 31 3b 0a 20 20 20 20  n30(z) + 1;.    
9a00: 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20 70 54  memcpy(zType, pT
9a10: 79 70 65 2d 3e 7a 2c 20 70 54 79 70 65 2d 3e 6e  ype->z, pType->n
9a20: 29 3b 0a 20 20 20 20 7a 54 79 70 65 5b 70 54 79  );.    zType[pTy
9a30: 70 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  pe->n] = 0;.    
9a40: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
9a50: 54 79 70 65 29 3b 0a 20 20 20 20 70 43 6f 6c 2d  Type);.    pCol-
9a60: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
9a70: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
9a80: 7a 54 79 70 65 2c 20 70 43 6f 6c 29 3b 0a 20 20  zType, pCol);.  
9a90: 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
9aa0: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54   |= COLFLAG_HAST
9ab0: 59 50 45 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43  YPE;.  }.  p->nC
9ac0: 6f 6c 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e  ol++;.  pParse->
9ad0: 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e  constraintName.n
9ae0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
9af0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
9b00: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
9b10: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
9b20: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
9b30: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
9b40: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
9b50: 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   A "NOT NULL" co
9b60: 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20  nstraint has.** 
9b70: 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63  been seen on a c
9b80: 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75  olumn.  This rou
9b90: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f  tine sets the no
9ba0: 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a  tNull flag on.**
9bb0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72   the column curr
9bc0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
9bd0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
9be0: 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e  d sqlite3AddNotN
9bf0: 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73  ull(Parse *pPars
9c00: 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  e, int onError){
9c10: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
9c20: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 70  olumn *pCol;.  p
9c30: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
9c40: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
9c50: 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f   || NEVER(p->nCo
9c60: 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  l<1) ) return;. 
9c70: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
9c80: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 70  [p->nCol-1];.  p
9c90: 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 3d 20 28  Col->notNull = (
9ca0: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 2d  u8)onError;.  p-
9cb0: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
9cc0: 48 61 73 4e 6f 74 4e 75 6c 6c 3b 0a 0a 20 20 2f  HasNotNull;..  /
9cd0: 2a 20 53 65 74 20 74 68 65 20 75 6e 69 71 4e 6f  * Set the uniqNo
9ce0: 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 20 61 6e  tNull flag on an
9cf0: 79 20 55 4e 49 51 55 45 20 6f 72 20 50 4b 20 69  y UNIQUE or PK i
9d00: 6e 64 65 78 65 73 20 61 6c 72 65 61 64 79 20 63  ndexes already c
9d10: 72 65 61 74 65 64 0a 20 20 2a 2a 20 6f 6e 20 74  reated.  ** on t
9d20: 68 69 73 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a  his column.  */.
9d30: 20 20 69 66 28 20 70 43 6f 6c 2d 3e 63 6f 6c 46    if( pCol->colF
9d40: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 55  lags & COLFLAG_U
9d50: 4e 49 51 55 45 20 29 7b 0a 20 20 20 20 49 6e 64  NIQUE ){.    Ind
9d60: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
9d70: 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78  r(pIdx=p->pIndex
9d80: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
9d90: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
9da0: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
9db0: 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20 70 49 64  KeyCol==1 && pId
9dc0: 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
9dd0: 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  one );.      if(
9de0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
9df0: 30 5d 3d 3d 70 2d 3e 6e 43 6f 6c 2d 31 20 29 7b  0]==p->nCol-1 ){
9e00: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 75  .        pIdx->u
9e10: 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a  niqNotNull = 1;.
9e20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9e30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  }.}../*.** Scan 
9e40: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
9e50: 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67  name zType (leng
9e60: 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65  th nType) and re
9e70: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f  turn the.** asso
9e80: 63 69 61 74 65 64 20 61 66 66 69 6e 69 74 79 20  ciated affinity 
9e90: 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  type..**.** This
9ea0: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20   routine does a 
9eb0: 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74  case-independent
9ec0: 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65   search of zType
9ed0: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62   for the .** sub
9ee0: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66  strings in the f
9ef0: 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20  ollowing table. 
9f00: 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  If one of the su
9f10: 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66  bstrings is.** f
9f20: 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73  ound, the corres
9f30: 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79  ponding affinity
9f40: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
9f50: 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a   zType contains.
9f60: 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ** more than one
9f70: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
9f80: 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61  gs, entries towa
9f90: 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a  rd the top of .*
9fa0: 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65  * the table take
9fb0: 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65   priority. For e
9fc0: 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65  xample, if zType
9fd0: 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a   is 'BLOBINT', .
9fe0: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  ** SQLITE_AFF_IN
9ff0: 54 45 47 45 52 20 69 73 20 72 65 74 75 72 6e 65  TEGER is returne
a000: 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69  d..**.** Substri
a010: 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74  ng     | Affinit
a020: 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  y.** -----------
a030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a040: 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20  -----.** 'INT'  
a050: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
a060: 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27  AFF_INTEGER.** '
a070: 43 48 41 52 27 20 20 20 20 20 20 20 20 7c 20 53  CHAR'        | S
a080: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
a090: 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20  * 'CLOB'        
a0a0: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
a0b0: 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20  T.** 'TEXT'     
a0c0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
a0d0: 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20  TEXT.** 'BLOB'  
a0e0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
a0f0: 46 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52 45 41 4c  FF_BLOB.** 'REAL
a100: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
a110: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46  E_AFF_REAL.** 'F
a120: 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOA'        | SQ
a130: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
a140: 20 27 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c   'DOUB'        |
a150: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
a160: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f  .**.** If none o
a170: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
a180: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61   in the above ta
a190: 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a  ble are found,.*
a1a0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  * SQLITE_AFF_NUM
a1b0: 45 52 49 43 20 69 73 20 72 65 74 75 72 6e 65 64  ERIC is returned
a1c0: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
a1d0: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f  3AffinityType(co
a1e0: 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20 43  nst char *zIn, C
a1f0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20  olumn *pCol){.  
a200: 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61  u32 h = 0;.  cha
a210: 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41  r aff = SQLITE_A
a220: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f  FF_NUMERIC;.  co
a230: 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72 20  nst char *zChar 
a240: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
a250: 7a 49 6e 21 3d 30 20 29 3b 0a 20 20 77 68 69 6c  zIn!=0 );.  whil
a260: 65 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20  e( zIn[0] ){.   
a270: 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71   h = (h<<8) + sq
a280: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
a290: 72 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a  r[(*zIn)&0xff];.
a2a0: 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69      zIn++;.    i
a2b0: 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29  f( h==(('c'<<24)
a2c0: 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c  +('h'<<16)+('a'<
a2d0: 3c 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20  <8)+'r') ){     
a2e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20          /* CHAR 
a2f0: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
a300: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
a310: 20 20 20 20 20 20 7a 43 68 61 72 20 3d 20 7a 49        zChar = zI
a320: 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  n;.    }else if(
a330: 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28   h==(('c'<<24)+(
a340: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
a350: 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20  )+'b') ){       
a360: 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20  /* CLOB */.     
a370: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
a380: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
a390: 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c  e if( h==(('t'<<
a3a0: 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27  24)+('e'<<16)+('
a3b0: 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20  x'<<8)+'t') ){  
a3c0: 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a       /* TEXT */.
a3d0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
a3e0: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
a3f0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
a400: 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'b'<<24)+('l'<<1
a410: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29  6)+('o'<<8)+'b')
a420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f            /* BLO
a430: 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  B */.        && 
a440: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
a450: 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d  _NUMERIC || aff=
a460: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
a470: 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  ) ){.      aff =
a480: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
a490: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b  ;.      if( zIn[
a4a0: 30 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61 72 20  0]=='(' ) zChar 
a4b0: 3d 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53  = zIn;.#ifndef S
a4c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
a4d0: 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65  ING_POINT.    }e
a4e0: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27  lse if( h==(('r'
a4f0: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
a500: 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20  ('a'<<8)+'l')   
a510: 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a         /* REAL *
a520: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
a530: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
a540: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
a550: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
a560: 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EAL;.    }else i
a570: 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29  f( h==(('f'<<24)
a580: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
a590: 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20  <8)+'a')        
a5a0: 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20    /* FLOA */.   
a5b0: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
a5c0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
a5d0: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
a5e0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
a5f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
a600: 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27  =(('d'<<24)+('o'
a610: 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27  <<16)+('u'<<8)+'
a620: 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b')          /* 
a630: 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20  DOUB */.        
a640: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
a650: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
a660: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
a670: 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69  _AFF_REAL;.#endi
a680: 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  f.    }else if( 
a690: 28 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d  (h&0x00FFFFFF)==
a6a0: 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c  (('i'<<16)+('n'<
a6b0: 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f  <8)+'t') ){    /
a6c0: 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61  * INT */.      a
a6d0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
a6e0: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62  INTEGER;.      b
a6f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
a700: 0a 20 20 2f 2a 20 49 66 20 70 43 6f 6c 20 69 73  .  /* If pCol is
a710: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f 72 65   not NULL, store
a720: 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
a730: 74 68 65 20 66 69 65 6c 64 20 73 69 7a 65 2e 20  the field size. 
a740: 20 54 68 65 0a 20 20 2a 2a 20 65 73 74 69 6d 61   The.  ** estima
a750: 74 65 20 69 73 20 73 63 61 6c 65 64 20 73 6f 20  te is scaled so 
a760: 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
a770: 20 61 6e 20 69 6e 74 65 67 65 72 20 69 73 20 31   an integer is 1
a780: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c  .  */.  if( pCol
a790: 20 29 7b 0a 20 20 20 20 69 6e 74 20 76 20 3d 20   ){.    int v = 
a7a0: 30 3b 20 20 20 2f 2a 20 64 65 66 61 75 6c 74 20  0;   /* default 
a7b0: 73 69 7a 65 20 69 73 20 61 70 70 72 6f 78 20 34  size is approx 4
a7c0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 66   bytes */.    if
a7d0: 28 20 61 66 66 3c 53 51 4c 49 54 45 5f 41 46 46  ( aff<SQLITE_AFF
a7e0: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
a7f0: 20 20 69 66 28 20 7a 43 68 61 72 20 29 7b 0a 20    if( zChar ){. 
a800: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 43         while( zC
a810: 68 61 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  har[0] ){.      
a820: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
a830: 73 64 69 67 69 74 28 7a 43 68 61 72 5b 30 5d 29  sdigit(zChar[0])
a840: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a850: 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52 43  /* BLOB(k), VARC
a860: 48 41 52 28 6b 29 2c 20 43 48 41 52 28 6b 29 20  HAR(k), CHAR(k) 
a870: 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a  -> r=(k/4+1) */.
a880: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a890: 74 65 33 47 65 74 49 6e 74 33 32 28 7a 43 68 61  te3GetInt32(zCha
a8a0: 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20  r, &v);.        
a8b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a8c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
a8d0: 20 7a 43 68 61 72 2b 2b 3b 0a 20 20 20 20 20 20   zChar++;.      
a8e0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
a8f0: 0a 20 20 20 20 20 20 20 20 76 20 3d 20 31 36 3b  .        v = 16;
a900: 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54     /* BLOB, TEXT
a910: 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28  , CLOB -> r=5  (
a920: 61 70 70 72 6f 78 20 32 30 20 62 79 74 65 73 29  approx 20 bytes)
a930: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
a940: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
a950: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
a960: 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
a970: 76 3e 3d 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  v>=sqlite3Global
a980: 43 6f 6e 66 69 67 2e 73 7a 53 6f 72 74 65 72 52  Config.szSorterR
a990: 65 66 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  ef ){.      pCol
a9a0: 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f  ->colFlags |= CO
a9b0: 4c 46 4c 41 47 5f 53 4f 52 54 45 52 52 45 46 3b  LFLAG_SORTERREF;
a9c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
a9d0: 20 20 76 20 3d 20 76 2f 34 20 2b 20 31 3b 0a 20    v = v/4 + 1;. 
a9e0: 20 20 20 69 66 28 20 76 3e 32 35 35 20 29 20 76     if( v>255 ) v
a9f0: 20 3d 20 32 35 35 3b 0a 20 20 20 20 70 43 6f 6c   = 255;.    pCol
aa00: 2d 3e 73 7a 45 73 74 20 3d 20 76 3b 0a 20 20 7d  ->szEst = v;.  }
aa10: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
aa20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72  ../*.** The expr
aa30: 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65  ession is the de
aa40: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
aa50: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
aa60: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a  y added column.*
aa70: 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  * of the table c
aa80: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
aa90: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  onstruction..**.
aaa0: 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65  ** Default value
aab0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
aac0: 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20  t be constant.  
aad0: 52 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69  Raise an excepti
aae0: 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  on if this.** is
aaf0: 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a   not the case..*
ab00: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ab10: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
ab20: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
ab30: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
ab40: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
ab50: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
ab60: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
ab70: 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56  lite3AddDefaultV
ab80: 61 6c 75 65 28 0a 20 20 50 61 72 73 65 20 2a 70  alue(.  Parse *p
ab90: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
aba0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
abb0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
abc0: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
abd0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20    /* The parsed 
abe0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68  expression of th
abf0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
ac00: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
ac10: 2a 7a 53 74 61 72 74 2c 20 20 20 20 20 20 2f 2a  *zStart,      /*
ac20: 20 53 74 61 72 74 20 6f 66 20 74 68 65 20 64 65   Start of the de
ac30: 66 61 75 6c 74 20 76 61 6c 75 65 20 74 65 78 74  fault value text
ac40: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
ac50: 20 2a 7a 45 6e 64 20 20 20 20 20 20 20 20 20 2f   *zEnd         /
ac60: 2a 20 46 69 72 73 74 20 63 68 61 72 61 63 74 65  * First characte
ac70: 72 20 70 61 73 74 20 65 6e 64 20 6f 66 20 64 65  r past end of de
ac80: 66 61 75 74 20 76 61 6c 75 65 20 74 65 78 74 20  faut value text 
ac90: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
aca0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
acb0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
acc0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
acd0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
ace0: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d  Table;.  if( p!=
acf0: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20  0 ){.    pCol = 
ad00: 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f  &(p->aCol[p->nCo
ad10: 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21  l-1]);.    if( !
ad20: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
ad30: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
ad40: 70 45 78 70 72 2c 20 64 62 2d 3e 69 6e 69 74 2e  pExpr, db->init.
ad50: 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20 73  busy) ){.      s
ad60: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
ad70: 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20  Parse, "default 
ad80: 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20  value of column 
ad90: 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73  [%s] is not cons
ada0: 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20  tant",.         
adb0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
adc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
add0: 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78  /* A copy of pEx
ade0: 70 72 20 69 73 20 75 73 65 64 20 69 6e 73 74 65  pr is used inste
adf0: 61 64 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ad of the origin
ae00: 61 6c 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e  al, as pExpr con
ae10: 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74  tains.      ** t
ae20: 6f 6b 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74  okens that point
ae30: 20 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d   to volatile mem
ae40: 6f 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ory..      */.  
ae50: 20 20 20 20 45 78 70 72 20 78 3b 0a 20 20 20 20      Expr x;.    
ae60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
ae70: 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44  ete(db, pCol->pD
ae80: 66 6c 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  flt);.      mems
ae90: 65 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&x, 0, sizeof
aea0: 28 78 29 29 3b 0a 20 20 20 20 20 20 78 2e 6f 70  (x));.      x.op
aeb0: 20 3d 20 54 4b 5f 53 50 41 4e 3b 0a 20 20 20 20   = TK_SPAN;.    
aec0: 20 20 78 2e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 73    x.u.zToken = s
aed0: 71 6c 69 74 65 33 44 62 53 70 61 6e 44 75 70 28  qlite3DbSpanDup(
aee0: 64 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45 6e 64  db, zStart, zEnd
aef0: 29 3b 0a 20 20 20 20 20 20 78 2e 70 4c 65 66 74  );.      x.pLeft
af00: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
af10: 78 2e 66 6c 61 67 73 20 3d 20 45 50 5f 53 6b 69  x.flags = EP_Ski
af20: 70 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70  p;.      pCol->p
af30: 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Dflt = sqlite3Ex
af40: 70 72 44 75 70 28 64 62 2c 20 26 78 2c 20 45 58  prDup(db, &x, EX
af50: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
af60: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
af70: 65 65 28 64 62 2c 20 78 2e 75 2e 7a 54 6f 6b 65  ee(db, x.u.zToke
af80: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n);.    }.  }.  
af90: 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
afa0: 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c 69  JECT ){.    sqli
afb0: 74 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d  te3RenameExprUnm
afc0: 61 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ap(pParse, pExpr
afd0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
afe0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
aff0: 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
b000: 42 61 63 6b 77 61 72 64 73 20 43 6f 6d 70 61 74  Backwards Compat
b010: 69 62 69 6c 69 74 79 20 48 61 63 6b 3a 0a 2a 2a  ibility Hack:.**
b020: 20 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 20   .** Historical 
b030: 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
b040: 74 65 20 61 63 63 65 70 74 65 64 20 73 74 72 69  te accepted stri
b050: 6e 67 73 20 61 73 20 63 6f 6c 75 6d 6e 20 6e 61  ngs as column na
b060: 6d 65 73 20 69 6e 0a 2a 2a 20 69 6e 64 65 78 65  mes in.** indexe
b070: 73 20 61 6e 64 20 50 52 49 4d 41 52 59 20 4b 45  s and PRIMARY KE
b080: 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e  Y constraints an
b090: 64 20 69 6e 20 55 4e 49 51 55 45 20 63 6f 6e 73  d in UNIQUE cons
b0a0: 74 72 61 69 6e 74 73 2e 20 20 45 78 61 6d 70 6c  traints.  Exampl
b0b0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45  e:.**.**     CRE
b0c0: 41 54 45 20 54 41 42 4c 45 20 78 79 7a 28 61 2c  ATE TABLE xyz(a,
b0d0: 62 2c 63 2c 64 2c 65 2c 50 52 49 4d 41 52 59 20  b,c,d,e,PRIMARY 
b0e0: 4b 45 59 28 27 61 27 29 2c 55 4e 49 51 55 45 28  KEY('a'),UNIQUE(
b0f0: 27 62 27 2c 27 63 27 20 43 4f 4c 4c 41 54 45 20  'b','c' COLLATE 
b100: 74 72 69 6d 29 0a 2a 2a 20 20 20 20 20 43 52 45  trim).**     CRE
b110: 41 54 45 20 49 4e 44 45 58 20 61 62 63 20 4f 4e  ATE INDEX abc ON
b120: 20 78 79 7a 28 27 63 27 2c 27 64 27 20 44 45 53   xyz('c','d' DES
b130: 43 2c 27 65 27 20 43 4f 4c 4c 41 54 45 20 6e 6f  C,'e' COLLATE no
b140: 63 61 73 65 20 44 45 53 43 29 3b 0a 2a 2a 0a 2a  case DESC);.**.*
b150: 2a 20 54 68 69 73 20 69 73 20 67 6f 6f 66 79 2e  * This is goofy.
b160: 20 20 42 75 74 20 74 6f 20 70 72 65 73 65 72 76    But to preserv
b170: 65 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  e backwards comp
b180: 61 74 69 62 69 6c 69 74 79 20 77 65 20 63 6f 6e  atibility we con
b190: 74 69 6e 75 65 20 74 6f 0a 2a 2a 20 61 63 63 65  tinue to.** acce
b1a0: 70 74 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75  pt it.  This rou
b1b0: 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 6e 65  tine does the ne
b1c0: 63 65 73 73 61 72 79 20 63 6f 6e 76 65 72 73 69  cessary conversi
b1d0: 6f 6e 2e 20 20 49 74 20 63 6f 6e 76 65 72 74 73  on.  It converts
b1e0: 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69  .** the expressi
b1f0: 6f 6e 20 67 69 76 65 6e 20 69 6e 20 69 74 73 20  on given in its 
b200: 61 72 67 75 6d 65 6e 74 20 66 72 6f 6d 20 61 20  argument from a 
b210: 54 4b 5f 53 54 52 49 4e 47 20 69 6e 74 6f 20 61  TK_STRING into a
b220: 20 54 4b 5f 49 44 0a 2a 2a 20 69 66 20 74 68 65   TK_ID.** if the
b230: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6a   expression is j
b240: 75 73 74 20 61 20 54 4b 5f 53 54 52 49 4e 47 20  ust a TK_STRING 
b250: 77 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e 61 6c  with an optional
b260: 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 2e   COLLATE clause.
b270: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
b280: 73 73 69 6f 6e 20 69 73 20 61 6e 79 74 68 69 6e  ssion is anythin
b290: 67 20 6f 74 68 65 72 20 74 68 61 6e 20 54 4b 5f  g other than TK_
b2a0: 53 54 52 49 4e 47 2c 20 74 68 65 20 65 78 70 72  STRING, the expr
b2b0: 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e 63  ession is.** unc
b2c0: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  hanged..*/.stati
b2d0: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74  c void sqlite3St
b2e0: 72 69 6e 67 54 6f 49 64 28 45 78 70 72 20 2a 70  ringToId(Expr *p
b2f0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  ){.  if( p->op==
b300: 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20  TK_STRING ){.   
b310: 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a   p->op = TK_ID;.
b320: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f    }else if( p->o
b330: 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26  p==TK_COLLATE &&
b340: 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   p->pLeft->op==T
b350: 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20  K_STRING ){.    
b360: 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d 20 54  p->pLeft->op = T
b370: 4b 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  K_ID;.  }.}../*.
b380: 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65  ** Designate the
b390: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72   PRIMARY KEY for
b3a0: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69   the table.  pLi
b3b0: 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
b3c0: 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c  names .** of col
b3d0: 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74  umns that form t
b3e0: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  he primary key. 
b3f0: 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c   If pList is NUL
b400: 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d  L, then the.** m
b410: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
b420: 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ed column of the
b430: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72   table is the pr
b440: 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  imary key..**.**
b450: 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76   A table can hav
b460: 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72  e at most one pr
b470: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74  imary key.  If t
b480: 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
b490: 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72   has.** a primar
b4a0: 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20  y key (and this 
b4b0: 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72  is the second pr
b4c0: 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20  imary key) then 
b4d0: 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72  create an.** err
b4e0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  or..**.** If the
b4f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20   PRIMARY KEY is 
b500: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  on a single colu
b510: 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70  mn whose datatyp
b520: 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a  e is INTEGER,.**
b530: 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72   then we will tr
b540: 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f  y to use that co
b550: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69  lumn as the rowi
b560: 64 2e 20 20 53 65 74 20 74 68 65 20 54 61 62 6c  d.  Set the Tabl
b570: 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64  e.iPKey.** field
b580: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e   of the table un
b590: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
b5a0: 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78   to be the index
b5b0: 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47   of the.** INTEG
b5c0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
b5d0: 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50  olumn.  Table.iP
b5e0: 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31  Key is set to -1
b5f0: 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   if there is.** 
b600: 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  no INTEGER PRIMA
b610: 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66  RY KEY..**.** If
b620: 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20   the key is not 
b630: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
b640: 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65  RY KEY, then cre
b650: 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20  ate a unique.** 
b660: 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65  index for the ke
b670: 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20  y.  No index is 
b680: 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45  created for INTE
b690: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73  GER PRIMARY KEYs
b6a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b6b0: 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a  3AddPrimaryKey(.
b6c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
b6d0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
b6e0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
b6f0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a  List *pList,  /*
b700: 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e   List of field n
b710: 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78  ames to be index
b720: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
b730: 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61  ror,      /* Wha
b740: 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75  t to do with a u
b750: 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69  niqueness confli
b760: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f  ct */.  int auto
b770: 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  Inc,      /* Tru
b780: 65 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43  e if the AUTOINC
b790: 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69  REMENT keyword i
b7a0: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
b7b0: 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20  nt sortOrder    
b7c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53   /* SQLITE_SO_AS
b7d0: 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44  C or SQLITE_SO_D
b7e0: 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ESC */.){.  Tabl
b7f0: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
b800: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 43  ->pNewTable;.  C
b810: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b  olumn *pCol = 0;
b820: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31  .  int iCol = -1
b830: 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d  , i;.  int nTerm
b840: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
b850: 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b  ) goto primary_k
b860: 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70  ey_exit;.  if( p
b870: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
b880: 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79  TF_HasPrimaryKey
b890: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
b8a0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
b8b0: 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22  .      "table \"
b8c0: 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68  %s\" has more th
b8d0: 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b  an one primary k
b8e0: 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ey", pTab->zName
b8f0: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d  );.    goto prim
b900: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20  ary_key_exit;.  
b910: 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61  }.  pTab->tabFla
b920: 67 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d  gs |= TF_HasPrim
b930: 61 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c  aryKey;.  if( pL
b940: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43  ist==0 ){.    iC
b950: 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  ol = pTab->nCol 
b960: 2d 20 31 3b 0a 20 20 20 20 70 43 6f 6c 20 3d 20  - 1;.    pCol = 
b970: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
b980: 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c  ];.    pCol->col
b990: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
b9a0: 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 6e 54  _PRIMKEY;.    nT
b9b0: 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  erm = 1;.  }else
b9c0: 7b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 70 4c  {.    nTerm = pL
b9d0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
b9e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d  for(i=0; i<nTerm
b9f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
ba00: 70 72 20 2a 70 43 45 78 70 72 20 3d 20 73 71 6c  pr *pCExpr = sql
ba10: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
ba20: 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ate(pList->a[i].
ba30: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 61 73  pExpr);.      as
ba40: 73 65 72 74 28 20 70 43 45 78 70 72 21 3d 30 20  sert( pCExpr!=0 
ba50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ba60: 53 74 72 69 6e 67 54 6f 49 64 28 70 43 45 78 70  StringToId(pCExp
ba70: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  r);.      if( pC
ba80: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
ba90: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
baa0: 20 63 68 61 72 20 2a 7a 43 4e 61 6d 65 20 3d 20   char *zCName = 
bab0: 70 43 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  pCExpr->u.zToken
bac0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 43  ;.        for(iC
bad0: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
bae0: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
baf0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
bb00: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 4e  lite3StrICmp(zCN
bb10: 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
bb20: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  iCol].zName)==0 
bb30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
bb40: 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f  Col = &pTab->aCo
bb50: 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20  l[iCol];.       
bb60: 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c       pCol->colFl
bb70: 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50  ags |= COLFLAG_P
bb80: 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20 20  RIMKEY;.        
bb90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bba0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
bbb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
bbc0: 20 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d   }.  if( nTerm==
bbd0: 31 0a 20 20 20 26 26 20 70 43 6f 6c 0a 20 20 20  1.   && pCol.   
bbe0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
bbf0: 70 28 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54  p(sqlite3ColumnT
bc00: 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c 20 22 49  ype(pCol,""), "I
bc10: 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 26  NTEGER")==0.   &
bc20: 26 20 73 6f 72 74 4f 72 64 65 72 21 3d 53 51 4c  & sortOrder!=SQL
bc30: 49 54 45 5f 53 4f 5f 44 45 53 43 0a 20 20 29 7b  ITE_SO_DESC.  ){
bc40: 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41  .    if( IN_RENA
bc50: 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20 70 4c 69  ME_OBJECT && pLi
bc60: 73 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  st ){.      Expr
bc70: 20 2a 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74   *pCExpr = sqlit
bc80: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
bc90: 65 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  e(pList->a[0].pE
bca0: 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
bcb0: 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65  te3RenameTokenRe
bcc0: 6d 61 70 28 70 50 61 72 73 65 2c 20 26 70 54 61  map(pParse, &pTa
bcd0: 62 2d 3e 69 50 4b 65 79 2c 20 70 43 45 78 70 72  b->iPKey, pCExpr
bce0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  );.    }.    pTa
bcf0: 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b  b->iPKey = iCol;
bd00: 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f  .    pTab->keyCo
bd10: 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72  nf = (u8)onError
bd20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 75  ;.    assert( au
bd30: 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f  toInc==0 || auto
bd40: 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54  Inc==1 );.    pT
bd50: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
bd60: 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69  autoInc*TF_Autoi
bd70: 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 20 20 69 66  ncrement;.    if
bd80: 28 20 70 4c 69 73 74 20 29 20 70 50 61 72 73 65  ( pList ) pParse
bd90: 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 20 3d  ->iPkSortOrder =
bda0: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72   pList->a[0].sor
bdb0: 74 46 6c 61 67 73 3b 0a 20 20 7d 65 6c 73 65 20  tFlags;.  }else 
bdc0: 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23  if( autoInc ){.#
bdd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
bde0: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
bdf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
be00: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55  rMsg(pParse, "AU
be10: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f  TOINCREMENT is o
be20: 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61  nly allowed on a
be30: 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45  n ".       "INTE
be40: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
be50: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
be60: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72  e{.    sqlite3Cr
be70: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
be80: 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74  , 0, 0, 0, pList
be90: 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20  , onError, 0,.  
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
beb0: 20 20 20 20 20 20 20 20 20 30 2c 20 73 6f 72 74           0, sort
bec0: 4f 72 64 65 72 2c 20 30 2c 20 53 51 4c 49 54 45  Order, 0, SQLITE
bed0: 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59  _IDXTYPE_PRIMARY
bee0: 4b 45 59 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  KEY);.    pList 
bef0: 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72  = 0;.  }..primar
bf00: 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71  y_key_exit:.  sq
bf10: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
bf20: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
bf30: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
bf40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
bf50: 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74   new CHECK const
bf60: 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62  raint to the tab
bf70: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
bf80: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
bf90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
bfa0: 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69  AddCheckConstrai
bfb0: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
bfc0: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
bfd0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
bfe0: 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72  Expr *pCheckExpr
bff0: 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65    /* The check e
c000: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a  xpression */.){.
c010: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c020: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c  MIT_CHECK.  Tabl
c030: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
c040: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 73  ->pNewTable;.  s
c050: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
c060: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
c070: 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41  Tab && !IN_DECLA
c080: 52 45 5f 56 54 41 42 0a 20 20 20 26 26 20 21 73  RE_VTAB.   && !s
c090: 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 65 61  qlite3BtreeIsRea
c0a0: 64 6f 6e 6c 79 28 64 62 2d 3e 61 44 62 5b 64 62  donly(db->aDb[db
c0b0: 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e 70 42 74 29  ->init.iDb].pBt)
c0c0: 0a 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  .  ){.    pTab->
c0d0: 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33  pCheck = sqlite3
c0e0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
c0f0: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68  Parse, pTab->pCh
c100: 65 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72 29  eck, pCheckExpr)
c110: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
c120: 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65  ->constraintName
c130: 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  .n ){.      sqli
c140: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
c150: 6d 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  me(pParse, pTab-
c160: 3e 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73 65  >pCheck, &pParse
c170: 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65  ->constraintName
c180: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 1);.    }.  }e
c190: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
c1a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
c1b0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
c1c0: 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20   pCheckExpr);.  
c1d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
c1e0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  he collation fun
c1f0: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ction of the mos
c200: 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65  t recently parse
c210: 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a  d table column.*
c220: 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71  * to the CollSeq
c230: 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20   given..*/.void 
c240: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74  sqlite3AddCollat
c250: 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  eType(Parse *pPa
c260: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  rse, Token *pTok
c270: 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  en){.  Table *p;
c280: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
c290: 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *zColl;        
c2a0: 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65        /* Dequote
c2b0: 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74  d name of collat
c2c0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ion sequence */.
c2d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
c2e0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
c2f0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
c300: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
c310: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62   p->nCol-1;.  db
c320: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c330: 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
c340: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
c350: 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28  , pToken);.  if(
c360: 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e   !zColl ) return
c370: 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
c380: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
c390: 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  arse, zColl) ){.
c3a0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
c3b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
c3c0: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69  ee(db, p->aCol[i
c3d0: 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d  ].zColl);.    p-
c3e0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d  >aCol[i].zColl =
c3f0: 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f   zColl;.  .    /
c400: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
c410: 69 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 22  is declared as "
c420: 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b  <name> PRIMARY K
c430: 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65  EY COLLATE <type
c440: 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  >",.    ** then 
c450: 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76  an index may hav
c460: 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f  e been created o
c470: 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65  n this column be
c480: 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  fore the.    ** 
c490: 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77  collation type w
c4a0: 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63  as added. Correc
c4b0: 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20  t this if it is 
c4c0: 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  the case..    */
c4d0: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d  .    for(pIdx=p-
c4e0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
c4f0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
c500: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
c510: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31  pIdx->nKeyCol==1
c520: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
c530: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
c540: 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =i ){.        pI
c550: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20  dx->azColl[0] = 
c560: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
c570: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c580: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
c590: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
c5a0: 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Coll);.  }.}../*
c5b0: 20 43 68 61 6e 67 65 20 74 68 65 20 6d 6f 73 74   Change the most
c5c0: 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64   recently parsed
c5d0: 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 61 20   column to be a 
c5e0: 47 45 4e 45 52 41 54 45 44 20 41 4c 57 41 59 53  GENERATED ALWAYS
c5f0: 20 41 53 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a   AS.** column..*
c600: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
c610: 64 47 65 6e 65 72 61 74 65 64 28 50 61 72 73 65  dGenerated(Parse
c620: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
c630: 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 54  pExpr, Token *pT
c640: 79 70 65 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ype){.#ifndef SQ
c650: 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 4e 45 52 41  LITE_OMIT_GENERA
c660: 54 45 44 5f 43 4f 4c 55 4d 4e 53 0a 20 20 75 38  TED_COLUMNS.  u8
c670: 20 65 54 79 70 65 20 3d 20 43 4f 4c 46 4c 41 47   eType = COLFLAG
c680: 5f 56 49 52 54 55 41 4c 3b 0a 20 20 54 61 62 6c  _VIRTUAL;.  Tabl
c690: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
c6a0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 43  ->pNewTable;.  C
c6b0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69  olumn *pCol;.  i
c6c0: 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
c6d0: 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ECT ){.    sqlit
c6e0: 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61  e3RenameExprUnma
c6f0: 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  p(pParse, pExpr)
c700: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
c710: 3d 3d 30 20 29 20 67 6f 74 6f 20 67 65 6e 65 72  ==0 ) goto gener
c720: 61 74 65 64 5f 64 6f 6e 65 3b 0a 20 20 70 43 6f  ated_done;.  pCo
c730: 6c 20 3d 20 26 28 70 54 61 62 2d 3e 61 43 6f 6c  l = &(pTab->aCol
c740: 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b  [pTab->nCol-1]);
c750: 0a 20 20 69 66 28 20 70 43 6f 6c 2d 3e 70 44 66  .  if( pCol->pDf
c760: 6c 74 20 29 20 67 6f 74 6f 20 67 65 6e 65 72 61  lt ) goto genera
c770: 74 65 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28  ted_error;.  if(
c780: 20 70 54 79 70 65 20 29 7b 0a 20 20 20 20 69 66   pType ){.    if
c790: 28 20 70 54 79 70 65 2d 3e 6e 3d 3d 37 20 26 26  ( pType->n==7 &&
c7a0: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
c7b0: 28 22 76 69 72 74 75 61 6c 22 2c 70 54 79 70 65  ("virtual",pType
c7c0: 2d 3e 7a 2c 37 29 3d 3d 30 20 29 7b 0a 20 20 20  ->z,7)==0 ){.   
c7d0: 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20     /* no-op */. 
c7e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 79     }else if( pTy
c7f0: 70 65 2d 3e 6e 3d 3d 36 20 26 26 20 73 71 6c 69  pe->n==6 && sqli
c800: 74 65 33 53 74 72 4e 49 43 6d 70 28 22 73 74 6f  te3StrNICmp("sto
c810: 72 65 64 22 2c 70 54 79 70 65 2d 3e 7a 2c 36 29  red",pType->z,6)
c820: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 54 79  ==0 ){.      eTy
c830: 70 65 20 3d 20 43 4f 4c 46 4c 41 47 5f 53 54 4f  pe = COLFLAG_STO
c840: 52 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  RED;.    }else{.
c850: 20 20 20 20 20 20 67 6f 74 6f 20 67 65 6e 65 72        goto gener
c860: 61 74 65 64 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ated_error;.    
c870: 7d 0a 20 20 7d 0a 20 20 70 43 6f 6c 2d 3e 63 6f  }.  }.  pCol->co
c880: 6c 46 6c 61 67 73 20 7c 3d 20 65 54 79 70 65 3b  lFlags |= eType;
c890: 0a 20 20 61 73 73 65 72 74 28 20 54 46 5f 48 61  .  assert( TF_Ha
c8a0: 73 56 69 72 74 75 61 6c 3d 3d 43 4f 4c 46 4c 41  sVirtual==COLFLA
c8b0: 47 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 61  G_VIRTUAL );.  a
c8c0: 73 73 65 72 74 28 20 54 46 5f 48 61 73 53 74 6f  ssert( TF_HasSto
c8d0: 72 65 64 3d 3d 43 4f 4c 46 4c 41 47 5f 53 54 4f  red==COLFLAG_STO
c8e0: 52 45 44 20 29 3b 0a 20 20 70 54 61 62 2d 3e 74  RED );.  pTab->t
c8f0: 61 62 46 6c 61 67 73 20 7c 3d 20 65 54 79 70 65  abFlags |= eType
c900: 3b 0a 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20  ;.  pCol->pDflt 
c910: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
c920: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
c930: 70 72 2c 20 30 29 3b 0a 20 20 67 6f 74 6f 20 67  pr, 0);.  goto g
c940: 65 6e 65 72 61 74 65 64 5f 64 6f 6e 65 3b 0a 0a  enerated_done;..
c950: 67 65 6e 65 72 61 74 65 64 5f 65 72 72 6f 72 3a  generated_error:
c960: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d  .  sqlite3ErrorM
c970: 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 63 6f  sg(pParse, "inco
c980: 72 72 65 63 74 20 47 45 4e 45 52 41 54 45 44 20  rrect GENERATED 
c990: 41 4c 57 41 59 53 20 41 53 20 6f 6e 20 63 6f 6c  ALWAYS AS on col
c9a0: 75 6d 6e 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20  umn \"%s\"",.   
c9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
c9c0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 67 65 6e  Col->zName);.gen
c9d0: 65 72 61 74 65 64 5f 64 6f 6e 65 3a 0a 20 20 73  erated_done:.  s
c9e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
c9f0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
ca00: 70 72 29 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  pr);.#else.  /* 
ca10: 54 68 72 6f 77 20 61 6e 64 20 65 72 72 6f 72 20  Throw and error 
ca20: 66 6f 72 20 74 68 65 20 47 45 4e 45 52 41 54 45  for the GENERATE
ca30: 44 20 41 4c 57 41 59 53 20 41 53 20 63 6c 61 75  D ALWAYS AS clau
ca40: 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53  se if the.  ** S
ca50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 4e 45 52  QLITE_OMIT_GENER
ca60: 41 54 45 44 5f 43 4f 4c 55 4d 4e 53 20 63 6f 6d  ATED_COLUMNS com
ca70: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
ca80: 20 69 73 20 75 73 65 64 2e 20 2a 2f 0a 20 20 73   is used. */.  s
ca90: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
caa0: 50 61 72 73 65 2c 20 22 47 45 4e 45 52 41 54 45  Parse, "GENERATE
cab0: 44 20 41 4c 57 41 59 53 20 41 53 20 6e 6f 74 20  D ALWAYS AS not 
cac0: 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 73  supported");.  s
cad0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
cae0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
caf0: 70 72 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  pr);.#endif.}../
cb00: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
cb10: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 63  on returns the c
cb20: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
cb30: 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e  e for database n
cb40: 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e  ative text.** en
cb50: 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65  coding identifie
cb60: 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20  d by the string 
cb70: 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e  zName, length nN
cb80: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ame..**.** If th
cb90: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
cba0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69  ation sequence i
cbb0: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c  s not available,
cbc0: 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   or not availabl
cbd0: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61  e.** in the data
cbe0: 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f  base native enco
cbf0: 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74  ding, the collat
cc00: 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69  ion factory is i
cc10: 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71  nvoked to.** req
cc20: 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65 20  uest it. If the 
cc30: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
cc40: 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c  y does not suppl
cc50: 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e 63  y such a sequenc
cc60: 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65  e,.** and the se
cc70: 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61  quence is availa
cc80: 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  ble in another t
cc90: 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ext encoding, th
cca0: 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65  en that is.** re
ccb0: 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a  turned instead..
ccc0: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73  **.** If no vers
ccd0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75  ions of the requ
cce0: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  ested collations
ccf0: 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61 76   sequence are av
cd00: 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61  ailable, or.** a
cd10: 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63  nother error occ
cd20: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
cd30: 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
cd40: 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74  or message writt
cd50: 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73  en into.** pPars
cd60: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
cd70: 75 74 69 6e 65 20 69 73 20 61 20 77 72 61 70 70  utine is a wrapp
cd80: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
cd90: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20  3FindCollSeq(). 
cda0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
cdb0: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c   invokes the col
cdc0: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
cdd0: 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c  f the named coll
cde0: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
cdf0: 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e  found.** and gen
ce00: 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20  erates an error 
ce10: 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53  message..**.** S
ce20: 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33  ee also: sqlite3
ce30: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73  FindCollSeq(), s
ce40: 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71  qlite3GetCollSeq
ce50: 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  ().*/.CollSeq *s
ce60: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
ce70: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
ce80: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
ce90: 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Name){.  sqlite3
cea0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
ceb0: 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e  b;.  u8 enc = EN
cec0: 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74  C(db);.  u8 init
ced0: 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  busy = db->init.
cee0: 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  busy;.  CollSeq 
cef0: 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c  *pColl;..  pColl
cf00: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
cf10: 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a  llSeq(db, enc, z
cf20: 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b  Name, initbusy);
cf30: 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79  .  if( !initbusy
cf40: 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21   && (!pColl || !
cf50: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a  pColl->xCmp) ){.
cf60: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
cf70: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
cf80: 61 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c  arse, enc, pColl
cf90: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20  , zName);.  }.. 
cfa0: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
cfb0: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
cfc0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
cfd0: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73   increment the s
cfe0: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a  chema cookie..**
cff0: 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63  .** The schema c
d000: 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f  ookie is used to
d010: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20   determine when 
d020: 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74  the schema for t
d030: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
d040: 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65  hanges.  After e
d050: 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ach schema chang
d060: 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61  e, the cookie va
d070: 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  lue.** changes. 
d080: 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   When a process 
d090: 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20  first reads the 
d0a0: 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64  schema it record
d0b0: 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e  s the.** cookie.
d0c0: 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68    Thereafter, wh
d0d0: 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74  enever it goes t
d0e0: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
d0f0: 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65  abase,.** it che
d100: 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  cks the cookie t
d110: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
d120: 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63  schema has not c
d130: 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20  hanged.** since 
d140: 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64  it was last read
d150: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61  ..**.** This pla
d160: 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  n is not complet
d170: 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66  ely bullet-proof
d180: 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  .  It is possibl
d190: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68  e for.** the sch
d1a0: 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75  ema to change mu
d1b0: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64  ltiple times and
d1c0: 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20   for the cookie 
d1d0: 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63  to be.** set bac
d1e0: 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65  k to prior value
d1f0: 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68  .  But schema ch
d200: 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71  anges are infreq
d210: 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20  uent.** and the 
d220: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68  probability of h
d230: 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20  itting the same 
d240: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20  cookie value is 
d250: 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65  only.** 1 chance
d260: 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65   in 2^32.  So we
d270: 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e  're safe enough.
d280: 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54  .**.** IMPLEMENT
d290: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 33 34 32 33  ATION-OF: R-3423
d2a0: 30 2d 35 36 30 34 39 20 53 51 4c 69 74 65 20 61  0-56049 SQLite a
d2b0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69 6e 63  utomatically inc
d2c0: 72 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20 73  rements.** the s
d2d0: 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 77 68  chema-version wh
d2e0: 65 6e 65 76 65 72 20 74 68 65 20 73 63 68 65 6d  enever the schem
d2f0: 61 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 76 6f  a changes..*/.vo
d300: 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  id sqlite3Change
d310: 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50  Cookie(Parse *pP
d320: 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
d330: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d340: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
d350: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
d360: 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
d370: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
d380: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
d390: 20 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33   0) );.  sqlite3
d3a0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d3b0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
d3c0: 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45   BTREE_SCHEMA_VE
d3d0: 52 53 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20 20  RSION, .        
d3e0: 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
d3f0: 28 31 2b 28 75 6e 73 69 67 6e 65 64 29 64 62 2d  (1+(unsigned)db-
d400: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
d410: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
d420: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61  ));.}../*.** Mea
d430: 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
d440: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65  of characters ne
d450: 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74  eded to output t
d460: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e  he given.** iden
d470: 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d  tifier.  The num
d480: 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63  ber returned inc
d490: 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73  ludes any quotes
d4a0: 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65   used.** but doe
d4b0: 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68  s not include th
d4c0: 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f  e null terminato
d4d0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74  r..**.** The est
d4e0: 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76  imate is conserv
d4f0: 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74  ative.  It might
d500: 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20   be larger that 
d510: 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c  what is.** reall
d520: 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  y needed..*/.sta
d530: 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e  tic int identLen
d540: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gth(const char *
d550: 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66  z){.  int n;.  f
d560: 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c  or(n=0; *z; n++,
d570: 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a   z++){.    if( *
d580: 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d  z=='"' ){ n++; }
d590: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20  .  }.  return n 
d5a0: 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  + 2;.}../*.** Th
d5b0: 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
d5c0: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
d5d0: 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66  o an output buff
d5e0: 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a  er. The second .
d5f0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
d600: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
d610: 69 6e 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e  integer that con
d620: 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74  tains the offset
d630: 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20   at.** which to 
d640: 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f  write into the o
d650: 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68  utput buffer. Th
d660: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69  is function copi
d670: 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65  es the.** nul-te
d680: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
d690: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
d6a0: 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74 65  e third paramete
d6b0: 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c  r, zSignedIdent,
d6c0: 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69  .** to the speci
d6d0: 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74  fied offset in t
d6e0: 68 65 20 62 75 66 66 65 72 20 61 6e 64 20 75 70  he buffer and up
d6f0: 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72  dates *pIdx to r
d700: 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66  efer.** to the f
d710: 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20  irst byte after 
d720: 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 77 72  the last byte wr
d730: 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74  itten before ret
d740: 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49  urning..** .** I
d750: 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69  f the string zSi
d760: 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73  gnedIdent consis
d770: 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61  ts entirely of a
d780: 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20  lpha-numeric.** 
d790: 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73  characters, does
d7a0: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
d7b0: 61 20 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e  a digit and is n
d7c0: 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72  ot an SQL keywor
d7d0: 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  d,.** then it is
d7e0: 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f   copied to the o
d7f0: 75 74 70 75 74 20 62 75 66 66 65 72 20 65 78 61  utput buffer exa
d800: 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f  ctly as it is. O
d810: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20  therwise,.** it 
d820: 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20  is quoted using 
d830: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a  double-quotes..*
d840: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64  /.static void id
d850: 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20  entPut(char *z, 
d860: 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20  int *pIdx, char 
d870: 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a  *zSignedIdent){.
d880: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
d890: 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67  *zIdent = (unsig
d8a0: 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65  ned char*)zSigne
d8b0: 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c  dIdent;.  int i,
d8c0: 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20   j, needQuote;. 
d8d0: 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66   i = *pIdx;..  f
d8e0: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
d8f0: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; j++){.    if(
d900: 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d   !sqlite3Isalnum
d910: 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a  (zIdent[j]) && z
d920: 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20  Ident[j]!='_' ) 
d930: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65  break;.  }.  nee
d940: 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33  dQuote = sqlite3
d950: 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30  Isdigit(zIdent[0
d960: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  ]).            |
d970: 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64  | sqlite3Keyword
d980: 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21  Code(zIdent, j)!
d990: 3d 54 4b 5f 49 44 0a 20 20 20 20 20 20 20 20 20  =TK_ID.         
d9a0: 20 20 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21     || zIdent[j]!
d9b0: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  =0.            |
d9c0: 7c 20 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28 20 6e  | j==0;..  if( n
d9d0: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
d9e0: 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a  ] = '"';.  for(j
d9f0: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
da00: 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20  ++){.    z[i++] 
da10: 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20  = zIdent[j];.   
da20: 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d   if( zIdent[j]==
da30: 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  '"' ) z[i++] = '
da40: 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65  "';.  }.  if( ne
da50: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
da60: 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d   = '"';.  z[i] =
da70: 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b   0;.  *pIdx = i;
da80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
da90: 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  te a CREATE TABL
daa0: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72  E statement appr
dab0: 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
dac0: 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20  given.** table. 
dad0: 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20   Memory to hold 
dae0: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
daf0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74  statement is obt
db00: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71  ained.** from sq
db10: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
db20: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
db30: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
db40: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
db50: 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61  c char *createTa
db60: 62 6c 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20  bleStmt(sqlite3 
db70: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a  *db, Table *p){.
db80: 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20    int i, k, n;. 
db90: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
dba0: 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65  char *zSep, *zSe
dbb0: 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c  p2, *zEnd;.  Col
dbc0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d  umn *pCol;.  n =
dbd0: 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d   0;.  for(pCol =
dbe0: 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69   p->aCol, i=0; i
dbf0: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
dc00: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d  Col++){.    n +=
dc10: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f   identLength(pCo
dc20: 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20  l->zName) + 5;. 
dc30: 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c   }.  n += identL
dc40: 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b  ength(p->zName);
dc50: 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a  .  if( n<50 ){ .
dc60: 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20      zSep = "";. 
dc70: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a     zSep2 = ",";.
dc80: 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a      zEnd = ")";.
dc90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65    }else{.    zSe
dca0: 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20  p = "\n  ";.    
dcb0: 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b  zSep2 = ",\n  ";
dcc0: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29  .    zEnd = "\n)
dcd0: 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35  ";.  }.  n += 35
dce0: 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20   + 6*p->nCol;.  
dcf0: 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 44  zStmt = sqlite3D
dd00: 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29  bMallocRaw(0, n)
dd10: 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30  ;.  if( zStmt==0
dd20: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
dd30: 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
dd40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
dd50: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
dd60: 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45  f(n, zStmt, "CRE
dd70: 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20  ATE TABLE ");.  
dd80: 6b 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  k = sqlite3Strle
dd90: 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64  n30(zStmt);.  id
dda0: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
ddb0: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a  , p->zName);.  z
ddc0: 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b  Stmt[k++] = '(';
ddd0: 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61  .  for(pCol=p->a
dde0: 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e  Col, i=0; i<p->n
ddf0: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
de00: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
de10: 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  nst char * const
de20: 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20   azType[] = {.  
de30: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
de40: 41 46 46 5f 42 4c 4f 42 20 20 20 20 2a 2f 20 22  AFF_BLOB    */ "
de50: 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ",.        /* SQ
de60: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20  LITE_AFF_TEXT   
de70: 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20   */ " TEXT",.   
de80: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
de90: 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20  FF_NUMERIC */ " 
dea0: 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  NUM",.        /*
deb0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
dec0: 47 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20  GER */ " INT",. 
ded0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
dee0: 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20  _AFF_REAL    */ 
def0: 22 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20  " REAL".    };. 
df00: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
df10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
df20: 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e;..    sqlite3_
df30: 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a  snprintf(n-k, &z
df40: 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a  Stmt[k], zSep);.
df50: 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33      k += sqlite3
df60: 53 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b  Strlen30(&zStmt[
df70: 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20  k]);.    zSep = 
df80: 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74  zSep2;.    ident
df90: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
dfa0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
dfb0: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61   assert( pCol->a
dfc0: 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41  ffinity-SQLITE_A
dfd0: 46 46 5f 42 4c 4f 42 20 3e 3d 20 30 20 29 3b 0a  FF_BLOB >= 0 );.
dfe0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
dff0: 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54  ->affinity-SQLIT
e000: 45 5f 41 46 46 5f 42 4c 4f 42 20 3c 20 41 72 72  E_AFF_BLOB < Arr
e010: 61 79 53 69 7a 65 28 61 7a 54 79 70 65 29 20 29  aySize(azType) )
e020: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
e030: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
e040: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
e050: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
e060: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
e070: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
e080: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
e090: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
e0a0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
e0b0: 45 52 49 43 20 29 3b 0a 20 20 20 20 74 65 73 74  ERIC );.    test
e0c0: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
e0d0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
e0e0: 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20  _INTEGER );.    
e0f0: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
e100: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
e110: 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20  _AFF_REAL );.   
e120: 20 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 61 7a   .    zType = az
e130: 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e  Type[pCol->affin
e140: 69 74 79 20 2d 20 53 51 4c 49 54 45 5f 41 46 46  ity - SQLITE_AFF
e150: 5f 42 4c 4f 42 5d 3b 0a 20 20 20 20 6c 65 6e 20  _BLOB];.    len 
e160: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
e170: 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 61 73  0(zType);.    as
e180: 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69  sert( pCol->affi
e190: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
e1a0: 5f 42 4c 4f 42 20 0a 20 20 20 20 20 20 20 20 20  _BLOB .         
e1b0: 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69     || pCol->affi
e1c0: 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33 41 66 66  nity==sqlite3Aff
e1d0: 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c  inityType(zType,
e1e0: 20 30 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70   0) );.    memcp
e1f0: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79  y(&zStmt[k], zTy
e200: 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20  pe, len);.    k 
e210: 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65  += len;.    asse
e220: 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a  rt( k<=n );.  }.
e230: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
e240: 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b  tf(n-k, &zStmt[k
e250: 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a  ], "%s", zEnd);.
e260: 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a    return zStmt;.
e270: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20  }../*.** Resize 
e280: 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  an Index object 
e290: 74 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e  to hold N column
e2a0: 73 20 74 6f 74 61 6c 2e 20 20 52 65 74 75 72 6e  s total.  Return
e2b0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
e2c0: 20 73 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c   success and SQL
e2d0: 49 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20  ITE_NOMEM on an 
e2e0: 4f 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74  OOM error..*/.st
e2f0: 61 74 69 63 20 69 6e 74 20 72 65 73 69 7a 65 49  atic int resizeI
e300: 6e 64 65 78 4f 62 6a 65 63 74 28 73 71 6c 69 74  ndexObject(sqlit
e310: 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70  e3 *db, Index *p
e320: 49 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 63  Idx, int N){.  c
e330: 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20 69  har *zExtra;.  i
e340: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20  nt nByte;.  if( 
e350: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e  pIdx->nColumn>=N
e360: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
e370: 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
e380: 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d 3d  Idx->isResized==
e390: 30 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28  0 );.  nByte = (
e3a0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b 20  sizeof(char*) + 
e3b0: 73 69 7a 65 6f 66 28 69 31 36 29 20 2b 20 31 29  sizeof(i16) + 1)
e3c0: 2a 4e 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 73  *N;.  zExtra = s
e3d0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
e3e0: 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  ro(db, nByte);. 
e3f0: 20 69 66 28 20 7a 45 78 74 72 61 3d 3d 30 20 29   if( zExtra==0 )
e400: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e410: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d  OMEM_BKPT;.  mem
e420: 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78  cpy(zExtra, pIdx
e430: 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66  ->azColl, sizeof
e440: 28 63 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43  (char*)*pIdx->nC
e450: 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e  olumn);.  pIdx->
e460: 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20  azColl = (const 
e470: 63 68 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20  char**)zExtra;. 
e480: 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f   zExtra += sizeo
e490: 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65  f(char*)*N;.  me
e4a0: 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64  mcpy(zExtra, pId
e4b0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a  x->aiColumn, siz
e4c0: 65 6f 66 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e  eof(i16)*pIdx->n
e4d0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d  Column);.  pIdx-
e4e0: 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36  >aiColumn = (i16
e4f0: 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74  *)zExtra;.  zExt
e500: 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36  ra += sizeof(i16
e510: 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45  )*N;.  memcpy(zE
e520: 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72  xtra, pIdx->aSor
e530: 74 4f 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43  tOrder, pIdx->nC
e540: 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e  olumn);.  pIdx->
e550: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
e560: 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70 49 64 78  *)zExtra;.  pIdx
e570: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20  ->nColumn = N;. 
e580: 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64   pIdx->isResized
e590: 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
e5a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e5b0: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
e5c0: 74 6f 74 61 6c 20 72 6f 77 20 77 69 64 74 68 20  total row width 
e5d0: 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a  for a table..*/.
e5e0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69  static void esti
e5f0: 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28 54  mateTableWidth(T
e600: 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 75  able *pTab){.  u
e610: 6e 73 69 67 6e 65 64 20 77 54 61 62 6c 65 20 3d  nsigned wTable =
e620: 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75   0;.  const Colu
e630: 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69  mn *pTabCol;.  i
e640: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54  nt i;.  for(i=pT
e650: 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f  ab->nCol, pTabCo
e660: 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e  l=pTab->aCol; i>
e670: 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b  0; i--, pTabCol+
e680: 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c 65 20 2b  +){.    wTable +
e690: 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74  = pTabCol->szEst
e6a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
e6b0: 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77 54 61 62  ->iPKey<0 ) wTab
e6c0: 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a  le++;.  pTab->sz
e6d0: 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  TabRow = sqlite3
e6e0: 4c 6f 67 45 73 74 28 77 54 61 62 6c 65 2a 34 29  LogEst(wTable*4)
e6f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  ;.}../*.** Estim
e700: 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20  ate the average 
e710: 73 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 66 6f  size of a row fo
e720: 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  r an index..*/.s
e730: 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d  tatic void estim
e740: 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 49 6e  ateIndexWidth(In
e750: 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e  dex *pIdx){.  un
e760: 73 69 67 6e 65 64 20 77 49 6e 64 65 78 20 3d 20  signed wIndex = 
e770: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  0;.  int i;.  co
e780: 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  nst Column *aCol
e790: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
e7a0: 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30  >aCol;.  for(i=0
e7b0: 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; i<pIdx->nColum
e7c0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36  n; i++){.    i16
e7d0: 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   x = pIdx->aiCol
e7e0: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  umn[i];.    asse
e7f0: 72 74 28 20 78 3c 70 49 64 78 2d 3e 70 54 61 62  rt( x<pIdx->pTab
e800: 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  le->nCol );.    
e810: 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20  wIndex += x<0 ? 
e820: 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61  1 : aCol[pIdx->a
e830: 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73  iColumn[i]].szEs
e840: 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73  t;.  }.  pIdx->s
e850: 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65  zIdxRow = sqlite
e860: 33 4c 6f 67 45 73 74 28 77 49 6e 64 65 78 2a 34  3LogEst(wIndex*4
e870: 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  );.}../* Return 
e880: 74 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 6e  true if column n
e890: 75 6d 62 65 72 20 78 20 69 73 20 61 6e 79 20 6f  umber x is any o
e8a0: 66 20 74 68 65 20 66 69 72 73 74 20 6e 43 6f 6c  f the first nCol
e8b0: 20 65 6e 74 72 69 65 73 20 6f 66 20 61 69 43 6f   entries of aiCo
e8c0: 6c 5b 5d 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  l[]..** This is 
e8d0: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
e8e0: 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e if the column 
e8f0: 6e 75 6d 62 65 72 20 78 20 61 70 70 65 61 72 73  number x appears
e900: 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 0a 2a   in any of the.*
e910: 2a 20 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74  * first nCol ent
e920: 72 69 65 73 20 6f 66 20 61 6e 20 69 6e 64 65 78  ries of an index
e930: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e940: 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20  hasColumn(const 
e950: 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20  i16 *aiCol, int 
e960: 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20  nCol, int x){.  
e970: 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20  while( nCol-- > 
e980: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
e990: 20 61 69 43 6f 6c 5b 30 5d 3e 3d 30 20 29 3b 0a   aiCol[0]>=0 );.
e9a0: 20 20 20 20 69 66 28 20 78 3d 3d 2a 28 61 69 43      if( x==*(aiC
e9b0: 6f 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 72  ol++) ){.      r
e9c0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
e9d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
e9e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
e9f0: 72 75 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68  rue if any of th
ea00: 65 20 66 69 72 73 74 20 6e 4b 65 79 20 65 6e 74  e first nKey ent
ea10: 72 69 65 73 20 6f 66 20 69 6e 64 65 78 20 70 49  ries of index pI
ea20: 64 78 20 65 78 61 63 74 6c 79 0a 2a 2a 20 6d 61  dx exactly.** ma
ea30: 74 63 68 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  tch the iCol-th 
ea40: 65 6e 74 72 79 20 6f 66 20 70 50 6b 2e 20 20 70  entry of pPk.  p
ea50: 50 6b 20 69 73 20 61 6c 77 61 79 73 20 61 20 57  Pk is always a W
ea60: 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 2a 2a 20  ITHOUT ROWID.** 
ea70: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
ea80: 78 2e 20 20 70 49 64 78 20 69 73 20 61 6e 20 69  x.  pIdx is an i
ea90: 6e 64 65 78 20 6f 6e 20 74 68 65 20 73 61 6d 65  ndex on the same
eaa0: 20 74 61 62 6c 65 2e 20 20 70 49 64 78 20 6d 61   table.  pIdx ma
eab0: 79 0a 2a 2a 20 6f 72 20 6d 61 79 20 6e 6f 74 20  y.** or may not 
eac0: 62 65 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65  be the same inde
ead0: 78 20 61 73 20 70 50 6b 2e 0a 2a 2a 0a 2a 2a 20  x as pPk..**.** 
eae0: 54 68 65 20 66 69 72 73 74 20 6e 4b 65 79 20 65  The first nKey e
eaf0: 6e 74 72 69 65 73 20 6f 66 20 70 49 64 78 20 61  ntries of pIdx a
eb00: 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
eb10: 20 62 65 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c   be ordinary col
eb20: 75 6d 6e 73 2c 0a 2a 2a 20 6e 6f 74 20 61 20 72  umns,.** not a r
eb30: 6f 77 69 64 20 6f 72 20 65 78 70 72 65 73 73 69  owid or expressi
eb40: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
eb50: 6f 75 74 69 6e 65 20 64 69 66 66 65 72 73 20 66  outine differs f
eb60: 72 6f 6d 20 68 61 73 43 6f 6c 75 6d 6e 28 29 20  rom hasColumn() 
eb70: 69 6e 20 74 68 61 74 20 62 6f 74 68 20 74 68 65  in that both the
eb80: 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65 0a   column and the.
eb90: 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ** collating seq
eba0: 75 65 6e 63 65 20 6d 75 73 74 20 6d 61 74 63 68  uence must match
ebb0: 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
ebc0: 65 2c 20 62 75 74 20 66 6f 72 20 68 61 73 43 6f  e, but for hasCo
ebd0: 6c 75 6d 6e 28 29 20 6f 6e 6c 79 0a 2a 2a 20 74  lumn() only.** t
ebe0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6d  he column name m
ebf0: 75 73 74 20 6d 61 74 63 68 2e 0a 2a 2f 0a 73 74  ust match..*/.st
ec00: 61 74 69 63 20 69 6e 74 20 69 73 44 75 70 43 6f  atic int isDupCo
ec10: 6c 75 6d 6e 28 49 6e 64 65 78 20 2a 70 49 64 78  lumn(Index *pIdx
ec20: 2c 20 69 6e 74 20 6e 4b 65 79 2c 20 49 6e 64 65  , int nKey, Inde
ec30: 78 20 2a 70 50 6b 2c 20 69 6e 74 20 69 43 6f 6c  x *pPk, int iCol
ec40: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
ec50: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3c 3d 70   assert( nKey<=p
ec60: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  Idx->nColumn );.
ec70: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3c 4d    assert( iCol<M
ec80: 41 58 28 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2c  AX(pPk->nColumn,
ec90: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 20 29 3b  pPk->nKeyCol) );
eca0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e  .  assert( pPk->
ecb0: 69 64 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  idxType==SQLITE_
ecc0: 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b  IDXTYPE_PRIMARYK
ecd0: 45 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EY );.  assert( 
ece0: 70 50 6b 2d 3e 70 54 61 62 6c 65 2d 3e 74 61 62  pPk->pTable->tab
ecf0: 46 6c 61 67 73 20 26 20 54 46 5f 57 69 74 68 6f  Flags & TF_Witho
ed00: 75 74 52 6f 77 69 64 20 29 3b 0a 20 20 61 73 73  utRowid );.  ass
ed10: 65 72 74 28 20 70 50 6b 2d 3e 70 54 61 62 6c 65  ert( pPk->pTable
ed20: 3d 3d 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 29  ==pIdx->pTable )
ed30: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  ;.  testcase( pP
ed40: 6b 3d 3d 70 49 64 78 20 29 3b 0a 20 20 6a 20 3d  k==pIdx );.  j =
ed50: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
ed60: 43 6f 6c 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  Col];.  assert( 
ed70: 6a 21 3d 58 4e 5f 52 4f 57 49 44 20 26 26 20 6a  j!=XN_ROWID && j
ed80: 21 3d 58 4e 5f 45 58 50 52 20 29 3b 0a 20 20 66  !=XN_EXPR );.  f
ed90: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20  or(i=0; i<nKey; 
eda0: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
edb0: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
edc0: 5b 69 5d 3e 3d 30 20 7c 7c 20 6a 3e 3d 30 20 29  [i]>=0 || j>=0 )
edd0: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
ede0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3d 3d 6a 20 0a  aiColumn[i]==j .
edf0: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53       && sqlite3S
ee00: 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 61 7a 43  trICmp(pIdx->azC
ee10: 6f 6c 6c 5b 69 5d 2c 20 70 50 6b 2d 3e 61 7a 43  oll[i], pPk->azC
ee20: 6f 6c 6c 5b 69 43 6f 6c 5d 29 3d 3d 30 0a 20 20  oll[iCol])==0.  
ee30: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
ee40: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
ee50: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
ee60: 20 52 65 63 6f 6d 70 75 74 65 20 74 68 65 20 63   Recompute the c
ee70: 6f 6c 4e 6f 74 49 64 78 65 64 20 66 69 65 6c 64  olNotIdxed field
ee80: 20 6f 66 20 74 68 65 20 49 6e 64 65 78 2e 0a 2a   of the Index..*
ee90: 2a 0a 2a 2a 20 63 6f 6c 4e 6f 74 49 64 78 65 64  *.** colNotIdxed
eea0: 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
eeb0: 61 74 20 68 61 73 20 61 20 30 20 62 69 74 20 72  at has a 0 bit r
eec0: 65 70 72 65 73 65 6e 74 69 6e 67 20 65 61 63 68  epresenting each
eed0: 20 69 6e 64 65 78 65 64 0a 2a 2a 20 63 6f 6c 75   indexed.** colu
eee0: 6d 6e 73 20 74 68 61 74 20 61 72 65 20 77 69 74  mns that are wit
eef0: 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 36 33  hin the first 63
ef00: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
ef10: 74 61 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 68  table.  The.** h
ef20: 69 67 68 2d 6f 72 64 65 72 20 62 69 74 20 6f 66  igh-order bit of
ef30: 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 69 73 20   colNotIdxed is 
ef40: 61 6c 77 61 79 73 20 31 2e 20 20 41 6c 6c 20 75  always 1.  All u
ef50: 6e 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73  nindexed columns
ef60: 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65  .** of the table
ef70: 20 68 61 76 65 20 61 20 31 2e 0a 2a 2a 0a 2a 2a   have a 1..**.**
ef80: 20 54 68 65 20 63 6f 6c 4e 6f 74 49 64 78 65 64   The colNotIdxed
ef90: 20 6d 61 73 6b 20 69 73 20 41 4e 44 2d 65 64 20   mask is AND-ed 
efa0: 77 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74  with the SrcList
efb0: 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 6d 61 73  .a[].colUsed mas
efc0: 6b 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e  k.** to determin
efd0: 65 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 69  e if the index i
efe0: 73 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  s covering index
eff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f000: 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e   recomputeColumn
f010: 73 4e 6f 74 49 6e 64 65 78 65 64 28 49 6e 64 65  sNotIndexed(Inde
f020: 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d  x *pIdx){.  Bitm
f030: 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74  ask m = 0;.  int
f040: 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78   j;.  for(j=pIdx
f050: 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d  ->nColumn-1; j>=
f060: 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; j--){.    int
f070: 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   x = pIdx->aiCol
f080: 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  umn[j];.    if( 
f090: 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  x>=0 ){.      te
f0a0: 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31  stcase( x==BMS-1
f0b0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
f0c0: 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a  se( x==BMS-2 );.
f0d0: 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d        if( x<BMS-
f0e0: 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54  1 ) m |= MASKBIT
f0f0: 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (x);.    }.  }. 
f100: 20 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78   pIdx->colNotIdx
f110: 65 64 20 3d 20 7e 6d 3b 0a 20 20 61 73 73 65 72  ed = ~m;.  asser
f120: 74 28 20 28 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74  t( (pIdx->colNot
f130: 49 64 78 65 64 3e 3e 36 33 29 3d 3d 31 20 29 3b  Idxed>>63)==1 );
f140: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
f150: 6f 75 74 69 6e 65 20 72 75 6e 73 20 61 74 20 74  outine runs at t
f160: 68 65 20 65 6e 64 20 6f 66 20 70 61 72 73 69 6e  he end of parsin
f170: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
f180: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 0a   statement that.
f190: 2a 2a 20 68 61 73 20 61 20 57 49 54 48 4f 55 54  ** has a WITHOUT
f1a0: 20 52 4f 57 49 44 20 63 6c 61 75 73 65 2e 20 20   ROWID clause.  
f1b0: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
f1c0: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 63 6f  routine is to co
f1d0: 6e 76 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e  nvert both.** in
f1e0: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 61  ternal schema da
f1f0: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61 6e  ta structures an
f200: 64 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  d the generated 
f210: 56 44 42 45 20 63 6f 64 65 20 73 6f 20 74 68 61  VDBE code so tha
f220: 74 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 61 70  t they.** are ap
f230: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 61 20  propriate for a 
f240: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
f250: 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ble instead of a
f260: 20 72 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a   rowid table..**
f270: 20 43 68 61 6e 67 65 73 20 69 6e 63 6c 75 64 65   Changes include
f280: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
f290: 20 53 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73   Set all columns
f2a0: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
f2b0: 4b 45 59 20 73 63 68 65 6d 61 20 6f 62 6a 65 63  KEY schema objec
f2c0: 74 20 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c  t to be NOT NULL
f2d0: 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 43 6f  ..**     (2)  Co
f2e0: 6e 76 65 72 74 20 50 33 20 70 61 72 61 6d 65 74  nvert P3 paramet
f2f0: 65 72 20 6f 66 20 74 68 65 20 4f 50 5f 43 72 65  er of the OP_Cre
f300: 61 74 65 42 74 72 65 65 20 66 72 6f 6d 20 42 54  ateBtree from BT
f310: 52 45 45 5f 49 4e 54 4b 45 59 20 0a 2a 2a 20 20  REE_INTKEY .**  
f320: 20 20 20 20 20 20 20 20 69 6e 74 6f 20 42 54 52          into BTR
f330: 45 45 5f 42 4c 4f 42 4b 45 59 2e 0a 2a 2a 20 20  EE_BLOBKEY..**  
f340: 20 20 20 28 33 29 20 20 42 79 70 61 73 73 20 74     (3)  Bypass t
f350: 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74  he creation of t
f360: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
f370: 20 74 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20   table entry.** 
f380: 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 68 65           for the
f390: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 73 20   PRIMARY KEY as 
f3a0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
f3b0: 69 6e 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a 20  index is now.** 
f3c0: 20 20 20 20 20 20 20 20 20 69 64 65 6e 74 69 66           identif
f3d0: 69 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74  ied by the sqlit
f3e0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65  e_master table e
f3f0: 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c  ntry of the tabl
f400: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20 20  e itself..**    
f410: 20 28 34 29 20 20 53 65 74 20 74 68 65 20 49 6e   (4)  Set the In
f420: 64 65 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65 20  dex.tnum of the 
f430: 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65  PRIMARY KEY Inde
f440: 78 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a  x object in the.
f450: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 68 65  **          sche
f460: 6d 61 20 74 6f 20 74 68 65 20 72 6f 6f 74 70 61  ma to the rootpa
f470: 67 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ge from the main
f480: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 28   table..**     (
f490: 35 29 20 20 41 64 64 20 61 6c 6c 20 74 61 62 6c  5)  Add all tabl
f4a0: 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  e columns to the
f4b0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64   PRIMARY KEY Ind
f4c0: 65 78 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20  ex object.**    
f4d0: 20 20 20 20 20 20 73 6f 20 74 68 61 74 20 74 68        so that th
f4e0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
f4f0: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
f500: 78 2e 20 20 54 68 65 20 73 75 72 70 6c 75 73 0a  x.  The surplus.
f510: 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75  **          colu
f520: 6d 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66 20  mns are part of 
f530: 4b 65 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c  KeyInfo.nAllFiel
f540: 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 75 73  d and are not us
f550: 65 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ed for.**       
f560: 20 20 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f     sorting or lo
f570: 6f 6b 75 70 20 6f 72 20 75 6e 69 71 75 65 6e 65  okup or uniquene
f580: 73 73 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20  ss checks..**   
f590: 20 20 28 36 29 20 20 52 65 70 6c 61 63 65 20 74    (6)  Replace t
f5a0: 68 65 20 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e  he rowid tail on
f5b0: 20 61 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c   all automatical
f5c0: 6c 79 20 67 65 6e 65 72 61 74 65 64 20 55 4e 49  ly generated UNI
f5d0: 51 55 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  QUE.**          
f5e0: 69 6e 64 69 63 65 73 20 77 69 74 68 20 74 68 65  indices with the
f5f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
f600: 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  umns..**.** For 
f610: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2c 20  virtual tables, 
f620: 6f 6e 6c 79 20 28 31 29 20 69 73 20 70 65 72 66  only (1) is perf
f630: 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ormed..*/.static
f640: 20 76 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f 57   void convertToW
f650: 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65  ithoutRowidTable
f660: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
f670: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
f680: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 49  Index *pIdx;.  I
f690: 6e 64 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74  ndex *pPk;.  int
f6a0: 20 6e 50 6b 3b 0a 20 20 69 6e 74 20 6e 45 78 74   nPk;.  int nExt
f6b0: 72 61 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ra;.  int i, j;.
f6c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
f6d0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
f6e0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
f6f0: 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 4d 61 72  pVdbe;..  /* Mar
f700: 6b 20 65 76 65 72 79 20 50 52 49 4d 41 52 59 20  k every PRIMARY 
f710: 4b 45 59 20 63 6f 6c 75 6d 6e 20 61 73 20 4e 4f  KEY column as NO
f720: 54 20 4e 55 4c 4c 20 28 65 78 63 65 70 74 20 66  T NULL (except f
f730: 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  or imposter tabl
f740: 65 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es).  */.  if( !
f750: 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65  db->init.imposte
f760: 72 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 6f  rTable ){.    fo
f770: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
f780: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
f790: 20 69 66 28 20 28 70 54 61 62 2d 3e 61 43 6f 6c   if( (pTab->aCol
f7a0: 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43  [i].colFlags & C
f7b0: 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21  OLFLAG_PRIMKEY)!
f7c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  =0 ){.        pT
f7d0: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e  ab->aCol[i].notN
f7e0: 75 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ull = OE_Abort;.
f7f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f800: 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  }..  /* Convert 
f810: 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 6f  the P3 operand o
f820: 66 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 42  f the OP_CreateB
f830: 74 72 65 65 20 6f 70 63 6f 64 65 20 66 72 6f 6d  tree opcode from
f840: 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 0a 20 20   BTREE_INTKEY.  
f850: 2a 2a 20 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c  ** into BTREE_BL
f860: 4f 42 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 69 66  OBKEY..  */.  if
f870: 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72  ( pParse->addrCr
f880: 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
f890: 74 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c 69  t( v );.    sqli
f8a0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
f8b0: 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43  v, pParse->addrC
f8c0: 72 54 61 62 2c 20 42 54 52 45 45 5f 42 4c 4f 42  rTab, BTREE_BLOB
f8d0: 4b 45 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  KEY);.  }..  /* 
f8e0: 4c 6f 63 61 74 65 20 74 68 65 20 50 52 49 4d 41  Locate the PRIMA
f8f0: 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f  RY KEY index.  O
f900: 72 2c 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  r, if this table
f910: 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a   was originally.
f920: 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47 45 52 20    ** an INTEGER 
f930: 50 52 49 4d 41 52 59 20 4b 45 59 20 74 61 62 6c  PRIMARY KEY tabl
f940: 65 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  e, create a new 
f950: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
f960: 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  x. .  */.  if( p
f970: 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b  Tab->iPKey>=0 ){
f980: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
f990: 4c 69 73 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20  List;.    Token 
f9a0: 69 70 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20 73 71  ipkToken;.    sq
f9b0: 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26  lite3TokenInit(&
f9c0: 69 70 6b 54 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e  ipkToken, pTab->
f9d0: 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79  aCol[pTab->iPKey
f9e0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c  ].zName);.    pL
f9f0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
fa00: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
fa10: 73 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  se, 0, .        
fa20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
fa30: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
fa40: 4b 5f 49 44 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c  K_ID, &ipkToken,
fa50: 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c   0));.    if( pL
fa60: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
fa70: 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41  .    if( IN_RENA
fa80: 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
fa90: 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
faa0: 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73  TokenRemap(pPars
fab0: 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  e, pList->a[0].p
fac0: 45 78 70 72 2c 20 26 70 54 61 62 2d 3e 69 50 4b  Expr, &pTab->iPK
fad0: 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ey);.    }.    p
fae0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 46  List->a[0].sortF
faf0: 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 69  lags = pParse->i
fb00: 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  PkSortOrder;.   
fb10: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
fb20: 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61 62  >pNewTable==pTab
fb30: 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50   );.    pTab->iP
fb40: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Key = -1;.    sq
fb50: 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
fb60: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30  (pParse, 0, 0, 0
fb70: 2c 20 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b  , pList, pTab->k
fb80: 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c  eyConf, 0, 0, 0,
fb90: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
fba0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
fbb0: 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52  E_IDXTYPE_PRIMAR
fbc0: 59 4b 45 59 29 3b 0a 20 20 20 20 69 66 28 20 64  YKEY);.    if( d
fbd0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
fbe0: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
fbf0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 50  ) return;.    pP
fc00: 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
fc10: 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
fc20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
fc30: 6b 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b  k->nKeyCol==1 );
fc40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
fc50: 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
fc60: 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
fc70: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
fc80: 6b 21 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a  k!=0 );..    /*.
fc90: 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 61 6c      ** Remove al
fca0: 6c 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75  l redundant colu
fcb0: 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 50 52 49  mns from the PRI
fcc0: 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 20 65  MARY KEY.  For e
fcd0: 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67 65 0a 20  xample, change. 
fce0: 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b     ** "PRIMARY K
fcf0: 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c 62 2c 63  EY(a,b,a,b,c,b,c
fd00: 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73 74 20 22  ,d)" into just "
fd10: 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c  PRIMARY KEY(a,b,
fd20: 63 2c 64 29 22 2e 20 20 4c 61 74 65 72 0a 20 20  c,d)".  Later.  
fd30: 20 20 2a 2a 20 63 6f 64 65 20 61 73 73 75 6d 65    ** code assume
fd40: 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  s the PRIMARY KE
fd50: 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 65  Y contains no re
fd60: 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a  peated columns..
fd70: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
fd80: 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65  =j=1; i<pPk->nKe
fd90: 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
fda0: 20 20 69 66 28 20 69 73 44 75 70 43 6f 6c 75 6d    if( isDupColum
fdb0: 6e 28 70 50 6b 2c 20 6a 2c 20 70 50 6b 2c 20 69  n(pPk, j, pPk, i
fdc0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 6b  ) ){.        pPk
fdd0: 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20 20  ->nColumn--;.   
fde0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fdf0: 20 20 74 65 73 74 63 61 73 65 28 20 68 61 73 43    testcase( hasC
fe00: 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c  olumn(pPk->aiCol
fe10: 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69 43  umn, j, pPk->aiC
fe20: 6f 6c 75 6d 6e 5b 69 5d 29 20 29 3b 0a 20 20 20  olumn[i]) );.   
fe30: 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c       pPk->azColl
fe40: 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c  [j] = pPk->azCol
fe50: 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70 50  l[i];.        pP
fe60: 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  k->aSortOrder[j]
fe70: 20 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64   = pPk->aSortOrd
fe80: 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70  er[i];.        p
fe90: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b  Pk->aiColumn[j++
fea0: 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ] = pPk->aiColum
feb0: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n[i];.      }.  
fec0: 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65    }.    pPk->nKe
fed0: 79 43 6f 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20  yCol = j;.  }.  
fee0: 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29  assert( pPk!=0 )
fef0: 3b 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72  ;.  pPk->isCover
ff00: 69 6e 67 20 3d 20 31 3b 0a 20 20 69 66 28 20 21  ing = 1;.  if( !
ff10: 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65  db->init.imposte
ff20: 72 54 61 62 6c 65 20 29 20 70 50 6b 2d 3e 75 6e  rTable ) pPk->un
ff30: 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20  iqNotNull = 1;. 
ff40: 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 43 6f 6c   nPk = pPk->nCol
ff50: 75 6d 6e 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43  umn = pPk->nKeyC
ff60: 6f 6c 3b 0a 0a 20 20 2f 2a 20 42 79 70 61 73 73  ol;..  /* Bypass
ff70: 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66   the creation of
ff80: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
ff90: 20 62 74 72 65 65 20 61 6e 64 20 74 68 65 20 73   btree and the s
ffa0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a  qlite_master.  *
ffb0: 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 54  * table entry. T
ffc0: 68 69 73 20 69 73 20 6f 6e 6c 79 20 72 65 71 75  his is only requ
ffd0: 69 72 65 64 20 69 66 20 63 75 72 72 65 6e 74 6c  ired if currentl
ffe0: 79 20 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42  y generating VDB
fff0: 45 0a 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72 20  E.  ** code for 
10000 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 28  a CREATE TABLE (
10010 6e 6f 74 20 77 68 65 6e 20 70 61 72 73 69 6e 67  not when parsing
10020 20 6f 6e 65 20 61 73 20 70 61 72 74 20 6f 66 20   one as part of 
10030 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61 20 64  reading.  ** a d
10040 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 29 2e  atabase schema).
10050 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26 20    */.  if( v && 
10060 70 50 6b 2d 3e 74 6e 75 6d 3e 30 20 29 7b 0a 20  pPk->tnum>0 ){. 
10070 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
10080 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20  nit.busy==0 );. 
10090 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
100a0 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70 50  angeOpcode(v, pP
100b0 6b 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74 6f  k->tnum, OP_Goto
100c0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
100d0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
100e0 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
100f0 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 20   the table root 
10100 70 61 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74  page */.  pPk->t
10110 6e 75 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  num = pTab->tnum
10120 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
10130 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
10140 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  resentation of a
10150 6c 6c 20 55 4e 49 51 55 45 20 69 6e 64 69 63 65  ll UNIQUE indice
10160 73 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a  s by converting.
10170 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 72    ** the final r
10180 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f  owid column into
10190 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c   one or more col
101a0 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d  umns of the PRIM
101b0 41 52 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20  ARY KEY..  */.  
101c0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
101d0 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
101e0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
101f0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69      int n;.    i
10200 66 28 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49  f( IsPrimaryKeyI
10210 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e  ndex(pIdx) ) con
10220 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69  tinue;.    for(i
10230 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b  =n=0; i<nPk; i++
10240 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  ){.      if( !is
10250 44 75 70 43 6f 6c 75 6d 6e 28 70 49 64 78 2c 20  DupColumn(pIdx, 
10260 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70  pIdx->nKeyCol, p
10270 50 6b 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20  Pk, i) ){.      
10280 20 20 74 65 73 74 63 61 73 65 28 20 68 61 73 43    testcase( hasC
10290 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f  olumn(pIdx->aiCo
102a0 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  lumn, pIdx->nKey
102b0 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  Col, pPk->aiColu
102c0 6d 6e 5b 69 5d 29 20 29 3b 0a 20 20 20 20 20 20  mn[i]) );.      
102d0 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    n++;.      }. 
102e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d     }.    if( n==
102f0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
10300 69 73 20 69 6e 64 65 78 20 69 73 20 61 20 73 75  is index is a su
10310 70 65 72 73 65 74 20 6f 66 20 74 68 65 20 70 72  perset of the pr
10320 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20  imary key */.   
10330 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e     pIdx->nColumn
10340 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   = pIdx->nKeyCol
10350 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
10360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10370 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63  resizeIndexObjec
10380 74 28 64 62 2c 20 70 49 64 78 2c 20 70 49 64 78  t(db, pIdx, pIdx
10390 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72  ->nKeyCol+n) ) r
103a0 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69  eturn;.    for(i
103b0 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79  =0, j=pIdx->nKey
103c0 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29  Col; i<nPk; i++)
103d0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 44  {.      if( !isD
103e0 75 70 43 6f 6c 75 6d 6e 28 70 49 64 78 2c 20 70  upColumn(pIdx, p
103f0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50  Idx->nKeyCol, pP
10400 6b 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20  k, i) ){.       
10410 20 74 65 73 74 63 61 73 65 28 20 68 61 73 43 6f   testcase( hasCo
10420 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c  lumn(pIdx->aiCol
10430 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  umn, pIdx->nKeyC
10440 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ol, pPk->aiColum
10450 6e 5b 69 5d 29 20 29 3b 0a 20 20 20 20 20 20 20  n[i]) );.       
10460 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
10470 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  j] = pPk->aiColu
10480 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70  mn[i];.        p
10490 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d  Idx->azColl[j] =
104a0 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b   pPk->azColl[i];
104b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 6b  .        if( pPk
104c0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
104d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
104e0 53 65 65 20 74 69 63 6b 65 74 20 68 74 74 70 73  See ticket https
104f0 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72  ://www.sqlite.or
10500 67 2f 73 72 63 2f 69 6e 66 6f 2f 62 62 61 37 62  g/src/info/bba7b
10510 36 39 66 39 38 34 39 62 35 62 66 20 2a 2f 0a 20  69f9849b5bf */. 
10520 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 62           pIdx->b
10530 41 73 63 4b 65 79 42 75 67 20 3d 20 31 3b 0a 20  AscKeyBug = 1;. 
10540 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10550 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   j++;.      }.  
10560 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
10570 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70  pIdx->nColumn>=p
10580 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29  Idx->nKeyCol+n )
10590 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
105a0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  dx->nColumn>=j )
105b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
105c0 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
105d0 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
105e0 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f 0a   KEY index.  */.
105f0 20 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20    nExtra = 0;.  
10600 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
10610 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
10620 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28   if( !hasColumn(
10630 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6e  pPk->aiColumn, n
10640 50 6b 2c 20 69 29 20 29 20 6e 45 78 74 72 61 2b  Pk, i) ) nExtra+
10650 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 73  +;.  }.  if( res
10660 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64  izeIndexObject(d
10670 62 2c 20 70 50 6b 2c 20 6e 50 6b 2b 6e 45 78 74  b, pPk, nPk+nExt
10680 72 61 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ra) ) return;.  
10690 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20  for(i=0, j=nPk; 
106a0 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
106b0 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 68 61 73  +){.    if( !has
106c0 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f  Column(pPk->aiCo
106d0 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20  lumn, j, i) ){. 
106e0 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70       assert( j<p
106f0 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  Pk->nColumn );. 
10700 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75       pPk->aiColu
10710 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[j] = i;.     
10720 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20   pPk->azColl[j] 
10730 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  = sqlite3StrBINA
10740 52 59 3b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  RY;.      j++;. 
10750 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
10760 74 28 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d  t( pPk->nColumn=
10770 3d 6a 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =j );.  assert( 
10780 70 54 61 62 2d 3e 6e 43 6f 6c 3c 3d 6a 20 29 3b  pTab->nCol<=j );
10790 0a 20 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75  .  recomputeColu
107a0 6d 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28 70 50  mnsNotIndexed(pP
107b0 6b 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  k);.}..#ifndef S
107c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
107d0 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 52 65  ALTABLE./*.** Re
107e0 74 75 72 6e 20 74 72 75 65 20 69 66 20 7a 4e 61  turn true if zNa
107f0 6d 65 20 69 73 20 61 20 73 68 61 64 6f 77 20 74  me is a shadow t
10800 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65  able name in the
10810 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
10820 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
10830 0a 2a 2a 0a 2a 2a 20 7a 4e 61 6d 65 20 69 73 20  .**.** zName is 
10840 74 65 6d 70 6f 72 61 72 69 6c 79 20 6d 6f 64 69  temporarily modi
10850 66 69 65 64 20 77 68 69 6c 65 20 74 68 69 73 20  fied while this 
10860 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 6e 69  routine is runni
10870 6e 67 2c 20 62 75 74 20 69 73 0a 2a 2a 20 72 65  ng, but is.** re
10880 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
10890 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 70 72 69  iginal value pri
108a0 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  or to this routi
108b0 6e 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  ne returning..*/
108c0 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 53 68  .static int isSh
108d0 61 64 6f 77 54 61 62 6c 65 4e 61 6d 65 28 73 71  adowTableName(sq
108e0 6c 69 74 65 33 20 2a 64 62 2c 20 63 68 61 72 20  lite3 *db, char 
108f0 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  *zName){.  char 
10900 2a 7a 54 61 69 6c 3b 20 20 20 20 20 20 20 20 20  *zTail;         
10910 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
10920 74 65 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ter to the last 
10930 22 5f 22 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a  "_" in zName */.
10940 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
10950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10960 2f 2a 20 54 61 62 6c 65 20 74 68 61 74 20 7a 4e  /* Table that zN
10970 61 6d 65 20 69 73 20 61 20 73 68 61 64 6f 77 20  ame is a shadow 
10980 6f 66 20 2a 2f 0a 20 20 4d 6f 64 75 6c 65 20 2a  of */.  Module *
10990 70 4d 6f 64 3b 20 20 20 20 20 20 20 20 20 20 20  pMod;           
109a0 20 20 20 20 20 20 2f 2a 20 4d 6f 64 75 6c 65 20        /* Module 
109b0 66 6f 72 20 74 68 65 20 76 69 72 74 75 61 6c 20  for the virtual 
109c0 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 7a 54 61 69  table */..  zTai
109d0 6c 20 3d 20 73 74 72 72 63 68 72 28 7a 4e 61 6d  l = strrchr(zNam
109e0 65 2c 20 27 5f 27 29 3b 0a 20 20 69 66 28 20 7a  e, '_');.  if( z
109f0 54 61 69 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Tail==0 ) return
10a00 20 30 3b 0a 20 20 2a 7a 54 61 69 6c 20 3d 20 30   0;.  *zTail = 0
10a10 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
10a20 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
10a30 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 2a 7a 54  zName, 0);.  *zT
10a40 61 69 6c 20 3d 20 27 5f 27 3b 0a 20 20 69 66 28  ail = '_';.  if(
10a50 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
10a60 6e 20 30 3b 0a 20 20 69 66 28 20 21 49 73 56 69  n 0;.  if( !IsVi
10a70 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
10a80 74 75 72 6e 20 30 3b 0a 20 20 70 4d 6f 64 20 3d  turn 0;.  pMod =
10a90 20 28 4d 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65   (Module*)sqlite
10aa0 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
10ab0 4d 6f 64 75 6c 65 2c 20 70 54 61 62 2d 3e 61 7a  Module, pTab->az
10ac0 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 29 3b 0a 20  ModuleArg[0]);. 
10ad0 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20 29 20 72   if( pMod==0 ) r
10ae0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
10af0 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 69 56  Mod->pModule->iV
10b00 65 72 73 69 6f 6e 3c 33 20 29 20 72 65 74 75 72  ersion<3 ) retur
10b10 6e 20 30 3b 0a 20 20 69 66 28 20 70 4d 6f 64 2d  n 0;.  if( pMod-
10b20 3e 70 4d 6f 64 75 6c 65 2d 3e 78 53 68 61 64 6f  >pModule->xShado
10b30 77 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  wName==0 ) retur
10b40 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 4d  n 0;.  return pM
10b50 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 53 68  od->pModule->xSh
10b60 61 64 6f 77 4e 61 6d 65 28 7a 54 61 69 6c 2b 31  adowName(zTail+1
10b70 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
10b80 69 6e 65 20 69 73 53 68 61 64 6f 77 54 61 62 6c  ine isShadowTabl
10b90 65 4e 61 6d 65 28 78 2c 79 29 20 30 0a 23 65 6e  eName(x,y) 0.#en
10ba0 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  dif /* ifndef SQ
10bb0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
10bc0 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LTABLE */../*.**
10bd0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
10be0 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72   called to repor
10bf0 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20  t the final ")" 
10c00 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a  that terminates.
10c10 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ** a CREATE TABL
10c20 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
10c30 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72  ** The table str
10c40 75 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65  ucture that othe
10c50 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  r action routine
10c60 73 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c  s have been buil
10c70 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64  ding.** is added
10c80 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   to the internal
10c90 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73   hash tables, as
10ca0 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73  suming no errors
10cb0 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65   have.** occurre
10cc0 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72  d..**.** An entr
10cd0 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  y for the table 
10ce0 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d  is made in the m
10cf0 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64  aster table on d
10d00 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74  isk, unless.** t
10d10 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61  his is a tempora
10d20 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e  ry table or db->
10d30 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57  init.busy==1.  W
10d40 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  hen db->init.bus
10d50 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73  y==1.** it means
10d60 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
10d70 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
10d80 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20  r table because 
10d90 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65  we just.** conne
10da0 63 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  cted to the data
10db0 62 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20  base or because 
10dc0 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
10dd0 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72  r table has.** r
10de0 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c  ecently changed,
10df0 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f   so the entry fo
10e00 72 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72  r this table alr
10e10 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a  eady exists in.*
10e20 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  * the sqlite_mas
10e30 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64  ter table.  We d
10e40 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72  o not want to cr
10e50 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a  eate it again..*
10e60 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c  *.** If the pSel
10e70 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ect argument is 
10e80 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61  not NULL, it mea
10e90 6e 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ns that this rou
10ea0 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c  tine.** was call
10eb0 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74  ed to create a t
10ec0 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66  able generated f
10ed0 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54  rom a .** "CREAT
10ee0 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53  E TABLE ... AS S
10ef0 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65  ELECT ..." state
10f00 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d  ment.  The colum
10f10 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  n names of.** th
10f20 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c  e new table will
10f30 20 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c   match the resul
10f40 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
10f50 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ECT..*/.void sql
10f60 69 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20  ite3EndTable(.  
10f70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10f80 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
10f90 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
10fa0 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20  ken *pCons,     
10fb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27        /* The ','
10fc0 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65   token after the
10fd0 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66   last column def
10fe0 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  n. */.  Token *p
10ff0 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  End,            
11000 2f 2a 20 54 68 65 20 27 29 27 20 62 65 66 6f 72  /* The ')' befor
11010 65 20 6f 70 74 69 6f 6e 73 20 69 6e 20 74 68 65  e options in the
11020 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f   CREATE TABLE */
11030 0a 20 20 75 38 20 74 61 62 4f 70 74 73 2c 20 20  .  u8 tabOpts,  
11040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
11050 74 72 61 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e  tra table option
11060 73 2e 20 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f  s. Usually 0. */
11070 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
11080 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ct         /* Se
11090 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45  lect from a "CRE
110a0 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  ATE ... AS SELEC
110b0 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  T" */.){.  Table
110c0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
110d0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
110e0 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
110f0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
11100 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61  >db; /* The data
11110 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
11120 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11140 2a 20 44 61 74 61 62 61 73 65 20 69 6e 20 77 68  * Database in wh
11150 69 63 68 20 74 68 65 20 74 61 62 6c 65 20 6c 69  ich the table li
11160 76 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ves */.  Index *
11170 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
11180 20 20 20 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64     /* An implied
11190 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   index of the ta
111a0 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45  ble */..  if( pE
111b0 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74  nd==0 && pSelect
111c0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
111d0 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
111e0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
111f0 65 64 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  ed );.  p = pPar
11200 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
11210 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
11220 72 6e 3b 0a 20 20 70 2d 3e 6e 4e 56 43 6f 6c 20  rn;.  p->nNVCol 
11230 3d 20 70 2d 3e 6e 43 6f 6c 3b 0a 0a 20 20 69 66  = p->nCol;..  if
11240 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20  ( pSelect==0 && 
11250 69 73 53 68 61 64 6f 77 54 61 62 6c 65 4e 61 6d  isShadowTableNam
11260 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 20  e(db, p->zName) 
11270 29 7b 0a 20 20 20 20 70 2d 3e 74 61 62 46 6c 61  ){.    p->tabFla
11280 67 73 20 7c 3d 20 54 46 5f 53 68 61 64 6f 77 3b  gs |= TF_Shadow;
11290 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
112a0 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
112b0 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65  is 1 it means we
112c0 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
112d0 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a   SQL off the.  *
112e0 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  * "sqlite_master
112f0 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d  " or "sqlite_tem
11300 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20  p_master" table 
11310 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a  on the disk..  *
11320 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74  * So do not writ
11330 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67  e to the disk ag
11340 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68  ain.  Extract th
11350 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
11360 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
11370 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64  table from the d
11380 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20  b->init.newTnum 
11390 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67  field.  (The pag
113a0 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68  e number.  ** sh
113b0 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
113c0 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20  ut there by the 
113d0 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75  sqliteOpenCb rou
113e0 74 69 6e 65 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a  tine.).  **.  **
113f0 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67   If the root pag
11400 65 20 6e 75 6d 62 65 72 20 69 73 20 31 2c 20 74  e number is 1, t
11410 68 61 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69  hat means this i
11420 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  s the sqlite_mas
11430 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 69  ter.  ** table i
11440 74 73 65 6c 66 2e 20 20 53 6f 20 6d 61 72 6b 20  tself.  So mark 
11450 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 20 20  it read-only..  
11460 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
11470 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 66  t.busy ){.    if
11480 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
11490 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
114a0 73 67 28 70 50 61 72 73 65 2c 20 22 22 29 3b 0a  sg(pParse, "");.
114b0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
114c0 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20    }.    p->tnum 
114d0 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
114e0 75 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 74  um;.    if( p->t
114f0 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e 74 61 62 46  num==1 ) p->tabF
11500 6c 61 67 73 20 7c 3d 20 54 46 5f 52 65 61 64 6f  lags |= TF_Reado
11510 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  nly;.  }..  asse
11520 72 74 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73  rt( (p->tabFlags
11530 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79   & TF_HasPrimary
11540 4b 65 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c  Key)==0.       |
11550 7c 20 70 2d 3e 69 50 4b 65 79 3e 3d 30 20 7c 7c  | p->iPKey>=0 ||
11560 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
11570 65 79 49 6e 64 65 78 28 70 29 21 3d 30 20 29 3b  eyIndex(p)!=0 );
11580 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 74  .  assert( (p->t
11590 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
115a0 50 72 69 6d 61 72 79 4b 65 79 29 21 3d 30 0a 20  PrimaryKey)!=0. 
115b0 20 20 20 20 20 20 7c 7c 20 28 70 2d 3e 69 50 4b        || (p->iPK
115c0 65 79 3c 30 20 26 26 20 73 71 6c 69 74 65 33 50  ey<0 && sqlite3P
115d0 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
115e0 29 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 53  )==0) );..  /* S
115f0 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  pecial processin
11600 67 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  g for WITHOUT RO
11610 57 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20  WID Tables */.  
11620 69 66 28 20 74 61 62 4f 70 74 73 20 26 20 54 46  if( tabOpts & TF
11630 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b  _WithoutRowid ){
11640 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62  .    if( (p->tab
11650 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
11660 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20  ncrement) ){.   
11670 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11680 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
11690 20 20 20 20 20 22 41 55 54 4f 49 4e 43 52 45 4d       "AUTOINCREM
116a0 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  ENT not allowed 
116b0 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  on WITHOUT ROWID
116c0 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20   tables");.     
116d0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
116e0 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c     if( (p->tabFl
116f0 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d  ags & TF_HasPrim
11700 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20  aryKey)==0 ){.  
11710 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11720 4d 73 67 28 70 50 61 72 73 65 2c 20 22 50 52 49  Msg(pParse, "PRI
11730 4d 41 52 59 20 4b 45 59 20 6d 69 73 73 69 6e 67  MARY KEY missing
11740 20 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c 20 70   on table %s", p
11750 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ->zName);.    }e
11760 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61  lse{.      p->ta
11770 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69 74  bFlags |= TF_Wit
11780 68 6f 75 74 52 6f 77 69 64 20 7c 20 54 46 5f 4e  houtRowid | TF_N
11790 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20  oVisibleRowid;. 
117a0 20 20 20 20 20 63 6f 6e 76 65 72 74 54 6f 57 69       convertToWi
117b0 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28  thoutRowidTable(
117c0 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
117d0 7d 0a 20 20 7d 0a 0a 20 20 69 44 62 20 3d 20 73  }.  }..  iDb = s
117e0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
117f0 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65  dex(db, p->pSche
11800 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ma);..#ifndef SQ
11810 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
11820 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d    /* Resolve nam
11830 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20  es in all CHECK 
11840 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65  constraint expre
11850 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ssions..  */.  i
11860 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a  f( p->pCheck ){.
11870 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
11880 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28  veSelfReference(
11890 70 50 61 72 73 65 2c 20 70 2c 20 4e 43 5f 49 73  pParse, p, NC_Is
118a0 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e 70 43 68  Check, 0, p->pCh
118b0 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  eck);.  }.#endif
118c0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
118d0 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20  ITE_OMIT_CHECK) 
118e0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
118f0 45 5f 4f 4d 49 54 5f 47 45 4e 45 52 41 54 45 44  E_OMIT_GENERATED
11900 5f 43 4f 4c 55 4d 4e 53 0a 20 20 69 66 28 20 70  _COLUMNS.  if( p
11910 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 28 54 46  ->tabFlags & (TF
11920 5f 48 61 73 56 69 72 74 75 61 6c 7c 54 46 5f 48  _HasVirtual|TF_H
11930 61 73 53 74 6f 72 65 64 29 20 29 7b 0a 20 20 20  asStored) ){.   
11940 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72   int ii;.    for
11950 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 6e 43 6f  (ii=0; ii<p->nCo
11960 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  l; ii++){.      
11970 75 33 32 20 63 6f 6c 46 6c 61 67 73 20 3d 20 70  u32 colFlags = p
11980 2d 3e 61 43 6f 6c 5b 69 69 5d 2e 63 6f 6c 46 6c  ->aCol[ii].colFl
11990 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20 28  ags;.      if( (
119a0 63 6f 6c 46 6c 61 67 73 20 26 20 28 43 4f 4c 46  colFlags & (COLF
119b0 4c 41 47 5f 53 54 4f 52 45 44 7c 43 4f 4c 46 4c  LAG_STORED|COLFL
119c0 41 47 5f 56 49 52 54 55 41 4c 29 29 21 3d 30 20  AG_VIRTUAL))!=0 
119d0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
119e0 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41  olFlags & COLFLA
119f0 47 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20  G_VIRTUAL ){.   
11a00 20 20 20 20 20 20 20 70 2d 3e 6e 4e 56 43 6f 6c         p->nNVCol
11a10 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  --;.          as
11a20 73 65 72 74 28 20 70 2d 3e 6e 4e 56 43 6f 6c 3e  sert( p->nNVCol>
11a30 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  =0 );.        }.
11a40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
11a50 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65  esolveSelfRefere
11a60 6e 63 65 28 70 50 61 72 73 65 2c 20 70 2c 20 4e  nce(pParse, p, N
11a70 43 5f 47 65 6e 43 6f 6c 2c 20 0a 20 20 20 20 20  C_GenCol, .     
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
11aa0 2d 3e 61 43 6f 6c 5b 69 69 5d 2e 70 44 66 6c 74  ->aCol[ii].pDflt
11ab0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
11ac0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
11ad0 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68    /* Estimate th
11ae0 65 20 61 76 65 72 61 67 65 20 72 6f 77 20 73 69  e average row si
11af0 7a 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ze for the table
11b00 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70   and for all imp
11b10 6c 69 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a  lied indices */.
11b20 20 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57    estimateTableW
11b30 69 64 74 68 28 70 29 3b 0a 20 20 66 6f 72 28 70  idth(p);.  for(p
11b40 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70  Idx=p->pIndex; p
11b50 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
11b60 70 4e 65 78 74 29 7b 0a 20 20 20 20 65 73 74 69  pNext){.    esti
11b70 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70  mateIndexWidth(p
11b80 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Idx);.  }..  /* 
11b90 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  If not initializ
11ba0 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ing, then create
11bb0 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68   a record for th
11bc0 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a  e new table.  **
11bd0 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
11be0 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74  ASTER table of t
11bf0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
11c00 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69  *.  ** If this i
11c10 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61  s a TEMPORARY ta
11c20 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65  ble, write the e
11c30 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75  ntry into the au
11c40 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c  xiliary.  ** fil
11c50 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74  e instead of int
11c60 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
11c70 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
11c80 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
11c90 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  usy ){.    int n
11ca0 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  ;.    Vdbe *v;. 
11cb0 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20     char *zType; 
11cc0 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20     /* "view" or 
11cd0 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63  "table" */.    c
11ce0 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f  har *zType2;   /
11cf0 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42  * "VIEW" or "TAB
11d00 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  LE" */.    char 
11d10 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65  *zStmt;    /* Te
11d20 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
11d30 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45   TABLE or CREATE
11d40 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20   VIEW statement 
11d50 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  */..    v = sqli
11d60 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
11d70 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  e);.    if( NEVE
11d80 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
11d90 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ;..    sqlite3Vd
11da0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
11db0 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  lose, 0);..    /
11dc0 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 61  * .    ** Initia
11dd0 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 74  lize zType for t
11de0 68 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20 74  he new view or t
11df0 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
11e00 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d   if( p->pSelect=
11e10 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
11e20 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a   regular table *
11e30 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  /.      zType = 
11e40 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a  "table";.      z
11e50 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b  Type2 = "TABLE";
11e60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11e70 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65  OMIT_VIEW.    }e
11e80 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
11e90 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54  view */.      zT
11ea0 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20  ype = "view";.  
11eb0 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49      zType2 = "VI
11ec0 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EW";.#endif.    
11ed0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
11ee0 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41  s is a CREATE TA
11ef0 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54  BLE xx AS SELECT
11f00 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68   ..., execute th
11f10 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  e SELECT.    ** 
11f20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70  statement to pop
11f30 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61  ulate the new ta
11f40 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61  ble. The root-pa
11f50 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
11f60 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62  e.    ** new tab
11f70 6c 65 20 69 73 20 69 6e 20 72 65 67 69 73 74 65  le is in registe
11f80 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  r pParse->regRoo
11f90 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
11fa0 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54   Once the SELECT
11fb0 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20   has been coded 
11fc0 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  by sqlite3Select
11fd0 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20  (), it is in a. 
11fe0 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73     ** suitable s
11ff0 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f  tate to query fo
12000 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
12010 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20  es and types to 
12020 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62  be used.    ** b
12030 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  y the new table.
12040 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
12050 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77 72   shared-cache wr
12060 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  ite-lock is not 
12070 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69 74  required to writ
12080 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62  e to the new tab
12090 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20  le,.    ** as a 
120a0 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74  schema-lock must
120b0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
120c0 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63  en obtained to c
120d0 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a  reate it. Since.
120e0 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d      ** a schema-
120f0 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c  lock excludes al
12100 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  l other database
12110 20 75 73 65 72 73 2c 20 74 68 65 20 77 72 69 74   users, the writ
12120 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20  e-lock would.   
12130 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74   ** be redundant
12140 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
12150 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
12160 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
12170 74 3b 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74  t;    /* Where t
12180 68 65 20 53 45 4c 45 43 54 20 73 68 6f 75 6c 64  he SELECT should
12190 20 73 74 6f 72 65 20 72 65 73 75 6c 74 73 20 2a   store results *
121a0 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 59  /.      int regY
121b0 69 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a 20 52  ield;       /* R
121c0 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
121d0 63 6f 2d 72 6f 75 74 69 6e 65 20 65 6e 74 72 79  co-routine entry
121e0 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20  -point */.      
121f0 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20  int addrTop;    
12200 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
12210 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  e co-routine */.
12220 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63        int regRec
12230 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72  ;         /* A r
12240 65 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65  ecord to be inse
12250 72 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20  rt into the new 
12260 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69  table */.      i
12270 6e 74 20 72 65 67 52 6f 77 69 64 3b 20 20 20 20  nt regRowid;    
12280 20 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20 74     /* Rowid of t
12290 68 65 20 6e 65 78 74 20 72 6f 77 20 74 6f 20 69  he next row to i
122a0 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 20 20 69  nsert */.      i
122b0 6e 74 20 61 64 64 72 49 6e 73 4c 6f 6f 70 3b 20  nt addrInsLoop; 
122c0 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
122d0 20 6c 6f 6f 70 20 66 6f 72 20 69 6e 73 65 72 74   loop for insert
122e0 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20  ing rows */.    
122f0 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
12300 3b 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65  ;     /* A table
12310 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
12320 74 68 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c  the SELECT resul
12330 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20 72 65 67  ts */..      reg
12340 59 69 65 6c 64 20 3d 20 2b 2b 70 50 61 72 73 65  Yield = ++pParse
12350 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
12360 67 52 65 63 20 3d 20 2b 2b 70 50 61 72 73 65 2d  gRec = ++pParse-
12370 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
12380 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
12390 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73  ->nMem;.      as
123a0 73 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61  sert(pParse->nTa
123b0 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  b==1);.      sql
123c0 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
123d0 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
123e0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
123f0 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
12400 2c 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  , pParse->regRoo
12410 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  t, iDb);.      s
12420 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
12430 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49  P5(v, OPFLAG_P2I
12440 53 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61  SREG);.      pPa
12450 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20  rse->nTab = 2;. 
12460 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73       addrTop = s
12470 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
12480 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20  tAddr(v) + 1;.  
12490 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
124a0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
124b0 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69  Coroutine, regYi
124c0 65 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f 70 29  eld, 0, addrTop)
124d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
124e0 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
124f0 6e 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  n;.      pSelTab
12500 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
12510 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
12520 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 51 4c  se, pSelect, SQL
12530 49 54 45 5f 41 46 46 5f 42 4c 4f 42 29 3b 0a 20  ITE_AFF_BLOB);. 
12540 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62       if( pSelTab
12550 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
12560 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
12570 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Col==0 );.      
12580 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->nCol = pSelTa
12590 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->nCol;.      p
125a0 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
125b0 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53  ->aCol;.      pS
125c0 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
125d0 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  .      pSelTab->
125e0 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
125f0 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
12600 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b  le(db, pSelTab);
12610 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
12620 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
12630 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st, SRT_Coroutin
12640 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20  e, regYield);.  
12650 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
12660 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
12670 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  t, &dest);.     
12680 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
12690 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  r ) return;.    
126a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64    sqlite3VdbeEnd
126b0 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67  Coroutine(v, reg
126c0 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71  Yield);.      sq
126d0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
126e0 65 28 76 2c 20 61 64 64 72 54 6f 70 20 2d 20 31  e(v, addrTop - 1
126f0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 49 6e 73  );.      addrIns
12700 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
12710 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
12720 69 65 6c 64 2c 20 64 65 73 74 2e 69 53 44 50 61  ield, dest.iSDPa
12730 72 6d 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rm);.      VdbeC
12740 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
12750 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12760 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
12770 63 6f 72 64 2c 20 64 65 73 74 2e 69 53 64 73 74  cord, dest.iSdst
12780 2c 20 64 65 73 74 2e 6e 53 64 73 74 2c 20 72 65  , dest.nSdst, re
12790 67 52 65 63 29 3b 0a 20 20 20 20 20 20 73 71 6c  gRec);.      sql
127a0 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74  ite3TableAffinit
127b0 79 28 76 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  y(v, p, 0);.    
127c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
127d0 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
127e0 69 64 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29  id, 1, regRowid)
127f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12800 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
12810 49 6e 73 65 72 74 2c 20 31 2c 20 72 65 67 52 65  Insert, 1, regRe
12820 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  c, regRowid);.  
12830 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
12840 6f 74 6f 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f  oto(v, addrInsLo
12850 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
12860 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
12870 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a  , addrInsLoop);.
12880 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12890 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
128a0 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 0a  ose, 1);.    }..
128b0 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
128c0 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
128d0 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73   of the CREATE s
128e0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
128f0 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
12900 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65       zStmt = cre
12910 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c  ateTableStmt(db,
12920 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   p);.    }else{.
12930 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e        Token *pEn
12940 64 32 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26  d2 = tabOpts ? &
12950 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
12960 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20  en : pEnd;.     
12970 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32   n = (int)(pEnd2
12980 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e  ->z - pParse->sN
12990 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20  ameToken.z);.   
129a0 20 20 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b     if( pEnd2->z[
129b0 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70  0]!=';' ) n += p
129c0 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a  End2->n;.      z
129d0 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
129e0 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20  rintf(db, .     
129f0 20 20 20 20 20 22 43 52 45 41 54 45 20 25 73 20       "CREATE %s 
12a00 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e  %.*s", zType2, n
12a10 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  , pParse->sNameT
12a20 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a  oken.z.      );.
12a30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20      }..    /* A 
12a40 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63  slot for the rec
12a50 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ord has already 
12a60 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69  been allocated i
12a70 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51  n the .    ** SQ
12a80 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
12a90 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64  e.  We just need
12aa0 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20   to update that 
12ab0 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20  slot with all.  
12ac0 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61    ** the informa
12ad0 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65  tion we've colle
12ae0 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cted..    */.   
12af0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
12b00 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
12b10 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
12b20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20  ".         "SET 
12b30 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d  type='%s', name=
12b40 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c  %Q, tbl_name=%Q,
12b50 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73   rootpage=#%d, s
12b60 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22  ql=%Q ".       "
12b70 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22  WHERE rowid=#%d"
12b80 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
12b90 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d  iDb].zDbSName, M
12ba0 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20  ASTER_NAME,.    
12bb0 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70    zType,.      p
12bc0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70  ->zName,.      p
12bd0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70  ->zName,.      p
12be0 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a  Parse->regRoot,.
12bf0 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20        zStmt,.   
12c00 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f     pParse->regRo
12c10 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  wid.    );.    s
12c20 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
12c30 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c   zStmt);.    sql
12c40 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
12c50 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a  (pParse, iDb);..
12c60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12c70 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
12c80 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  T.    /* Check t
12c90 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64  o see if we need
12ca0 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71   to create an sq
12cb0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
12cc0 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b  ble for.    ** k
12cd0 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20  eeping track of 
12ce0 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65  autoincrement ke
12cf0 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ys..    */.    i
12d00 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20  f( (p->tabFlags 
12d10 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
12d20 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
12d30 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
12d40 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 61  Db[iDb];.      a
12d50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
12d60 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
12d70 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
12d80 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68     if( pDb->pSch
12d90 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20  ema->pSeqTab==0 
12da0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12db0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
12dc0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
12dd0 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51  "CREATE TABLE %Q
12de0 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  .sqlite_sequence
12df0 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20  (name,seq)",.   
12e00 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53         pDb->zDbS
12e10 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  Name.        );.
12e20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
12e30 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70  ndif..    /* Rep
12e40 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20  arse everything 
12e50 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  to update our in
12e60 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75  ternal data stru
12e70 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71  ctures */.    sq
12e80 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
12e90 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62  eSchemaOp(v, iDb
12ea0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
12eb0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
12ec0 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41  "tbl_name='%q' A
12ed0 4e 44 20 74 79 70 65 21 3d 27 74 72 69 67 67 65  ND type!='trigge
12ee0 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b  r'", p->zName));
12ef0 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20  .  }...  /* Add 
12f00 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65  the table to the
12f10 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
12f20 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
12f30 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
12f40 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
12f50 75 73 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  usy ){.    Table
12f60 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65   *pOld;.    Sche
12f70 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d  ma *pSchema = p-
12f80 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73  >pSchema;.    as
12f90 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
12fa0 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
12fb0 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
12fc0 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
12fd0 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d  shInsert(&pSchem
12fe0 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a  a->tblHash, p->z
12ff0 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  Name, p);.    if
13000 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  ( pOld ){.      
13010 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20  assert( p==pOld 
13020 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
13030 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69  st have failed i
13040 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74  nside HashInsert
13050 28 29 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  () */.      sqli
13060 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
13070 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
13080 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
13090 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a  >pNewTable = 0;.
130a0 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73      db->mDbFlags
130b0 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d   |= DBFLAG_Schem
130c0 61 43 68 61 6e 67 65 3b 0a 0a 23 69 66 6e 64 65  aChange;..#ifnde
130d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
130e0 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28  TERTABLE.    if(
130f0 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a   !p->pSelect ){.
13100 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
13110 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
13120 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e   char *)pParse->
13130 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20  sNameToken.z;.  
13140 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20      int nName;. 
13150 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
13160 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26  elect && pCons &
13170 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  & pEnd );.      
13180 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20  if( pCons->z==0 
13190 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73  ){.        pCons
131a0 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d   = pEnd;.      }
131b0 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28  .      nName = (
131c0 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72  int)((const char
131d0 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e   *)pCons->z - zN
131e0 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  ame);.      p->a
131f0 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33  ddColOffset = 13
13200 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68   + sqlite3Utf8Ch
13210 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61  arLen(zName, nNa
13220 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  me);.    }.#endi
13230 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  f.  }.}..#ifndef
13240 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
13250 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  W./*.** The pars
13260 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
13270 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
13280 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56  o create a new V
13290 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IEW.*/.void sqli
132a0 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20  te3CreateView(. 
132b0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
132c0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
132d0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
132e0 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20  Token *pBegin,  
132f0 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
13300 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
13310 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ns the statement
13320 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
13330 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me1,     /* The 
13340 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
13350 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
13360 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
13370 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
13380 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
13390 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
133a0 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
133b0 45 78 70 72 4c 69 73 74 20 2a 70 43 4e 61 6d 65  ExprList *pCName
133c0 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 6c  s, /* Optional l
133d0 69 73 74 20 6f 66 20 76 69 65 77 20 63 6f 6c 75  ist of view colu
133e0 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 53 65  mn names */.  Se
133f0 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
13400 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61   /* A SELECT sta
13410 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c  tement that will
13420 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
13430 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
13440 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
13450 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f  TRUE for a TEMPO
13460 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69  RARY view */.  i
13470 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20  nt noErr        
13480 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72    /* Suppress er
13490 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66 20  ror messages if 
134a0 56 49 45 57 20 61 6c 72 65 61 64 79 20 65 78 69  VIEW already exi
134b0 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
134c0 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  e *p;.  int n;. 
134d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
134e0 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
134f0 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20  DbFixer sFix;.  
13500 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30  Token *pName = 0
13510 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73  ;.  int iDb;.  s
13520 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
13530 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
13540 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29  pParse->nVar>0 )
13550 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
13560 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70  orMsg(pParse, "p
13570 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f  arameters are no
13580 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65  t allowed in vie
13590 77 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 63  ws");.    goto c
135a0 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b  reate_view_fail;
135b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
135c0 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c  artTable(pParse,
135d0 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
135e0 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e   isTemp, 1, 0, n
135f0 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61  oErr);.  p = pPa
13600 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
13610 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50    if( p==0 || pP
13620 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
13630 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61  o create_view_fa
13640 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54 77 6f  il;.  sqlite3Two
13650 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
13660 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
13670 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20   &pName);.  iDb 
13680 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
13690 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53  oIndex(db, p->pS
136a0 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65  chema);.  sqlite
136b0 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20  3FixInit(&sFix, 
136c0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69  pParse, iDb, "vi
136d0 65 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  ew", pName);.  i
136e0 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c  f( sqlite3FixSel
136f0 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65  ect(&sFix, pSele
13700 63 74 29 20 29 20 67 6f 74 6f 20 63 72 65 61 74  ct) ) goto creat
13710 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20  e_view_fail;..  
13720 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  /* Make a copy o
13730 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c  f the entire SEL
13740 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
13750 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
13760 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77  iew..  ** This w
13770 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68  ill force all th
13780 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76  e Expr.token.z v
13790 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61  alues to be dyna
137a0 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c  mically.  ** all
137b0 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68  ocated rather th
137c0 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  an point to the 
137d0 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77  input string - w
137e0 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a  hich means that.
137f0 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70    ** they will p
13800 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65  ersist after the
13810 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33   current sqlite3
13820 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74  _exec() call ret
13830 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  urns..  */.  if(
13840 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
13850 54 20 29 7b 0a 20 20 20 20 70 2d 3e 70 53 65 6c  T ){.    p->pSel
13860 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20  ect = pSelect;. 
13870 20 20 20 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a     pSelect = 0;.
13880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
13890 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
138a0 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
138b0 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f  Select, EXPRDUP_
138c0 52 45 44 55 43 45 29 3b 0a 20 20 7d 0a 20 20 70  REDUCE);.  }.  p
138d0 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74  ->pCheck = sqlit
138e0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
138f0 2c 20 70 43 4e 61 6d 65 73 2c 20 45 58 50 52 44  , pCNames, EXPRD
13900 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 69 66  UP_REDUCE);.  if
13910 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
13920 65 64 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65  ed ) goto create
13930 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f  _view_fail;..  /
13940 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64  * Locate the end
13950 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56   of the CREATE V
13960 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  IEW statement.  
13970 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20  Make sEnd point 
13980 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e  to.  ** the end.
13990 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70  .  */.  sEnd = p
139a0 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
139b0 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 45 6e  n;.  assert( sEn
139c0 64 2e 7a 5b 30 5d 21 3d 30 20 7c 7c 20 73 45 6e  d.z[0]!=0 || sEn
139d0 64 2e 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  d.n==0 );.  if( 
139e0 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29  sEnd.z[0]!=';' )
139f0 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20  {.    sEnd.z += 
13a00 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45  sEnd.n;.  }.  sE
13a10 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  nd.n = 0;.  n = 
13a20 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70  (int)(sEnd.z - p
13a30 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61 73 73  Begin->z);.  ass
13a40 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 7a 20  ert( n>0 );.  z 
13a50 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77  = pBegin->z;.  w
13a60 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73  hile( sqlite3Iss
13a70 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20  pace(z[n-1]) ){ 
13a80 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20  n--; }.  sEnd.z 
13a90 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e  = &z[n-1];.  sEn
13aa0 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55  d.n = 1;..  /* U
13ab0 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  se sqlite3EndTab
13ac0 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20  le() to add the 
13ad0 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49  view to the SQLI
13ae0 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
13af0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54  */.  sqlite3EndT
13b00 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20  able(pParse, 0, 
13b10 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 0a 63  &sEnd, 0, 0);..c
13b20 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3a  reate_view_fail:
13b30 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
13b40 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
13b50 63 74 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45  ct);.  if( IN_RE
13b60 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  NAME_OBJECT ){. 
13b70 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
13b80 45 78 70 72 6c 69 73 74 55 6e 6d 61 70 28 70 50  ExprlistUnmap(pP
13b90 61 72 73 65 2c 20 70 43 4e 61 6d 65 73 29 3b 0a  arse, pCNames);.
13ba0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
13bb0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
13bc0 70 43 4e 61 6d 65 73 29 3b 0a 20 20 72 65 74 75  pCNames);.  retu
13bd0 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
13be0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
13bf0 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
13c00 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
13c10 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
13c20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
13c30 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20  UALTABLE)./*.** 
13c40 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
13c50 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65  ure pTable is re
13c60 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69  ally a VIEW.  Fi
13c70 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20  ll in the names 
13c80 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  of.** the column
13c90 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e  s of the view in
13ca0 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75   the pTable stru
13cb0 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74  cture.  Return t
13cc0 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
13cd0 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65  errors.  If an e
13ce0 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61  rror is seen lea
13cf0 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
13d00 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
13d10 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
13d20 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
13d30 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a  umnNames(Parse *
13d40 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
13d50 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20  Table){.  Table 
13d60 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41  *pSelTab;   /* A
13d70 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d   fake table from
13d80 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74 68   which we get th
13d90 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
13da0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
13db0 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74      /* Copy of t
13dc0 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  he SELECT that i
13dd0 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
13de0 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72  ew */.  int nErr
13df0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   = 0;     /* Num
13e00 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e  ber of errors en
13e10 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69  countered */.  i
13e20 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
13e30 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20   /* Temporarily 
13e40 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72  holds the number
13e50 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73 69   of cursors assi
13e60 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gned */.  sqlite
13e70 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
13e80 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  db;  /* Database
13e90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20   connection for 
13ea0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f  malloc errors */
13eb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13ec0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
13ed0 45 0a 20 20 69 6e 74 20 72 63 3b 0a 23 65 6e 64  E.  int rc;.#end
13ee0 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
13ef0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
13f00 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f 78  TION.  sqlite3_x
13f10 61 75 74 68 20 78 41 75 74 68 3b 20 20 20 20 20  auth xAuth;     
13f20 20 20 2f 2a 20 53 61 76 65 64 20 78 41 75 74 68    /* Saved xAuth
13f30 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 23 65 6e 64   pointer */.#end
13f40 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  if..  assert( pT
13f50 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66  able );..#ifndef
13f60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
13f70 54 55 41 4c 54 41 42 4c 45 0a 20 20 64 62 2d 3e  TUALTABLE.  db->
13f80 6e 53 63 68 65 6d 61 4c 6f 63 6b 2b 2b 3b 0a 20  nSchemaLock++;. 
13f90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
13fa0 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61  bCallConnect(pPa
13fb0 72 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  rse, pTable);.  
13fc0 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 2d  db->nSchemaLock-
13fd0 2d 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  -;.  if( rc ){. 
13fe0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
13ff0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
14000 28 70 54 61 62 6c 65 29 20 29 20 72 65 74 75 72  (pTable) ) retur
14010 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  n 0;.#endif..#if
14020 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14030 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73  _VIEW.  /* A pos
14040 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73  itive nCol means
14050 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d   the columns nam
14060 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77  es for this view
14070 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64   are.  ** alread
14080 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20  y known..  */.  
14090 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
140a0 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  >0 ) return 0;..
140b0 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20    /* A negative 
140c0 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61  nCol is a specia
140d0 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67  l marker meaning
140e0 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72   that we are cur
140f0 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69  rently.  ** tryi
14100 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ng to compute th
14110 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20  e column names. 
14120 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69   If we enter thi
14130 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20  s routine with. 
14140 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e   ** a negative n
14150 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77  Col, it means tw
14160 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20  o or more views 
14170 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b  form a loop, lik
14180 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  e this:.  **.  *
14190 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
141a0 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20  W one AS SELECT 
141b0 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a  * FROM two;.  **
141c0 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
141d0 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a   two AS SELECT *
141e0 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a   FROM one;.  **.
141f0 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
14200 68 65 20 65 72 72 6f 72 20 61 62 6f 76 65 20 69  he error above i
14210 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69  s now caught pri
14220 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74  or to reaching t
14230 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20  his point..  ** 
14240 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  But the followin
14250 67 20 74 65 73 74 20 69 73 20 73 74 69 6c 6c 20  g test is still 
14260 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 69 74 20  important as it 
14270 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a  does come up.  *
14280 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * in the followi
14290 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20  ng:.  ** .  **  
142a0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
142b0 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a  main.ex1(a);.  *
142c0 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 45 4d  *     CREATE TEM
142d0 50 20 56 49 45 57 20 65 78 31 20 41 53 20 53 45  P VIEW ex1 AS SE
142e0 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 78 31 3b  LECT a FROM ex1;
142f0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
14300 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31   * FROM temp.ex1
14310 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ;.  */.  if( pTa
14320 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20  ble->nCol<0 ){. 
14330 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14340 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
14350 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c   %s is circularl
14360 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62  y defined", pTab
14370 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  le->zName);.    
14380 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
14390 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
143a0 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nCol>=0 );..  /*
143b0 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
143c0 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65  far, it means we
143d0 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   need to compute
143e0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73   the table names
143f0 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  ..  ** Note that
14400 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
14410 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
14420 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70  elect() will exp
14430 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22  and any.  ** "*"
14440 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
14450 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20   results set of 
14460 74 68 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c  the view and wil
14470 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73  l assign cursors
14480 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65  .  ** to the ele
14490 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f  ments of the FRO
144a0 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77  M clause.  But w
144b0 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68  e do not want th
144c0 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  ese changes.  **
144d0 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74   to be permanent
144e0 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74  .  So the comput
144f0 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e  ation is done on
14500 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
14510 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65  ELECT.  ** state
14520 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
14530 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f  s the view..  */
14540 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
14550 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20  e->pSelect );.  
14560 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65  pSel = sqlite3Se
14570 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
14580 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  le->pSelect, 0);
14590 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 23  .  if( pSel ){.#
145a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
145b0 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
145c0 20 20 75 38 20 65 50 61 72 73 65 4d 6f 64 65 20    u8 eParseMode 
145d0 3d 20 70 50 61 72 73 65 2d 3e 65 50 61 72 73 65  = pParse->eParse
145e0 4d 6f 64 65 3b 0a 20 20 20 20 70 50 61 72 73 65  Mode;.    pParse
145f0 2d 3e 65 50 61 72 73 65 4d 6f 64 65 20 3d 20 50  ->eParseMode = P
14600 41 52 53 45 5f 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  ARSE_MODE_NORMAL
14610 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e 20 3d  ;.#endif.    n =
14620 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
14630 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
14640 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
14650 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72  Parse, pSel->pSr
14660 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  c);.    pTable->
14670 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 44  nCol = -1;.    D
14680 69 73 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 3b  isableLookaside;
14690 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
146a0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
146b0 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64  ON.    xAuth = d
146c0 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62  b->xAuth;.    db
146d0 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20  ->xAuth = 0;.   
146e0 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
146f0 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
14700 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
14710 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  , SQLITE_AFF_NON
14720 45 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74  E);.    db->xAut
14730 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73 65  h = xAuth;.#else
14740 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73  .    pSelTab = s
14750 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
14760 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
14770 70 53 65 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46  pSel, SQLITE_AFF
14780 5f 4e 4f 4e 45 29 3b 0a 23 65 6e 64 69 66 0a 20  _NONE);.#endif. 
14790 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
147a0 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 54 61  = n;.    if( pTa
147b0 62 6c 65 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20  ble->pCheck ){. 
147c0 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20 56       /* CREATE V
147d0 49 45 57 20 6e 61 6d 65 28 61 72 67 6c 69 73 74  IEW name(arglist
147e0 29 20 41 53 20 2e 2e 2e 0a 20 20 20 20 20 20 2a  ) AS ....      *
147f0 2a 20 54 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  * The names of t
14800 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  he columns in th
14810 65 20 74 61 62 6c 65 20 61 72 65 20 74 61 6b 65  e table are take
14820 6e 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20  n from.      ** 
14830 61 72 67 6c 69 73 74 20 77 68 69 63 68 20 69 73  arglist which is
14840 20 73 74 6f 72 65 64 20 69 6e 20 70 54 61 62 6c   stored in pTabl
14850 65 2d 3e 70 43 68 65 63 6b 2e 20 20 54 68 65 20  e->pCheck.  The 
14860 70 43 68 65 63 6b 20 66 69 65 6c 64 0a 20 20 20  pCheck field.   
14870 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 68     ** normally h
14880 6f 6c 64 73 20 43 48 45 43 4b 20 63 6f 6e 73 74  olds CHECK const
14890 72 61 69 6e 74 73 20 6f 6e 20 61 6e 20 6f 72 64  raints on an ord
148a0 69 6e 61 72 79 20 74 61 62 6c 65 2c 20 62 75 74  inary table, but
148b0 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 20   for.      ** a 
148c0 56 49 45 57 20 69 74 20 68 6f 6c 64 73 20 74 68  VIEW it holds th
148d0 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
148e0 20 6e 61 6d 65 73 2e 0a 20 20 20 20 20 20 2a 2f   names..      */
148f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
14900 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
14910 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  t(pParse, pTable
14920 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20  ->pCheck, .     
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14940 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54 61              &pTa
14950 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  ble->nCol, &pTab
14960 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20  le->aCol);.     
14970 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
14980 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 20  ailed==0 .      
14990 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
149a0 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 54  ==0.       && pT
149b0 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c  able->nCol==pSel
149c0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a  ->pEList->nExpr.
149d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
149e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
149f0 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
14a00 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
14a10 70 54 61 62 6c 65 2c 20 70 53 65 6c 2c 0a 20 20  pTable, pSel,.  
14a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
14a50 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20  ITE_AFF_NONE);. 
14a60 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
14a70 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
14a80 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20        /* CREATE 
14a90 56 49 45 57 20 6e 61 6d 65 20 41 53 2e 2e 2e 20  VIEW name AS... 
14aa0 20 77 69 74 68 6f 75 74 20 61 6e 20 61 72 67 75   without an argu
14ab0 6d 65 6e 74 20 6c 69 73 74 2e 20 20 43 6f 6e 73  ment list.  Cons
14ac0 74 72 75 63 74 0a 20 20 20 20 20 20 2a 2a 20 74  truct.      ** t
14ad0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
14ae0 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
14af0 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
14b00 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
14b10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14b20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
14b30 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
14b40 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
14b50 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
14b60 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
14b70 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
14b80 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
14b90 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
14ba0 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
14bb0 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
14bc0 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
14bd0 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
14be0 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
14bf0 29 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ) );.    }else{.
14c00 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43        pTable->nC
14c10 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45  ol = 0;.      nE
14c20 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rr++;.    }.    
14c30 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
14c40 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b  le(db, pSelTab);
14c50 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
14c60 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
14c70 6c 29 3b 0a 20 20 20 20 45 6e 61 62 6c 65 4c 6f  l);.    EnableLo
14c80 6f 6b 61 73 69 64 65 3b 0a 23 69 66 6e 64 65 66  okaside;.#ifndef
14c90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
14ca0 45 52 54 41 42 4c 45 0a 20 20 20 20 70 50 61 72  ERTABLE.    pPar
14cb0 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 20 3d  se->eParseMode =
14cc0 20 65 50 61 72 73 65 4d 6f 64 65 3b 0a 23 65 6e   eParseMode;.#en
14cd0 64 69 66 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  dif.  } else {. 
14ce0 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20     nErr++;.  }. 
14cf0 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
14d00 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 20 7c 3d  ->schemaFlags |=
14d10 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
14d20 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
14d30 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
14d40 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c  sqlite3DeleteCol
14d50 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61  umnNames(db, pTa
14d60 62 6c 65 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  ble);.    pTable
14d70 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
14d80 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
14d90 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
14da0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
14db0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72   */.  return nEr
14dc0 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  r;  .}.#endif /*
14dd0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14de0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
14df0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14e00 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
14e10 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) */..#ifndef SQ
14e20 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
14e30 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
14e40 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
14e50 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64   every VIEW in d
14e60 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a  atabase idx..*/.
14e70 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
14e80 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73  teViewResetAll(s
14e90 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
14ea0 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  idx){.  HashElem
14eb0 20 2a 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73   *i;.  assert( s
14ec0 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
14ed0 78 48 65 6c 64 28 64 62 2c 20 69 64 78 2c 20 30  xHeld(db, idx, 0
14ee0 29 20 29 3b 0a 20 20 69 66 28 20 21 44 62 48 61  ) );.  if( !DbHa
14ef0 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  sProperty(db, id
14f00 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
14f10 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ws) ) return;.  
14f20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
14f30 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69  First(&db->aDb[i
14f40 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  dx].pSchema->tbl
14f50 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74  Hash); i;i=sqlit
14f60 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
14f70 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
14f80 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
14f90 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  i);.    if( pTab
14fa0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
14fb0 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
14fc0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20  ColumnNames(db, 
14fd0 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54 61  pTab);.      pTa
14fe0 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
14ff0 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20     pTab->nCol = 
15000 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44  0;.    }.  }.  D
15010 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64  bClearProperty(d
15020 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73  b, idx, DB_Unres
15030 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73  etViews);.}.#els
15040 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74  e.# define sqlit
15050 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c  eViewResetAll(A,
15060 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  B).#endif /* SQL
15070 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
15080 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
15090 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
150a0 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20 61  by the VDBE to a
150b0 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e  djust the intern
150c0 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65  al schema.** use
150d0 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e  d by SQLite when
150e0 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
150f0 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72   moves a table r
15100 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a  oot page. The.**
15110 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20   root-page of a 
15120 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69  table or index i
15130 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20 68  n database iDb h
15140 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  as changed from 
15150 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e  iFrom.** to iTo.
15160 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31  .**.** Ticket #1
15170 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c  728:  The symbol
15180 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74 69   table might sti
15190 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72  ll contain infor
151a0 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62  mation.** on tab
151b0 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63  les and/or indic
151c0 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65 20  es that are the 
151d0 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67  process of being
151e0 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20   deleted..** If 
151f0 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c  you are unlucky,
15200 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65   one of those de
15210 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f 72  leted indices or
15220 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a   tables might.**
15230 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 72   have the same r
15240 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20 61  ootpage number a
15250 73 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c 65  s the real table
15260 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20 69   or index that i
15270 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64  s.** being moved
15280 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20  .  So we cannot 
15290 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20 61  stop searching a
152a0 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20 6d  fter the first m
152b0 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73 65  atch .** because
152c0 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
152d0 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f 6e   might be for on
152e0 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65 64  e of the deleted
152f0 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74   indices.** or t
15300 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74 68  ables and not th
15310 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74 68  e table/index th
15320 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 62  at is actually b
15330 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57  eing moved..** W
15340 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65 20  e must continue 
15350 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c  looping until al
15360 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64  l tables and ind
15370 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f  ices with.** roo
15380 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76  tpage==iFrom hav
15390 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64  e been converted
153a0 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74 70   to have a rootp
153b0 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e  age of iTo.** in
153c0 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65 72   order to be cer
153d0 74 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f 74  tain that we got
153e0 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a   the right one..
153f0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
15400 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
15410 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  M.void sqlite3Ro
15420 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c 69  otPageMoved(sqli
15430 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
15440 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
15450 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65   iTo){.  HashEle
15460 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68  m *pElem;.  Hash
15470 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20 2a 70   *pHash;.  Db *p
15480 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  Db;..  assert( s
15490 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
154a0 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
154b0 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62  ) );.  pDb = &db
154c0 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 48  ->aDb[iDb];.  pH
154d0 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68  ash = &pDb->pSch
154e0 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20  ema->tblHash;.  
154f0 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
15500 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29  HashFirst(pHash)
15510 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
15520 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
15530 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  lem)){.    Table
15540 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
15550 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
15560 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e      if( pTab->tn
15570 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
15580 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20     pTab->tnum = 
15590 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  iTo;.    }.  }. 
155a0 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70   pHash = &pDb->p
155b0 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b  Schema->idxHash;
155c0 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
155d0 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61  iteHashFirst(pHa
155e0 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
155f0 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
15600 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e  (pElem)){.    In
15610 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69  dex *pIdx = sqli
15620 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
15630 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  );.    if( pIdx-
15640 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a  >tnum==iFrom ){.
15650 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d        pIdx->tnum
15660 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20   = iTo;.    }.  
15670 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
15680 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20  * Write code to 
15690 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65 20  erase the table 
156a0 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
156b0 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62  Table from datab
156c0 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f  ase iDb..** Also
156d0 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d   write code to m
156e0 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65  odify the sqlite
156f0 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e  _master table an
15700 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  d internal schem
15710 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70  a.** if a root-p
15720 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74  age of another t
15730 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79  able is moved by
15740 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72   the btree-layer
15750 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69   whilst.** erasi
15760 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73 20  ng iTable (this 
15770 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
15780 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
15790 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74  atabase)..*/ .st
157a0 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
157b0 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20  yRootPage(Parse 
157c0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61  *pParse, int iTa
157d0 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  ble, int iDb){. 
157e0 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
157f0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
15800 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71  );.  int r1 = sq
15810 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
15820 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 69  pParse);.  if( i
15830 54 61 62 6c 65 3c 32 20 29 20 73 71 6c 69 74 65  Table<2 ) sqlite
15840 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15850 2c 20 22 63 6f 72 72 75 70 74 20 73 63 68 65 6d  , "corrupt schem
15860 61 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  a");.  sqlite3Vd
15870 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44  beAddOp3(v, OP_D
15880 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20  estroy, iTable, 
15890 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  r1, iDb);.  sqli
158a0 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
158b0 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  se);.#ifndef SQL
158c0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
158d0 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74  UUM.  /* OP_Dest
158e0 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e  roy stores an in
158f0 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20   integer r1. If 
15900 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a  this integer.  *
15910 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  * is non-zero, t
15920 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f  hen it is the ro
15930 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
15940 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20  f a table moved 
15950 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e  to.  ** location
15960 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c   iTable. The fol
15970 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69  lowing code modi
15980 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f  fies the sqlite_
15990 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a  master table to.
159a0 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69    ** reflect thi
159b0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
159c0 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53   "#NNN" in the S
159d0 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  QL is a special 
159e0 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65  constant that me
159f0 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61 6c  ans whatever val
15a00 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72 65  ue.  ** is in re
15a10 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65  gister NNN.  See
15a20 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20 61   grammar rules a
15a30 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
15a40 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20  he TK_REGISTER. 
15a50 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64   ** token for ad
15a60 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
15a70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  tion..  */.  sql
15a80 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
15a90 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55  pParse, .     "U
15aa0 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54 20  PDATE %Q.%s SET 
15ab0 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52  rootpage=%d WHER
15ac0 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70 61  E #%d AND rootpa
15ad0 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70 50  ge=#%d",.     pP
15ae0 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
15af0 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53  b].zDbSName, MAS
15b00 54 45 52 5f 4e 41 4d 45 2c 20 69 54 61 62 6c 65  TER_NAME, iTable
15b10 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69  , r1, r1);.#endi
15b20 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  f.  sqlite3Relea
15b30 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
15b40 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , r1);.}../*.** 
15b50 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65 20  Write VDBE code 
15b60 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20 70  to erase table p
15b70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f  Tab and all asso
15b80 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f  ciated indices o
15b90 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20  n disk..** Code 
15ba0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73 71  to update the sq
15bb0 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
15bc0 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  es and internal 
15bd0 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f  schema definitio
15be0 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20  ns.** in case a 
15bf0 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67  root-page belong
15c00 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74  ing to another t
15c10 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79  able is moved by
15c20 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
15c30 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65  .** is also adde
15c40 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  d (this can happ
15c50 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
15c60 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
15c70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15c80 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61   destroyTable(Pa
15c90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
15ca0 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 2f 2a 20  le *pTab){.  /* 
15cb0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
15cc0 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75  may be auto-vacu
15cd0 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53  um capable (if S
15ce0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
15cf0 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f  ACUUM.  ** is no
15d00 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e  t defined), then
15d10 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
15d20 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74   to call OP_Dest
15d30 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  roy on the.  ** 
15d40 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
15d50 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72  root-pages in or
15d60 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69  der, starting wi
15d70 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c  th the numerical
15d80 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74  ly .  ** largest
15d90 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
15da0 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  r. This guarante
15db0 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20  es that none of 
15dc0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20  the root-pages. 
15dd0 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f   ** to be destro
15de0 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64  yed is relocated
15df0 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f   by an earlier O
15e00 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20  P_Destroy. i.e. 
15e10 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c  if the.  ** foll
15e20 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64  owing were coded
15e30 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44  :.  **.  ** OP_D
15e40 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20  estroy 4 0.  ** 
15e50 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74  ....  ** OP_Dest
15e60 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a  roy 5 0.  **.  *
15e70 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20  * and root page 
15e80 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65  5 happened to be
15e90 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
15ea0 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  t-page number in
15eb0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
15ec0 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61  se, then root pa
15ed0 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f  ge 5 would be mo
15ee0 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79  ved to page 4 by
15ef0 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44   the .  ** "OP_D
15f00 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f  estroy 4 0" opco
15f10 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65  de. The subseque
15f20 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35  nt "OP_Destroy 5
15f30 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20   0" would hit.  
15f40 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70  ** a free-list p
15f50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  age..  */.  int 
15f60 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75  iTab = pTab->tnu
15f70 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f  m;.  int iDestro
15f80 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c  yed = 0;..  whil
15f90 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65  e( 1 ){.    Inde
15fa0 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74  x *pIdx;.    int
15fb0 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a   iLargest = 0;..
15fc0 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79      if( iDestroy
15fd0 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44  ed==0 || iTab<iD
15fe0 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20  estroyed ){.    
15ff0 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61    iLargest = iTa
16000 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  b;.    }.    for
16010 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
16020 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
16030 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
16040 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49     int iIdx = pI
16050 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  dx->tnum;.      
16060 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53  assert( pIdx->pS
16070 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
16080 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66  hema );.      if
16090 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30  ( (iDestroyed==0
160a0 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72   || (iIdx<iDestr
160b0 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e 69  oyed)) && iIdx>i
160c0 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20  Largest ){.     
160d0 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49     iLargest = iI
160e0 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dx;.      }.    
160f0 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67 65  }.    if( iLarge
16100 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
16110 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65  eturn;.    }else
16120 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20  {.      int iDb 
16130 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
16140 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
16150 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
16160 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16170 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 70   iDb>=0 && iDb<p
16180 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29  Parse->db->nDb )
16190 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 52  ;.      destroyR
161a0 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
161b0 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a  iLargest, iDb);.
161c0 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65 64        iDestroyed
161d0 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20   = iLargest;.   
161e0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
161f0 52 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  Remove entries f
16200 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73  rom the sqlite_s
16210 74 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f 72  tatN tables (for
16220 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a   N in (1,2,3)).*
16230 2a 20 61 66 74 65 72 20 61 20 44 52 4f 50 20 49  * after a DROP I
16240 4e 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41 42  NDEX or DROP TAB
16250 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  LE command..*/.s
16260 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
16270 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65  e3ClearStatTable
16280 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
16290 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
162a0 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
162b0 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
162c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
162d0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6e  * The database n
162e0 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  umber */.  const
162f0 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20 20   char *zType,   
16300 20 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22 74    /* "idx" or "t
16310 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  bl" */.  const c
16320 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20  har *zName      
16330 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78  /* Name of index
16340 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a   or table */.){.
16350 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
16360 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d   char *zDbName =
16370 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
16380 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
16390 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b    for(i=1; i<=4;
163a0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
163b0 7a 54 61 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71  zTab[24];.    sq
163c0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
163d0 69 7a 65 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62  izeof(zTab),zTab
163e0 2c 22 73 71 6c 69 74 65 5f 73 74 61 74 25 64 22  ,"sqlite_stat%d"
163f0 2c 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ,i);.    if( sql
16400 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50  ite3FindTable(pP
16410 61 72 73 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20  arse->db, zTab, 
16420 7a 44 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  zDbName) ){.    
16430 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
16440 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
16450 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
16460 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 25 73  M %Q.%s WHERE %s
16470 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 7a 44  =%Q",.        zD
16480 62 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79  bName, zTab, zTy
16490 70 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20  pe, zName.      
164a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
164b0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
164c0 6f 64 65 20 74 6f 20 64 72 6f 70 20 61 20 74 61  ode to drop a ta
164d0 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
164e0 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c  ite3CodeDropTabl
164f0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
16500 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e   Table *pTab, in
16510 74 20 69 44 62 2c 20 69 6e 74 20 69 73 56 69 65  t iDb, int isVie
16520 77 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  w){.  Vdbe *v;. 
16530 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
16540 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69  Parse->db;.  Tri
16550 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a  gger *pTrigger;.
16560 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
16570 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20  >aDb[iDb];..  v 
16580 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
16590 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
165a0 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71  rt( v!=0 );.  sq
165b0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
165c0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
165d0 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64   1, iDb);..#ifnd
165e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
165f0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
16600 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
16610 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
16620 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
16630 5f 56 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65  _VBegin);.  }.#e
16640 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20  ndif..  /* Drop 
16650 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73 73  all triggers ass
16660 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
16670 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
16680 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20  pped. Code.  ** 
16690 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  is generated to 
166a0 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  remove entries f
166b0 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  rom sqlite_maste
166c0 72 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71  r and/or.  ** sq
166d0 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
166e0 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20   if required..  
166f0 2a 2f 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20  */.  pTrigger = 
16700 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69  sqlite3TriggerLi
16710 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  st(pParse, pTab)
16720 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69 67  ;.  while( pTrig
16730 67 65 72 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ger ){.    asser
16740 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63  t( pTrigger->pSc
16750 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
16760 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ema || .        
16770 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
16780 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  a==db->aDb[1].pS
16790 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c  chema );.    sql
167a0 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50  ite3DropTriggerP
167b0 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67  tr(pParse, pTrig
167c0 67 65 72 29 3b 0a 20 20 20 20 70 54 72 69 67 67  ger);.    pTrigg
167d0 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70  er = pTrigger->p
167e0 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  Next;.  }..#ifnd
167f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
16800 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f  UTOINCREMENT.  /
16810 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74  * Remove any ent
16820 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ries of the sqli
16830 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
16840 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
16850 68 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65  h.  ** the table
16860 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
16870 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66  This is done bef
16880 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20 69 73  ore the table is
16890 20 64 72 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74   dropped.  ** at
168a0 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c   the btree level
168b0 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 71  , in case the sq
168c0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
168d0 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a  ble needs to.  *
168e0 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75  * move as a resu
168f0 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28  lt of the drop (
16900 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75  can happen in au
16910 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e  to-vacuum mode).
16920 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
16930 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
16940 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b  Autoincrement ){
16950 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
16960 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
16970 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
16980 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71  OM %Q.sqlite_seq
16990 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65  uence WHERE name
169a0 3d 25 51 22 2c 0a 20 20 20 20 20 20 70 44 62 2d  =%Q",.      pDb-
169b0 3e 7a 44 62 53 4e 61 6d 65 2c 20 70 54 61 62 2d  >zDbSName, pTab-
169c0 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  >zName.    );.  
169d0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
169e0 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d  rop all SQLITE_M
169f0 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20  ASTER table and 
16a00 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68  index entries th
16a10 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a  at refer to the.
16a20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20    ** table. The 
16a30 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f  program name loo
16a40 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d  ps through the m
16a50 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
16a60 64 65 6c 65 74 65 73 0a 20 20 2a 2a 20 65 76 65  deletes.  ** eve
16a70 72 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65  ry row that refe
16a80 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66  rs to a table of
16a90 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
16aa0 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a  s the one being.
16ab0 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72    ** dropped. Tr
16ac0 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c  iggers are handl
16ad0 65 64 20 73 65 70 61 72 61 74 65 6c 79 20 62 65  ed separately be
16ae0 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20  cause a trigger 
16af0 63 61 6e 20 62 65 0a 20 20 2a 2a 20 63 72 65 61  can be.  ** crea
16b00 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20  ted in the temp 
16b10 64 61 74 61 62 61 73 65 20 74 68 61 74 20 72 65  database that re
16b20 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20  fers to a table 
16b30 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20  in another.  ** 
16b40 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
16b50 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
16b60 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
16b70 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
16b80 25 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f  %Q.%s WHERE tbl_
16b90 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65  name=%Q and type
16ba0 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20  !='trigger'",.  
16bb0 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d      pDb->zDbSNam
16bc0 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20  e, MASTER_NAME, 
16bd0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
16be0 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20 21  if( !isView && !
16bf0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
16c00 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 54 61  ){.    destroyTa
16c10 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
16c20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d  );.  }..  /* Rem
16c30 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e  ove the table en
16c40 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27  try from SQLite'
16c50 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  s internal schem
16c60 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a  a and modify.  *
16c70 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * the schema coo
16c80 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  kie..  */.  if( 
16c90 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
16ca0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
16cb0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
16cc0 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c  Destroy, iDb, 0,
16cd0 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   0, pTab->zName,
16ce0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
16cf0 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
16d00 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
16d10 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
16d20 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20  DropTable, iDb, 
16d30 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
16d40 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  e, 0);.  sqlite3
16d50 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
16d60 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c  rse, iDb);.  sql
16d70 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
16d80 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  db, iDb);.}../*.
16d90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16da0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  is called to do 
16db0 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52  the work of a DR
16dc0 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
16dd0 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20  nt..** pName is 
16de0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
16df0 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70  table to be drop
16e00 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ped..*/.void sql
16e10 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61  ite3DropTable(Pa
16e20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
16e30 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
16e40 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45   isView, int noE
16e50 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  rr){.  Table *pT
16e60 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ab;.  Vdbe *v;. 
16e70 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
16e80 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
16e90 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d   iDb;..  if( db-
16ea0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
16eb0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
16ec0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
16ed0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
16ee0 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73  >nErr==0 );.  as
16ef0 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
16f00 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 73 71  c==1 );.  if( sq
16f10 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
16f20 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65  pParse) ) goto e
16f30 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
16f40 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62    if( noErr ) db
16f50 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2b 2b 3b  ->suppressErr++;
16f60 0a 20 20 61 73 73 65 72 74 28 20 69 73 56 69 65  .  assert( isVie
16f70 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d  w==0 || isView==
16f80 4c 4f 43 41 54 45 5f 56 49 45 57 20 29 3b 0a 20  LOCATE_VIEW );. 
16f90 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
16fa0 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
16fb0 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20 26  Parse, isView, &
16fc0 70 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20  pName->a[0]);.  
16fd0 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e  if( noErr ) db->
16fe0 73 75 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a  suppressErr--;..
16ff0 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
17000 0a 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29  .    if( noErr )
17010 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
17020 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50  fyNamedSchema(pP
17030 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  arse, pName->a[0
17040 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
17050 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
17060 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44  _table;.  }.  iD
17070 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
17080 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
17090 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61  b->pSchema);.  a
170a0 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
170b0 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
170c0 0a 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73  .  /* If pTab is
170d0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
170e0 2c 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f  , call ViewGetCo
170f0 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65  lumnNames() to e
17100 6e 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73  nsure.  ** it is
17110 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20   initialized..  
17120 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
17130 61 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c 69  al(pTab) && sqli
17140 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
17150 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
17160 61 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ab) ){.    goto 
17170 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
17180 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
17190 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
171a0 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
171b0 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e  nt code;.    con
171c0 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
171d0 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
171e0 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
171f0 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
17200 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
17210 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
17220 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69  zArg2 = 0;.    i
17230 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
17240 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
17250 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
17260 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20   0, zDb)){.     
17270 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
17280 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
17290 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
172a0 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
172b0 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
172c0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
172d0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
172e0 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
172f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
17300 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
17310 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23  _VIEW;.      }.#
17320 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17330 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
17340 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
17350 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
17360 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51  .      code = SQ
17370 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45  LITE_DROP_VTABLE
17380 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20  ;.      zArg2 = 
17390 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
173a0 28 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f 64  (db, pTab)->pMod
173b0 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a  ->zName;.#endif.
173c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
173d0 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
173e0 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
173f0 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
17400 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
17410 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
17420 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
17430 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  = SQLITE_DROP_TA
17440 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
17450 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
17460 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
17470 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e  se, code, pTab->
17480 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44  zName, zArg2, zD
17490 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
174a0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
174b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
174c0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
174d0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
174e0 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e  DELETE, pTab->zN
174f0 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
17500 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
17510 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
17520 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
17530 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
17540 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
17550 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
17560 20 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33   .    && sqlite3
17570 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
17580 4e 61 6d 65 2b 37 2c 20 22 73 74 61 74 22 2c 20  Name+7, "stat", 
17590 34 29 21 3d 30 0a 20 20 20 20 26 26 20 73 71 6c  4)!=0.    && sql
175a0 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
175b0 62 2d 3e 7a 4e 61 6d 65 2b 37 2c 20 22 70 61 72  b->zName+7, "par
175c0 61 6d 65 74 65 72 73 22 2c 20 31 30 29 21 3d 30  ameters", 10)!=0
175d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
175e0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
175f0 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
17600 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70  t be dropped", p
17610 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
17620 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
17630 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e  table;.  }..#ifn
17640 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17650 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65  VIEW.  /* Ensure
17660 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e   DROP TABLE is n
17670 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65  ot used on a vie
17680 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57  w, and DROP VIEW
17690 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a   is not used.  *
176a0 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20  * on a table..  
176b0 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77 20  */.  if( isView 
176c0 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
176d0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
176e0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
176f0 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42  e, "use DROP TAB
17700 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62  LE to delete tab
17710 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  le %s", pTab->zN
17720 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
17730 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
17740 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65    }.  if( !isVie
17750 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
17760 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
17770 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
17780 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57  , "use DROP VIEW
17790 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20   to delete view 
177a0 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
177b0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
177c0 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
177d0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
177e0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
177f0 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
17800 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
17810 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69  table.  ** on di
17820 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  sk..  */.  v = s
17830 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
17840 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
17850 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
17860 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
17870 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
17880 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65  ;.    if( !isVie
17890 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  w ){.      sqlit
178a0 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65  e3ClearStatTable
178b0 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  s(pParse, iDb, "
178c0 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  tbl", pTab->zNam
178d0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
178e0 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61  3FkDropTable(pPa
178f0 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62  rse, pName, pTab
17900 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
17910 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c  ite3CodeDropTabl
17920 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
17930 69 44 62 2c 20 69 73 56 69 65 77 29 3b 0a 20 20  iDb, isView);.  
17940 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  }..exit_drop_tab
17950 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  le:.  sqlite3Src
17960 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
17970 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
17980 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
17990 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
179a0 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b   a new foreign k
179b0 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a  ey on the table.
179c0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  ** currently und
179d0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
179e0 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72    pFromCol deter
179f0 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75  mines which colu
17a00 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  mns.** in the cu
17a10 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e  rrent table poin
17a20 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e  t to the foreign
17a30 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43   key.  If pFromC
17a40 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f  ol==0 then.** co
17a50 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f  nnect the key to
17a60 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
17a70 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20   inserted.  pTo 
17a80 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a  is the name of.*
17a90 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65  * the table refe
17aa0 72 72 65 64 20 74 6f 20 28 61 2e 6b 2e 61 20 74  rred to (a.k.a t
17ab0 68 65 20 22 70 61 72 65 6e 74 22 20 74 61 62 6c  he "parent" tabl
17ac0 65 29 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61  e).  pToCol is a
17ad0 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 74 61 62 6c   list.** of tabl
17ae0 65 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  es in the parent
17af0 20 70 54 6f 20 74 61 62 6c 65 2e 20 20 66 6c 61   pTo table.  fla
17b00 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  gs contains all.
17b10 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** information a
17b20 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63  bout the conflic
17b30 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
17b40 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65  orithms specifie
17b50 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44  d.** in the ON D
17b60 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45  ELETE, ON UPDATE
17b70 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63   and ON INSERT c
17b80 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  lauses..**.** An
17b90 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20   FKey structure 
17ba0 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61  is created and a
17bb0 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
17bc0 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75  e currently.** u
17bd0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
17be0 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d  n in the pParse-
17bf0 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64  >pNewTable field
17c00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65  ..**.** The fore
17c10 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66  ign key is set f
17c20 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f  or IMMEDIATE pro
17c30 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73  cessing.  A subs
17c40 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74  equent call.** t
17c50 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f  o sqlite3DeferFo
17c60 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74  reignKey() might
17c70 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20   change this to 
17c80 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69  DEFERRED..*/.voi
17c90 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  d sqlite3CreateF
17ca0 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72  oreignKey(.  Par
17cb0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
17cc0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
17cd0 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
17ce0 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f  st *pFromCol,  /
17cf0 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69  * Columns in thi
17d00 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69  s table that poi
17d10 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c  nt to other tabl
17d20 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  e */.  Token *pT
17d30 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  o,          /* N
17d40 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72  ame of the other
17d50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
17d60 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20  List *pToCol,   
17d70 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
17d80 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
17d90 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
17da0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
17db0 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
17dc0 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29  algorithms. */.)
17dd0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
17de0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69  = pParse->db;.#i
17df0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17e00 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
17e10 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b  FKey *pFKey = 0;
17e20 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f  .  FKey *pNextTo
17e30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70  ;.  Table *p = p
17e40 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
17e50 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
17e60 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
17e70 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a  ol;.  char *z;..
17e80 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30    assert( pTo!=0
17e90 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c   );.  if( p==0 |
17ea0 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41  | IN_DECLARE_VTA
17eb0 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  B ) goto fk_end;
17ec0 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
17ed0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  =0 ){.    int iC
17ee0 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  ol = p->nCol-1;.
17ef0 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 69 43      if( NEVER(iC
17f00 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f  ol<0) ) goto fk_
17f10 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f  end;.    if( pTo
17f20 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
17f30 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
17f40 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
17f50 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67  (pParse, "foreig
17f60 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20  n key on %s".   
17f70 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72        " should r
17f80 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e  eference only on
17f90 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  e column of tabl
17fa0 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20  e %T",.         
17fb0 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  p->aCol[iCol].zN
17fc0 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20  ame, pTo);.     
17fd0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
17fe0 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31    }.    nCol = 1
17ff0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
18000 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
18010 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d  nExpr!=pFromCol-
18020 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  >nExpr ){.    sq
18030 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18040 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e  arse,.        "n
18050 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
18060 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
18070 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
18080 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20  he number of ". 
18090 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20         "columns 
180a0 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  in the reference
180b0 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67  d table");.    g
180c0 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65  oto fk_end;.  }e
180d0 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
180e0 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b  pFromCol->nExpr;
180f0 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73  .  }.  nByte = s
18100 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20  izeof(*pFKey) + 
18110 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28  (nCol-1)*sizeof(
18120 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20  pFKey->aCol[0]) 
18130 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20  + pTo->n + 1;.  
18140 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
18150 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f    for(i=0; i<pTo
18160 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  Col->nExpr; i++)
18170 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
18180 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
18190 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
181a0 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a  ame) + 1;.    }.
181b0 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71    }.  pFKey = sq
181c0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
181d0 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20  o(db, nByte );. 
181e0 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b   if( pFKey==0 ){
181f0 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
18200 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70  ;.  }.  pFKey->p
18210 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65  From = p;.  pFKe
18220 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70  y->pNextFrom = p
18230 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28  ->pFKey;.  z = (
18240 63 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43  char*)&pFKey->aC
18250 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65  ol[nCol];.  pFKe
18260 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 69 66  y->zTo = z;.  if
18270 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
18280 43 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  CT ){.    sqlite
18290 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28  3RenameTokenMap(
182a0 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a  pParse, (void*)z
182b0 2c 20 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 6d 65  , pTo);.  }.  me
182c0 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20  mcpy(z, pTo->z, 
182d0 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f  pTo->n);.  z[pTo
182e0 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ->n] = 0;.  sqli
182f0 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20  te3Dequote(z);. 
18300 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a   z += pTo->n+1;.
18310 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20    pFKey->nCol = 
18320 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f  nCol;.  if( pFro
18330 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70  mCol==0 ){.    p
18340 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46  FKey->aCol[0].iF
18350 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  rom = p->nCol-1;
18360 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
18370 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
18380 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
18390 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
183a0 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29   j<p->nCol; j++)
183b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
183c0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e  lite3StrICmp(p->
183d0 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70  aCol[j].zName, p
183e0 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
183f0 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
18400 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
18410 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20  [i].iFrom = j;. 
18420 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
18430 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18440 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70  }.      if( j>=p
18450 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
18460 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
18470 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
18480 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f       "unknown co
18490 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66  lumn \"%s\" in f
184a0 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
184b0 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20  ition", .       
184c0 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69     pFromCol->a[i
184d0 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
184e0 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
184f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18500 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
18510 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  T ){.        sql
18520 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52  ite3RenameTokenR
18530 65 6d 61 70 28 70 50 61 72 73 65 2c 20 26 70 46  emap(pParse, &pF
18540 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2c 20 70 46  Key->aCol[i], pF
18550 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
18560 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
18570 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f   }.  }.  if( pTo
18580 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
18590 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
185a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
185b0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
185c0 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
185d0 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79  me);.      pFKey
185e0 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d  ->aCol[i].zCol =
185f0 20 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 49 4e   z;.      if( IN
18600 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
18610 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18620 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61  3RenameTokenRema
18630 70 28 70 50 61 72 73 65 2c 20 7a 2c 20 70 54 6f  p(pParse, z, pTo
18640 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
18650 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18660 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c  memcpy(z, pToCol
18670 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29  ->a[i].zName, n)
18680 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30  ;.      z[n] = 0
18690 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31  ;.      z += n+1
186a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
186b0 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
186c0 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41  = 0;.  pFKey->aA
186d0 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28  ction[0] = (u8)(
186e0 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20 20  flags & 0xff);  
186f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20            /* ON 
18700 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f  DELETE action */
18710 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f  .  pFKey->aActio
18720 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61  n[1] = (u8)((fla
18730 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
18740 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41  );    /* ON UPDA
18750 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  TE action */..  
18760 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
18770 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
18780 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61  b, 0, p->pSchema
18790 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d  ) );.  pNextTo =
187a0 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33   (FKey *)sqlite3
187b0 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70  HashInsert(&p->p
187c0 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68  Schema->fkeyHash
187d0 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  , .      pFKey->
187e0 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b  zTo, (void *)pFK
187f0 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e  ey.  );.  if( pN
18800 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a  extTo==pFKey ){.
18810 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
18820 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 67 6f 74  ult(db);.    got
18830 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  o fk_end;.  }.  
18840 69 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20  if( pNextTo ){. 
18850 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 78 74     assert( pNext
18860 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29  To->pPrevTo==0 )
18870 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65  ;.    pFKey->pNe
18880 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a  xtTo = pNextTo;.
18890 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72      pNextTo->pPr
188a0 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20  evTo = pFKey;.  
188b0 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  }..  /* Link the
188c0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20   foreign key to 
188d0 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65  the table as the
188e0 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f   last step..  */
188f0 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46  .  p->pFKey = pF
18900 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30  Key;.  pFKey = 0
18910 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c  ;..fk_end:.  sql
18920 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
18930 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  FKey);.#endif /*
18940 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
18950 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
18960 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  Y) */.  sqlite3E
18970 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
18980 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73  , pFromCol);.  s
18990 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
189a0 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29  lete(db, pToCol)
189b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
189c0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
189d0 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41  d when an INITIA
189e0 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72  LLY IMMEDIATE or
189f0 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
18a00 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73  RED.** clause is
18a10 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66   seen as part of
18a20 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64   a foreign key d
18a30 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20  efinition.  The 
18a40 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61  isDeferred.** pa
18a50 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72  rameter is 1 for
18a60 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
18a70 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e  RED and 0 for IN
18a80 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
18a90 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69  E..** The behavi
18aa0 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  or of the most r
18ab0 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
18ac0 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61  foreign key is a
18ad0 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72  djusted.** accor
18ae0 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  dingly..*/.void 
18af0 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
18b00 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50  ignKey(Parse *pP
18b10 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65  arse, int isDefe
18b20 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53  rred){.#ifndef S
18b30 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
18b40 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a  GN_KEY.  Table *
18b50 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46  pTab;.  FKey *pF
18b60 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62  Key;.  if( (pTab
18b70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
18b80 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b  able)==0 || (pFK
18b90 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79  ey = pTab->pFKey
18ba0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
18bb0 20 61 73 73 65 72 74 28 20 69 73 44 65 66 65 72   assert( isDefer
18bc0 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65  red==0 || isDefe
18bd0 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56  rred==1 ); /* EV
18be0 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20  : R-30323-21917 
18bf0 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65  */.  pFKey->isDe
18c00 66 65 72 72 65 64 20 3d 20 28 75 38 29 69 73 44  ferred = (u8)isD
18c10 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a  eferred;.#endif.
18c20 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
18c30 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
18c40 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c   erase and refil
18c50 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20  l index *pIdx.  
18c60 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20  This is.** used 
18c70 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  to initialize a 
18c80 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e  newly created in
18c90 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70  dex or to recomp
18ca0 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ute the.** conte
18cb0 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69  nt of an index i
18cc0 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20  n response to a 
18cd0 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
18ce0 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f  .**.** if memRoo
18cf0 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67  tPage is not neg
18d00 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20  ative, it means 
18d10 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69  that the index i
18d20 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74  s newly.** creat
18d30 65 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65  ed.  The registe
18d40 72 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d  r specified by m
18d50 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61  emRootPage conta
18d60 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20  ins the.** root 
18d70 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
18d80 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65  he index.  If me
18d90 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67  mRootPage is neg
18da0 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  ative, then.** t
18db0 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  he index already
18dc0 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74   exists and must
18dd0 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f   be cleared befo
18de0 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65  re being refille
18df0 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f  d and.** the roo
18e00 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
18e10 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61   the index is ta
18e20 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d  ken from pIndex-
18e30 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  >tnum..*/.static
18e40 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66   void sqlite3Ref
18e50 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a  illIndex(Parse *
18e60 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
18e70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f  Index, int memRo
18e80 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65  otPage){.  Table
18e90 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
18ea0 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65  >pTable;  /* The
18eb0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69   table that is i
18ec0 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
18ed0 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
18ee0 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74  Tab++;     /* Bt
18ef0 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  ree cursor used 
18f00 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e  for pTab */.  in
18f10 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d  t iIdx = pParse-
18f20 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20  >nTab++;     /* 
18f30 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65  Btree cursor use
18f40 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a  d for pIndex */.
18f50 20 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20 20    int iSorter;  
18f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f70 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 65   /* Cursor opene
18f80 64 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72 20  d by OpenSorter 
18f90 28 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20  (if in use) */. 
18fa0 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
18fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fc0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f  /* Address of to
18fd0 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  p of loop */.  i
18fe0 6e 74 20 61 64 64 72 32 3b 20 20 20 20 20 20 20  nt addr2;       
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19000 20 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70   Address to jump
19010 20 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74 65   to for next ite
19020 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
19030 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  tnum;           
19040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
19050 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78  ot page of index
19060 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74 49   */.  int iPartI
19070 64 78 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20  dxLabel;        
19080 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20       /* Jump to 
19090 74 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73 6b  this label to sk
190a0 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20 56 64  ip a row */.  Vd
190b0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
190c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
190d0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
190e0 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  to this virtual 
190f0 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79  machine */.  Key
19100 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20  Info *pKey;     
19110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
19120 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78  eyInfo for index
19130 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
19140 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ord;            
19150 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
19160 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c   holding assembl
19170 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  ed index record 
19180 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
19190 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
191a0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
191b0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
191c0 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71  /.  int iDb = sq
191d0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
191e0 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70  ex(db, pIndex->p
191f0 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
19200 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
19210 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66  THORIZATION.  if
19220 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
19230 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
19240 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65  E_REINDEX, pInde
19250 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20  x->zName, 0,.   
19260 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
19270 7a 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a 20 20  zDbSName ) ){.  
19280 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
19290 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69  ndif..  /* Requi
192a0 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  re a write-lock 
192b0 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  on the table to 
192c0 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70 65  perform this ope
192d0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  ration */.  sqli
192e0 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
192f0 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
19300 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a  tnum, 1, pTab->z
19310 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71  Name);..  v = sq
19320 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
19330 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
19340 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
19350 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20   memRootPage>=0 
19360 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65  ){.    tnum = me
19370 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c  mRootPage;.  }el
19380 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70  se{.    tnum = p
19390 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d  Index->tnum;.  }
193a0 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  .  pKey = sqlite
193b0 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
193c0 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b  pParse, pIndex);
193d0 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 21  .  assert( pKey!
193e0 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
193f0 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
19400 2d 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 2f 2a 20  ->nErr );..  /* 
19410 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20  Open the sorter 
19420 63 75 72 73 6f 72 20 69 66 20 77 65 20 61 72 65  cursor if we are
19430 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a   to use one. */.
19440 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72    iSorter = pPar
19450 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71  se->nTab++;.  sq
19460 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
19470 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  v, OP_SorterOpen
19480 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70 49  , iSorter, 0, pI
19490 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28  ndex->nKeyCol, (
194a0 63 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20 20  char*).         
194b0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
194c0 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
194d0 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  y), P4_KEYINFO);
194e0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
194f0 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f  table. Loop thro
19500 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20  ugh all rows of 
19510 74 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65 72  the table, inser
19520 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20  ting index.  ** 
19530 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65  records into the
19540 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71   sorter. */.  sq
19550 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
19560 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62  Parse, iTab, iDb
19570 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
19580 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  ead);.  addr1 = 
19590 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
195a0 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
195b0 69 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43 6f  iTab, 0); VdbeCo
195c0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65 67  verage(v);.  reg
195d0 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
195e0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
195f0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 75 6c  e);.  sqlite3Mul
19600 74 69 57 72 69 74 65 28 70 50 61 72 73 65 29 3b  tiWrite(pParse);
19610 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72  ..  sqlite3Gener
19620 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72  ateIndexKey(pPar
19630 73 65 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c 72  se,pIndex,iTab,r
19640 65 67 52 65 63 6f 72 64 2c 30 2c 26 69 50 61 72  egRecord,0,&iPar
19650 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a  tIdxLabel,0,0);.
19660 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19670 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
19680 49 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72 2c  Insert, iSorter,
19690 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
196a0 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72  qlite3ResolvePar
196b0 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65  tIdxLabel(pParse
196c0 2c 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 29  , iPartIdxLabel)
196d0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
196e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
196f0 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29  , iTab, addr1+1)
19700 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
19710 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
19720 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
19730 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f  1);.  if( memRoo
19740 74 50 61 67 65 3c 30 20 29 20 73 71 6c 69 74 65  tPage<0 ) sqlite
19750 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19760 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69  P_Clear, tnum, i
19770 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Db);.  sqlite3Vd
19780 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
19790 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20  penWrite, iIdx, 
197a0 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20  tnum, iDb, .    
197b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197c0 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34  (char *)pKey, P4
197d0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c  _KEYINFO);.  sql
197e0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
197f0 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43  (v, OPFLAG_BULKC
19800 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67 65  SR|((memRootPage
19810 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49 53  >=0)?OPFLAG_P2IS
19820 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64 72  REG:0));..  addr
19830 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
19840 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
19850 65 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c  erSort, iSorter,
19860 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   0); VdbeCoverag
19870 65 28 76 29 3b 0a 20 20 69 66 28 20 49 73 55 6e  e(v);.  if( IsUn
19880 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78  iqueIndex(pIndex
19890 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20  ) ){.    int j2 
198a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74  = sqlite3VdbeGot
198b0 6f 28 76 2c 20 31 29 3b 0a 20 20 20 20 61 64 64  o(v, 1);.    add
198c0 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
198d0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
198e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56      sqlite3VdbeV
198f0 65 72 69 66 79 41 62 6f 72 74 61 62 6c 65 28 76  erifyAbortable(v
19900 2c 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20 20  , OE_Abort);.   
19910 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19920 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 6f 72 74  p4Int(v, OP_Sort
19930 65 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74  erCompare, iSort
19940 65 72 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f 72  er, j2, regRecor
19950 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
19960 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64              pInd
19970 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64  ex->nKeyCol); Vd
19980 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19990 20 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65     sqlite3Unique
199a0 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
199b0 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 70 49 6e  e, OE_Abort, pIn
199c0 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dex);.    sqlite
199d0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
199e0 20 6a 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   j2);.  }else{. 
199f0 20 20 20 2f 2a 20 4d 6f 73 74 20 43 52 45 41 54     /* Most CREAT
19a00 45 20 49 4e 44 45 58 20 61 6e 64 20 52 45 49 4e  E INDEX and REIN
19a10 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 74  DEX statements t
19a20 68 61 74 20 61 72 65 20 6e 6f 74 20 55 4e 49 51  hat are not UNIQ
19a30 55 45 20 63 61 6e 20 6e 6f 74 0a 20 20 20 20 2a  UE can not.    *
19a40 2a 20 61 62 6f 72 74 2e 20 54 68 65 20 65 78 63  * abort. The exc
19a50 65 70 74 69 6f 6e 20 69 73 20 69 66 20 6f 6e 65  eption is if one
19a60 20 6f 66 20 74 68 65 20 69 6e 64 65 78 65 64 20   of the indexed 
19a70 65 78 70 72 65 73 73 69 6f 6e 73 20 63 6f 6e 74  expressions cont
19a80 61 69 6e 73 20 61 0a 20 20 20 20 2a 2a 20 75 73  ains a.    ** us
19a90 65 72 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  er function that
19aa0 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70   throws an excep
19ab0 74 69 6f 6e 20 77 68 65 6e 20 69 74 20 69 73 20  tion when it is 
19ac0 65 76 61 6c 75 61 74 65 64 2e 20 42 75 74 20 74  evaluated. But t
19ad0 68 65 0a 20 20 20 20 2a 2a 20 6f 76 65 72 68 65  he.    ** overhe
19ae0 61 64 20 6f 66 20 61 64 64 69 6e 67 20 61 20 73  ad of adding a s
19af0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
19b00 20 74 6f 20 61 20 43 52 45 41 54 45 20 49 4e 44   to a CREATE IND
19b10 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  EX statement is.
19b20 20 20 20 20 2a 2a 20 76 65 72 79 20 73 6d 61 6c      ** very smal
19b30 6c 20 28 73 69 6e 63 65 20 6d 6f 73 74 20 6f 66  l (since most of
19b40 20 74 68 65 20 70 61 67 65 73 20 77 72 69 74 74   the pages writt
19b50 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69  en do not contai
19b60 6e 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 0a 20  n content that. 
19b70 20 20 20 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62     ** needs to b
19b80 65 20 72 65 73 74 6f 72 65 64 20 69 66 20 74 68  e restored if th
19b90 65 20 73 74 61 74 65 6d 65 6e 74 20 61 62 6f 72  e statement abor
19ba0 74 73 29 2c 20 73 6f 20 77 65 20 63 61 6c 6c 20  ts), so we call 
19bb0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d  .    ** sqlite3M
19bc0 61 79 41 62 6f 72 74 28 29 20 66 6f 72 20 61 6c  ayAbort() for al
19bd0 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  l CREATE INDEX s
19be0 74 61 74 65 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20  tatements.  */. 
19bf0 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
19c00 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  rt(pParse);.    
19c10 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
19c20 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
19c30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
19c40 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
19c50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69 53 6f  _SorterData, iSo
19c60 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 2c  rter, regRecord,
19c70 20 69 49 64 78 29 3b 0a 20 20 69 66 28 20 21 70   iIdx);.  if( !p
19c80 49 6e 64 65 78 2d 3e 62 41 73 63 4b 65 79 42 75  Index->bAscKeyBu
19c90 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
19ca0 20 4f 50 5f 53 65 65 6b 45 6e 64 20 6f 70 63 6f   OP_SeekEnd opco
19cb0 64 65 20 6d 61 6b 65 73 20 69 6e 64 65 78 20 69  de makes index i
19cc0 6e 73 65 72 74 20 66 6f 72 20 61 20 52 45 49 4e  nsert for a REIN
19cd0 44 45 58 20 67 6f 20 6d 75 63 68 0a 20 20 20 20  DEX go much.    
19ce0 2a 2a 20 66 61 73 74 65 72 20 62 79 20 61 76 6f  ** faster by avo
19cf0 69 64 69 6e 67 20 75 6e 6e 65 63 65 73 73 61 72  iding unnecessar
19d00 79 20 73 65 65 6b 73 2e 20 20 42 75 74 20 74 68  y seeks.  But th
19d10 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 64  e optimization d
19d20 6f 65 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 77  oes.    ** not w
19d30 6f 72 6b 20 66 6f 72 20 55 4e 49 51 55 45 20 63  ork for UNIQUE c
19d40 6f 6e 73 74 72 61 69 6e 74 20 69 6e 64 65 78 65  onstraint indexe
19d50 73 20 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57  s on WITHOUT ROW
19d60 49 44 20 74 61 62 6c 65 73 0a 20 20 20 20 2a 2a  ID tables.    **
19d70 20 77 69 74 68 20 44 45 53 43 20 70 72 69 6d 61   with DESC prima
19d80 72 79 20 6b 65 79 73 2c 20 73 69 6e 63 65 20 74  ry keys, since t
19d90 68 6f 73 65 20 69 6e 64 65 78 65 73 20 68 61 76  hose indexes hav
19da0 65 20 74 68 65 72 65 20 6b 65 79 73 20 69 6e 0a  e there keys in.
19db0 20 20 20 20 2a 2a 20 61 20 64 69 66 66 65 72 65      ** a differe
19dc0 6e 74 20 6f 72 64 65 72 20 66 72 6f 6d 20 74 68  nt order from th
19dd0 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 20 20  e main table..  
19de0 20 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 3a    ** See ticket:
19df0 20 68 74 74 70 73 3a 2f 2f 77 77 77 2e 73 71 6c   https://www.sql
19e00 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f  ite.org/src/info
19e10 2f 62 62 61 37 62 36 39 66 39 38 34 39 62 35 62  /bba7b69f9849b5b
19e20 66 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  f.    */.    sql
19e30 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
19e40 2c 20 4f 50 5f 53 65 65 6b 45 6e 64 2c 20 69 49  , OP_SeekEnd, iI
19e50 64 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  dx);.  }.  sqlit
19e60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19e70 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49  OP_IdxInsert, iI
19e80 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  dx, regRecord);.
19e90 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
19ea0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
19eb0 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
19ec0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
19ed0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
19ee0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
19ef0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19f00 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
19f10 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64 72 32  , iSorter, addr2
19f20 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
19f30 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
19f40 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
19f50 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56  r1);..  sqlite3V
19f60 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
19f70 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20  Close, iTab);.  
19f80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19f90 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
19fa0 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Idx);.  sqlite3V
19fb0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
19fc0 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29 3b  Close, iSorter);
19fd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
19fe0 74 65 20 68 65 61 70 20 73 70 61 63 65 20 74 6f  te heap space to
19ff0 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f   hold an Index o
1a000 62 6a 65 63 74 20 77 69 74 68 20 6e 43 6f 6c 20  bject with nCol 
1a010 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  columns..**.** I
1a020 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f  ncrease the allo
1a030 63 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70  cation size to p
1a040 72 6f 76 69 64 65 20 61 6e 20 65 78 74 72 61 20  rovide an extra 
1a050 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20  nExtra bytes.** 
1a060 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  of 8-byte aligne
1a070 64 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68  d space after th
1a080 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 61  e Index object a
1a090 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70  nd return a.** p
1a0a0 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 65  ointer to this e
1a0b0 78 74 72 61 20 73 70 61 63 65 20 69 6e 20 2a 70  xtra space in *p
1a0c0 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78  pExtra..*/.Index
1a0d0 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74   *sqlite3Allocat
1a0e0 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20 20  eIndexObject(.  
1a0f0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1a100 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1a110 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1a120 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20   i16 nCol,      
1a130 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
1a140 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
1a150 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   in the index */
1a160 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
1a170 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a180 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 65 78  r of bytes of ex
1a190 74 72 61 20 73 70 61 63 65 20 74 6f 20 61 6c 6c  tra space to all
1a1a0 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  oc */.  char **p
1a1b0 70 45 78 74 72 61 20 20 20 20 20 20 20 2f 2a 20  pExtra       /* 
1a1c0 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  Pointer to the "
1a1d0 65 78 74 72 61 22 20 73 70 61 63 65 20 2a 2f 0a  extra" space */.
1a1e0 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20 20  ){.  Index *p;  
1a1f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
1a200 6f 63 61 74 65 64 20 69 6e 64 65 78 20 6f 62 6a  ocated index obj
1a210 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  ect */.  int nBy
1a220 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te;           /*
1a230 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
1a240 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  for Index object
1a250 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20   + arrays */..  
1a260 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73  nByte = ROUND8(s
1a270 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 20 2b 20  izeof(Index)) + 
1a280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a290 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
1a2a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f   */.          RO
1a2b0 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72  UND8(sizeof(char
1a2c0 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20  *)*nCol) +      
1a2d0 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f     /* Index.azCo
1a2e0 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  ll     */.      
1a2f0 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f      ROUND8(sizeo
1a300 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b  f(LogEst)*(nCol+
1a310 31 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e 64 65  1) +     /* Inde
1a320 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 20 20  x.aiRowLogEst   
1a330 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1a340 20 20 20 20 73 69 7a 65 6f 66 28 69 31 36 29 2a      sizeof(i16)*
1a350 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20  nCol +          
1a360 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c    /* Index.aiCol
1a370 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  umn   */.       
1a380 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
1a390 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20  (u8)*nCol);     
1a3a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1a3b0 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20  .aSortOrder */. 
1a3c0 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
1a3d0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
1a3e0 74 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20  te + nExtra);.  
1a3f0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68 61  if( p ){.    cha
1a400 72 20 2a 70 45 78 74 72 61 20 3d 20 28 28 63 68  r *pExtra = ((ch
1a410 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28 73 69  ar*)p)+ROUND8(si
1a420 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20  zeof(Index));.  
1a430 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63    p->azColl = (c
1a440 6f 6e 73 74 20 63 68 61 72 2a 2a 29 70 45 78 74  onst char**)pExt
1a450 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 52 4f  ra; pExtra += RO
1a460 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72  UND8(sizeof(char
1a470 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d  *)*nCol);.    p-
1a480 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 28  >aiRowLogEst = (
1a490 4c 6f 67 45 73 74 2a 29 70 45 78 74 72 61 3b 20  LogEst*)pExtra; 
1a4a0 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66  pExtra += sizeof
1a4b0 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31  (LogEst)*(nCol+1
1a4c0 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75  );.    p->aiColu
1a4d0 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45 78 74 72  mn = (i16*)pExtr
1a4e0 61 3b 20 20 20 20 20 20 20 70 45 78 74 72 61 20  a;       pExtra 
1a4f0 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e  += sizeof(i16)*n
1a500 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53 6f 72  Col;.    p->aSor
1a510 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 70 45  tOrder = (u8*)pE
1a520 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f  xtra;.    p->nCo
1a530 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20  lumn = nCol;.   
1a540 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43   p->nKeyCol = nC
1a550 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70 70 45  ol - 1;.    *ppE
1a560 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70  xtra = ((char*)p
1a570 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20  ) + nByte;.  }. 
1a580 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1a590 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f  .** If expressio
1a5a0 6e 20 6c 69 73 74 20 70 4c 69 73 74 20 63 6f 6e  n list pList con
1a5b0 74 61 69 6e 73 20 61 6e 20 65 78 70 72 65 73 73  tains an express
1a5c0 69 6f 6e 20 74 68 61 74 20 77 61 73 20 70 61 72  ion that was par
1a5d0 73 65 64 20 77 69 74 68 0a 2a 2a 20 61 6e 20 65  sed with.** an e
1a5e0 78 70 6c 69 63 69 74 20 22 4e 55 4c 4c 53 20 46  xplicit "NULLS F
1a5f0 49 52 53 54 22 20 6f 72 20 22 4e 55 4c 4c 53 20  IRST" or "NULLS 
1a600 4c 41 53 54 22 20 63 6c 61 75 73 65 2c 20 6c 65  LAST" clause, le
1a610 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 0a  ave an error in.
1a620 2a 2a 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  ** pParse and re
1a630 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 4f  turn non-zero. O
1a640 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
1a650 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71   zero..*/.int sq
1a660 6c 69 74 65 33 48 61 73 45 78 70 6c 69 63 69 74  lite3HasExplicit
1a670 4e 75 6c 6c 73 28 50 61 72 73 65 20 2a 70 50 61  Nulls(Parse *pPa
1a680 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  rse, ExprList *p
1a690 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70 4c 69  List){.  if( pLi
1a6a0 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  st ){.    int i;
1a6b0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1a6c0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1a6d0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  +){.      if( pL
1a6e0 69 73 74 2d 3e 61 5b 69 5d 2e 62 4e 75 6c 6c 73  ist->a[i].bNulls
1a6f0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 73   ){.        u8 s
1a700 66 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  f = pList->a[i].
1a710 73 6f 72 74 46 6c 61 67 73 3b 0a 20 20 20 20 20  sortFlags;.     
1a720 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1a730 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 73 75  sg(pParse, "unsu
1a740 70 70 6f 72 74 65 64 20 75 73 65 20 6f 66 20 4e  pported use of N
1a750 55 4c 4c 53 20 25 73 22 2c 20 0a 20 20 20 20 20  ULLS %s", .     
1a760 20 20 20 20 20 20 20 28 73 66 3d 3d 30 20 7c 7c         (sf==0 ||
1a770 20 73 66 3d 3d 33 29 20 3f 20 22 46 49 52 53 54   sf==3) ? "FIRST
1a780 22 20 3a 20 22 4c 41 53 54 22 0a 20 20 20 20 20  " : "LAST".     
1a790 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65     );.        re
1a7a0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
1a7b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1a7c0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
1a7d0 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
1a7e0 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
1a7f0 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d  le.  pName1.pNam
1a800 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  e2 is the name o
1a810 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  f the index .** 
1a820 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20  and pTblList is 
1a830 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
1a840 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
1a850 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
1a860 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
1a870 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
1a880 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
1a890 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
1a8a0 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
1a8b0 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
1a8c0 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
1a8d0 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
1a8e0 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
1a8f0 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
1a900 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
1a910 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
1a920 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
1a930 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
1a940 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
1a950 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
1a960 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
1a970 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
1a980 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
1a990 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
1a9a0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
1a9b0 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
1a9c0 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
1a9d0 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
1a9e0 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
1a9f0 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
1aa00 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
1aa10 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
1aa20 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
1aa30 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
1aa40 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1aa50 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
1aa60 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1aa70 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61    /* All informa
1aa80 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
1aa90 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  parse */.  Token
1aaa0 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
1aab0 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69   First part of i
1aac0 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
1aad0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  e NULL */.  Toke
1aae0 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
1aaf0 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
1ab00 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
1ab10 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72   be NULL */.  Sr
1ab20 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c  cList *pTblName,
1ab30 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64   /* Table to ind
1ab40 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e  ex. Use pParse->
1ab50 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a  pNewTable if 0 *
1ab60 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
1ab70 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74  ist,   /* A list
1ab80 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
1ab90 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
1aba0 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
1abb0 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
1abc0 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
1abd0 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
1abe0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
1abf0 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  art,     /* The 
1ac00 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
1ac10 74 20 62 65 67 69 6e 73 20 74 68 69 73 20 73 74  t begins this st
1ac20 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  atement */.  Exp
1ac30 72 20 2a 70 50 49 57 68 65 72 65 2c 20 20 20 20  r *pPIWhere,    
1ac40 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
1ac50 66 6f 72 20 70 61 72 74 69 61 6c 20 69 6e 64 69  for partial indi
1ac60 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ces */.  int sor
1ac70 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53  tOrder,     /* S
1ac80 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69  ort order of pri
1ac90 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c  mary key when pL
1aca0 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69  ist==NULL */.  i
1acb0 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 2c 20 20  nt ifNotExist,  
1acc0 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20    /* Omit error 
1acd0 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  if index already
1ace0 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 75 38 20   exists */.  u8 
1acf0 69 64 78 54 79 70 65 20 20 20 20 20 20 20 20 20  idxType         
1ad00 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 79 70  /* The index typ
1ad10 65 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  e */.){.  Table 
1ad20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f  *pTab = 0;     /
1ad30 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  * Table to be in
1ad40 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  dexed */.  Index
1ad50 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20   *pIndex = 0;   
1ad60 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
1ad70 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
1ad80 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
1ad90 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1ada0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
1adb0 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
1adc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1add0 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a   characters in z
1ade0 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  Name */.  int i,
1adf0 20 6a 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46   j;.  DbFixer sF
1ae00 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ix;        /* Fo
1ae10 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61  r assigning data
1ae20 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54  base names to pT
1ae30 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  able */.  int so
1ae40 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f  rtOrderMask;   /
1ae50 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53  * 1 to honor DES
1ae60 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74  C in index.  0 t
1ae70 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73  o ignore. */.  s
1ae80 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1ae90 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70  rse->db;.  Db *p
1aea0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
1aeb0 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20  /* The specific 
1aec0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
1aed0 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61 74   the indexed dat
1aee0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
1aef0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
1af00 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1af10 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
1af20 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a   being written *
1af30 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
1af40 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75   = 0;    /* Unqu
1af50 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
1af60 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65  the index to cre
1af70 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ate */.  struct 
1af80 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1af90 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72  ListItem; /* For
1afa0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c   looping over pL
1afb0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ist */.  int nEx
1afc0 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tra = 0;        
1afd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
1afe0 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
1aff0 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20 69   zExtra[] */.  i
1b000 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20 20  nt nExtraCol;   
1b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b020 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
1b030 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  ra columns neede
1b040 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78  d */.  char *zEx
1b050 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tra = 0;        
1b060 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
1b070 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65   space after the
1b080 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   Index object */
1b090 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20  .  Index *pPk = 
1b0a0 30 3b 20 20 20 20 20 20 2f 2a 20 50 52 49 4d 41  0;      /* PRIMA
1b0b0 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72  RY KEY index for
1b0c0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
1b0d0 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20  ables */..  if( 
1b0e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1b0f0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1b100 3e 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  >0 ){.    goto e
1b110 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1b120 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f 44  ;.  }.  if( IN_D
1b130 45 43 4c 41 52 45 5f 56 54 41 42 20 26 26 20 69  ECLARE_VTAB && i
1b140 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49  dxType!=SQLITE_I
1b150 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45  DXTYPE_PRIMARYKE
1b160 59 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  Y ){.    goto ex
1b170 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1b180 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54  .  }.  if( SQLIT
1b190 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
1b1a0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
1b1b0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
1b1c0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1b1d0 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
1b1e0 48 61 73 45 78 70 6c 69 63 69 74 4e 75 6c 6c 73  HasExplicitNulls
1b1f0 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 29 20  (pParse, pList) 
1b200 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
1b210 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1b220 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
1b230 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  nd the table tha
1b240 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
1b250 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c  ed.  Return earl
1b260 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  y if not found..
1b270 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e    */.  if( pTblN
1b280 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f  ame!=0 ){..    /
1b290 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61  * Use the two-pa
1b2a0 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f  rt index name to
1b2b0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64   determine the d
1b2c0 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
1b2d0 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68  to search for th
1b2e0 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74  e table. 'Fix' t
1b2f0 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  he table name to
1b300 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20   this db.    ** 
1b310 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75  before looking u
1b320 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  p the table..   
1b330 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1b340 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32  pName1 && pName2
1b350 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   );.    iDb = sq
1b360 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
1b370 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
1b380 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
1b390 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
1b3a0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
1b3b0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
1b3c0 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20 70  sert( pName && p
1b3d0 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e  Name->z );..#ifn
1b3e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b3f0 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66  TEMPDB.    /* If
1b400 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
1b410 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
1b420 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 61   check if the ta
1b430 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  ble.    ** is a 
1b440 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73  temp table. If s
1b450 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  o, set the datab
1b460 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74  ase to 1. Do not
1b470 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   do this.    ** 
1b480 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20  if initialising 
1b490 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  a database schem
1b4a0 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  a..    */.    if
1b4b0 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
1b4c0 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   ){.      pTab =
1b4d0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
1b4e0 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
1b4f0 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  blName);.      i
1b500 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20  f( pName2->n==0 
1b510 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  && pTab && pTab-
1b520 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
1b530 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
1b540 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b          iDb = 1;
1b550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
1b560 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74  endif..    sqlit
1b570 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
1b580 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69   pParse, iDb, "i
1b590 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ndex", pName);. 
1b5a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
1b5b0 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20  xSrcList(&sFix, 
1b5c0 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20  pTblName) ){.   
1b5d0 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68     /* Because th
1b5e0 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75  e parser constru
1b5f0 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f  cts pTblName fro
1b600 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74  m a single ident
1b610 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20  ifier,.      ** 
1b620 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
1b630 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c  t can never fail
1b640 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
1b650 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(0);.    }.    
1b660 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
1b670 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
1b680 61 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61  arse, 0, &pTblNa
1b690 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61  me->a[0]);.    a
1b6a0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
1b6b0 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54  cFailed==0 || pT
1b6c0 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab==0 );.    if(
1b6d0 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
1b6e0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1b6f0 78 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d  x;.    if( iDb==
1b700 31 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44 62  1 && db->aDb[iDb
1b710 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62 2d  ].pSchema!=pTab-
1b720 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
1b730 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1b740 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
1b750 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 72        "cannot cr
1b760 65 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64 65  eate a TEMP inde
1b770 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61  x on non-TEMP ta
1b780 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20  ble \"%s\"",.   
1b790 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
1b7a0 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
1b7b0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1b7c0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
1b7d0 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
1b7e0 29 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74 65  ) ) pPk = sqlite
1b7f0 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
1b800 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pTab);.  }else{
1b810 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
1b820 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  me==0 );.    ass
1b830 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20 29  ert( pStart==0 )
1b840 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61  ;.    pTab = pPa
1b850 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
1b860 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20      if( !pTab ) 
1b870 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1b880 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20  _index;.    iDb 
1b890 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
1b8a0 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
1b8b0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20  >pSchema);.  }. 
1b8c0 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
1b8d0 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  iDb];..  assert(
1b8e0 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73   pTab!=0 );.  as
1b8f0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
1b900 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  rr==0 );.  if( s
1b910 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
1b920 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
1b930 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20  ite_", 7)==0 .  
1b940 20 20 20 20 20 26 26 20 64 62 2d 3e 69 6e 69 74       && db->init
1b950 2e 62 75 73 79 3d 3d 30 0a 20 20 20 20 20 20 20  .busy==0.       
1b960 26 26 20 70 54 62 6c 4e 61 6d 65 21 3d 30 0a 23  && pTblName!=0.#
1b970 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
1b980 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20  UTHENTICATION.  
1b990 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 55       && sqlite3U
1b9a0 73 65 72 41 75 74 68 54 61 62 6c 65 28 70 54 61  serAuthTable(pTa
1b9b0 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65 6e  b->zName)==0.#en
1b9c0 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
1b9d0 45 5f 41 4c 4c 4f 57 5f 53 51 4c 49 54 45 5f 4d  E_ALLOW_SQLITE_M
1b9e0 41 53 54 45 52 5f 49 4e 44 45 58 0a 20 20 20 20  ASTER_INDEX.    
1b9f0 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
1ba00 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d  ICmp(&pTab->zNam
1ba10 65 5b 37 5d 2c 22 6d 61 73 74 65 72 22 29 21 3d  e[7],"master")!=
1ba20 30 0a 23 65 6e 64 69 66 0a 20 29 7b 0a 20 20 20  0.#endif. ){.   
1ba30 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1ba40 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
1ba50 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  %s may not be in
1ba60 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  dexed", pTab->zN
1ba70 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
1ba80 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1ba90 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
1baa0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
1bab0 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
1bac0 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
1bad0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1bae0 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74  , "views may not
1baf0 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
1bb00 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1bb10 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
1bb20 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
1bb30 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1bb40 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56  LTABLE.  if( IsV
1bb50 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
1bb60 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1bb70 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72  Msg(pParse, "vir
1bb80 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20  tual tables may 
1bb90 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
1bba0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
1bbb0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1bbc0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  }.#endif..  /*. 
1bbd0 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d   ** Find the nam
1bbe0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  e of the index. 
1bbf0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
1bc00 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1bc10 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64  another.  ** ind
1bc20 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68  ex or table with
1bc30 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
1bc40 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65   .  **.  ** Exce
1bc50 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72  ption:  If we ar
1bc60 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61  e reading the na
1bc70 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74  mes of permanent
1bc80 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68   indices from th
1bc90 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  e.  ** sqlite_ma
1bca0 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61  ster table (beca
1bcb0 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  use some other p
1bcc0 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74  rocess changed t
1bcd0 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20  he schema) and. 
1bce0 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   ** one of the i
1bcf0 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69  ndex names colli
1bd00 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d  des with the nam
1bd10 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79  e of a temporary
1bd20 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69   table or.  ** i
1bd30 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69  ndex, then we wi
1bd40 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70  ll continue to p
1bd50 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65  rocess this inde
1bd60 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  x..  **.  ** If 
1bd70 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  pName==0 it mean
1bd80 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20  s that we are.  
1bd90 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  ** dealing with 
1bda0 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
1bdb0 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
1bdc0 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  nt.  We have to 
1bdd0 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20  invent our.  ** 
1bde0 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  own name..  */. 
1bdf0 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
1be00 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
1be10 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1be20 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b, pName);.    i
1be30 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
1be40 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1be50 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
1be60 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b  ( pName->z!=0 );
1be70 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
1be80 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
1be90 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
1bea0 65 2c 20 7a 4e 61 6d 65 2c 22 69 6e 64 65 78 22  e, zName,"index"
1beb0 2c 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 20 29 7b  ,pTab->zName) ){
1bec0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1bed0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1bee0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 49 4e     }.    if( !IN
1bef0 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
1bf00 7b 0a 20 20 20 20 20 20 69 66 28 20 21 64 62 2d  {.      if( !db-
1bf10 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
1bf20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1bf30 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
1bf40 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20  Name, 0)!=0 ){. 
1bf50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1bf60 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1bf70 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
1bf80 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64  dy a table named
1bf90 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
1bfa0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
1bfb0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1bfc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bfd0 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  }.      if( sqli
1bfe0 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
1bff0 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 44 62   zName, pDb->zDb
1c000 53 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  SName)!=0 ){.   
1c010 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45       if( !ifNotE
1c020 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  xist ){.        
1c030 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1c040 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
1c050 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73   %s already exis
1c060 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ts", zName);.   
1c070 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c080 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
1c090 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
1c0a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1c0b0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
1c0c0 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
1c0d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c0e0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1c0f0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
1c100 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
1c110 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
1c120 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20  Index *pLoop;.  
1c130 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62    for(pLoop=pTab
1c140 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70  ->pIndex, n=1; p
1c150 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
1c160 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d  p->pNext, n++){}
1c170 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
1c180 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1c190 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65  "sqlite_autoinde
1c1a0 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e  x_%s_%d", pTab->
1c1b0 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69  zName, n);.    i
1c1c0 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
1c1d0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1c1e0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1c1f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 75 74 6f 6d   }..    /* Autom
1c200 61 74 69 63 20 69 6e 64 65 78 20 6e 61 6d 65 73  atic index names
1c210 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
1c220 77 69 74 68 69 6e 20 73 71 6c 69 74 65 33 5f 64  within sqlite3_d
1c230 65 63 6c 61 72 65 5f 76 74 61 62 28 29 0a 20 20  eclare_vtab().  
1c240 20 20 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 6e    ** must have n
1c250 61 6d 65 73 20 74 68 61 74 20 61 72 65 20 64 69  ames that are di
1c260 73 74 69 6e 63 74 20 66 72 6f 6d 20 6e 6f 72 6d  stinct from norm
1c270 61 6c 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  al automatic ind
1c280 65 78 20 6e 61 6d 65 73 2e 0a 20 20 20 20 2a 2a  ex names..    **
1c290 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
1c2a0 74 61 74 65 6d 65 6e 74 20 63 6f 6e 76 65 72 74  tatement convert
1c2b0 73 20 22 73 71 6c 69 74 65 33 5f 61 75 74 6f 69  s "sqlite3_autoi
1c2c0 6e 64 65 78 2e 2e 2e 22 20 69 6e 74 6f 0a 20 20  ndex..." into.  
1c2d0 20 20 2a 2a 20 22 73 71 6c 69 74 65 33 5f 62 75    ** "sqlite3_bu
1c2e0 74 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e 20 6f  toindex..." in o
1c2f0 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 74 68 65  rder to make the
1c300 20 6e 61 6d 65 73 20 64 69 73 74 69 6e 63 74 2e   names distinct.
1c310 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 76 74 61  .    ** The "vta
1c320 62 5f 65 72 72 2e 74 65 73 74 22 20 74 65 73 74  b_err.test" test
1c330 20 64 65 6d 6f 6e 73 74 72 61 74 65 73 20 74 68   demonstrates th
1c340 65 20 6e 65 65 64 20 6f 66 20 74 68 69 73 20 73  e need of this s
1c350 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20  tatement. */.   
1c360 20 69 66 28 20 49 4e 5f 53 50 45 43 49 41 4c 5f   if( IN_SPECIAL_
1c370 50 41 52 53 45 20 29 20 7a 4e 61 6d 65 5b 37 5d  PARSE ) zName[7]
1c380 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  ++;.  }..  /* Ch
1c390 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a  eck for authoriz
1c3a0 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  ation to create 
1c3b0 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23  an index..  */.#
1c3c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c3d0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
1c3e0 0a 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d  .  if( !IN_RENAM
1c3f0 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
1c400 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
1c410 3d 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 3b  = pDb->zDbSName;
1c420 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1c430 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1c440 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
1c450 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
1c460 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  b), 0, zDb) ){. 
1c470 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1c480 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1c490 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
1c4a0 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
1c4b0 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
1c4c0 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
1c4d0 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
1c4e0 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
1c4f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
1c500 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1c510 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
1c520 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
1c530 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1c540 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1c550 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1c560 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
1c570 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
1c580 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
1c590 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
1c5a0 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
1c5b0 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
1c5c0 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
1c5d0 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
1c5e0 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
1c5f0 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
1c600 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
1c610 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
1c620 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
1c630 20 20 20 54 6f 6b 65 6e 20 70 72 65 76 43 6f 6c     Token prevCol
1c640 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  ;.    Column *pC
1c650 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c  ol = &pTab->aCol
1c660 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a  [pTab->nCol-1];.
1c670 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
1c680 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 55 4e  gs |= COLFLAG_UN
1c690 49 51 55 45 3b 0a 20 20 20 20 73 71 6c 69 74 65  IQUE;.    sqlite
1c6a0 33 54 6f 6b 65 6e 49 6e 69 74 28 26 70 72 65 76  3TokenInit(&prev
1c6b0 43 6f 6c 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  Col, pCol->zName
1c6c0 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  );.    pList = s
1c6d0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
1c6e0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 0a  pend(pParse, 0,.
1c6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1c700 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
1c710 62 2c 20 54 4b 5f 49 44 2c 20 26 70 72 65 76 43  b, TK_ID, &prevC
1c720 6f 6c 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28  ol, 0));.    if(
1c730 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
1c740 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1c750 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
1c760 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20  pList->nExpr==1 
1c770 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1c780 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64  prListSetSortOrd
1c790 65 72 28 70 4c 69 73 74 2c 20 73 6f 72 74 4f 72  er(pList, sortOr
1c7a0 64 65 72 2c 20 53 51 4c 49 54 45 5f 53 4f 5f 55  der, SQLITE_SO_U
1c7b0 4e 44 45 46 49 4e 45 44 29 3b 0a 20 20 7d 65 6c  NDEFINED);.  }el
1c7c0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
1c7d0 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67  xprListCheckLeng
1c7e0 74 68 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  th(pParse, pList
1c7f0 2c 20 22 69 6e 64 65 78 22 29 3b 0a 20 20 20 20  , "index");.    
1c800 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1c810 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
1c820 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
1c830 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
1c840 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  how many bytes o
1c850 66 20 73 70 61 63 65 20 61 72 65 20 72 65 71 75  f space are requ
1c860 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78  ired to store ex
1c870 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70  plicitly.  ** sp
1c880 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f  ecified collatio
1c890 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73  n sequence names
1c8a0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
1c8b0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
1c8c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
1c8d0 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d   *pExpr = pList-
1c8e0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
1c8f0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d   assert( pExpr!=
1c900 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  0 );.    if( pEx
1c910 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pr->op==TK_COLLA
1c920 54 45 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74  TE ){.      nExt
1c930 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74  ra += (1 + sqlit
1c940 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72  e3Strlen30(pExpr
1c950 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20  ->u.zToken));.  
1c960 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20    }.  }..  /* . 
1c970 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   ** Allocate the
1c980 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
1c990 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20  . .  */.  nName 
1c9a0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1c9b0 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74  0(zName);.  nExt
1c9c0 72 61 43 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50  raCol = pPk ? pP
1c9d0 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a  k->nKeyCol : 1;.
1c9e0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
1c9f0 3e 6e 45 78 70 72 20 2b 20 6e 45 78 74 72 61 43  >nExpr + nExtraC
1ca00 6f 6c 20 3c 3d 20 33 32 37 36 37 20 2f 2a 20 46  ol <= 32767 /* F
1ca10 69 74 73 20 69 6e 20 69 31 36 20 2a 2f 20 29 3b  its in i16 */ );
1ca20 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
1ca30 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78  te3AllocateIndex
1ca40 4f 62 6a 65 63 74 28 64 62 2c 20 70 4c 69 73 74  Object(db, pList
1ca50 2d 3e 6e 45 78 70 72 20 2b 20 6e 45 78 74 72 61  ->nExpr + nExtra
1ca60 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
1ca70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca80 20 20 20 20 20 20 20 20 20 20 20 6e 4e 61 6d 65             nName
1ca90 20 2b 20 6e 45 78 74 72 61 20 2b 20 31 2c 20 26   + nExtra + 1, &
1caa0 7a 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 64  zExtra);.  if( d
1cab0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1cac0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
1cad0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1cae0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47   }.  assert( EIG
1caf0 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
1cb00 54 28 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c  T(pIndex->aiRowL
1cb10 6f 67 45 73 74 29 20 29 3b 0a 20 20 61 73 73 65  ogEst) );.  asse
1cb20 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1cb30 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d  LIGNMENT(pIndex-
1cb40 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49  >azColl) );.  pI
1cb50 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45  ndex->zName = zE
1cb60 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b  xtra;.  zExtra +
1cb70 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 6d  = nName + 1;.  m
1cb80 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e  emcpy(pIndex->zN
1cb90 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ame, zName, nNam
1cba0 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  e+1);.  pIndex->
1cbb0 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20  pTable = pTab;. 
1cbc0 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
1cbd0 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a   = (u8)onError;.
1cbe0 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f    pIndex->uniqNo
1cbf0 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 21  tNull = onError!
1cc00 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64  =OE_None;.  pInd
1cc10 65 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 69 64  ex->idxType = id
1cc20 78 54 79 70 65 3b 0a 20 20 70 49 6e 64 65 78 2d  xType;.  pIndex-
1cc30 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  >pSchema = db->a
1cc40 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
1cc50 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  .  pIndex->nKeyC
1cc60 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ol = pList->nExp
1cc70 72 3b 0a 20 20 69 66 28 20 70 50 49 57 68 65 72  r;.  if( pPIWher
1cc80 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1cc90 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72  ResolveSelfRefer
1cca0 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54 61  ence(pParse, pTa
1ccb0 62 2c 20 4e 43 5f 50 61 72 74 49 64 78 2c 20 70  b, NC_PartIdx, p
1ccc0 50 49 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20  PIWhere, 0);.   
1ccd0 20 70 49 6e 64 65 78 2d 3e 70 50 61 72 74 49 64   pIndex->pPartId
1cce0 78 57 68 65 72 65 20 3d 20 70 50 49 57 68 65 72  xWhere = pPIWher
1ccf0 65 3b 0a 20 20 20 20 70 50 49 57 68 65 72 65 20  e;.    pPIWhere 
1cd00 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
1cd10 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
1cd20 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
1cd30 62 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  b, 0) );..  /* C
1cd40 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
1cd50 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44  e should honor D
1cd60 45 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20  ESC requests on 
1cd70 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20  index columns.  
1cd80 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53  */.  if( pDb->pS
1cd90 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
1cda0 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72  at>=4 ){.    sor
1cdb0 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b  tOrderMask = -1;
1cdc0 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43     /* Honor DESC
1cdd0 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
1cde0 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
1cdf0 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65   0;    /* Ignore
1ce00 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20   DESC */.  }..  
1ce10 2f 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 6c  /* Analyze the l
1ce20 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
1ce30 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65  ns that form the
1ce40 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e   terms of the in
1ce50 64 65 78 20 61 6e 64 0a 20 20 2a 2a 20 72 65 70  dex and.  ** rep
1ce60 6f 72 74 20 61 6e 79 20 65 72 72 6f 72 73 2e 20  ort any errors. 
1ce70 20 49 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   In the common c
1ce80 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 78  ase where the ex
1ce90 70 72 65 73 73 69 6f 6e 20 69 73 20 65 78 61 63  pression is exac
1cea0 74 6c 79 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65  tly.  ** a table
1ceb0 20 63 6f 6c 75 6d 6e 2c 20 73 74 6f 72 65 20 74   column, store t
1cec0 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 69  hat column in ai
1ced0 43 6f 6c 75 6d 6e 5b 5d 2e 20 20 46 6f 72 20 67  Column[].  For g
1cee0 65 6e 65 72 61 6c 20 65 78 70 72 65 73 73 69 6f  eneral expressio
1cef0 6e 73 2c 0a 20 20 2a 2a 20 70 6f 70 75 6c 61 74  ns,.  ** populat
1cf00 65 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78  e pIndex->aColEx
1cf10 70 72 20 61 6e 64 20 73 74 6f 72 65 20 58 4e 5f  pr and store XN_
1cf20 45 58 50 52 20 28 2d 32 29 20 69 6e 20 61 69 43  EXPR (-2) in aiC
1cf30 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a 20 20  olumn[]..  **.  
1cf40 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65 20 61  ** TODO: Issue a
1cf50 20 77 61 72 6e 69 6e 67 20 69 66 20 74 77 6f 20   warning if two 
1cf60 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20  or more columns 
1cf70 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 72 65  of the index are
1cf80 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a   identical..  **
1cf90 20 54 4f 44 4f 3a 20 49 73 73 75 65 20 61 20 77   TODO: Issue a w
1cfa0 61 72 6e 69 6e 67 20 69 66 20 74 68 65 20 74 61  arning if the ta
1cfb0 62 6c 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ble primary key 
1cfc0 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20  is used as part 
1cfd0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  of the.  ** inde
1cfe0 78 20 6b 65 79 2e 0a 20 20 2a 2f 0a 20 20 70 4c  x key..  */.  pL
1cff0 69 73 74 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d  istItem = pList-
1d000 3e 61 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e  >a;.  if( IN_REN
1d010 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
1d020 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78    pIndex->aColEx
1d030 70 72 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  pr = pList;.    
1d040 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  pList = 0;.  }. 
1d050 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64   for(i=0; i<pInd
1d060 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b  ex->nKeyCol; i++
1d070 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a  , pListItem++){.
1d080 20 20 20 20 45 78 70 72 20 2a 70 43 45 78 70 72      Expr *pCExpr
1d090 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d0a0 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 69     /* The i-th i
1d0b0 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f 6e 20  ndex expression 
1d0c0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65  */.    int reque
1d0d0 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 20 20  stedSortOrder;  
1d0e0 20 20 20 20 20 20 2f 2a 20 41 53 43 20 6f 72 20        /* ASC or 
1d0f0 44 45 53 43 20 6f 6e 20 74 68 65 20 69 2d 74 68  DESC on the i-th
1d100 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
1d110 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1d120 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
1d130 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73    /* Collation s
1d140 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a  equence name */.
1d150 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 69  .    sqlite3Stri
1d160 6e 67 54 6f 49 64 28 70 4c 69 73 74 49 74 65 6d  ngToId(pListItem
1d170 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->pExpr);.    sq
1d180 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66  lite3ResolveSelf
1d190 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65  Reference(pParse
1d1a0 2c 20 70 54 61 62 2c 20 4e 43 5f 49 64 78 45 78  , pTab, NC_IdxEx
1d1b0 70 72 2c 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  pr, pListItem->p
1d1c0 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 69 66  Expr, 0);.    if
1d1d0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
1d1e0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1d1f0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70 43 45  e_index;.    pCE
1d200 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1d210 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69  rSkipCollate(pLi
1d220 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a  stItem->pExpr);.
1d230 20 20 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e      if( pCExpr->
1d240 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op!=TK_COLUMN ){
1d250 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
1d260 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62  =pParse->pNewTab
1d270 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  le ){.        sq
1d280 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1d290 61 72 73 65 2c 20 22 65 78 70 72 65 73 73 69 6f  arse, "expressio
1d2a0 6e 73 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e  ns prohibited in
1d2b0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64   PRIMARY KEY and
1d2c0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
1d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2e0 20 20 20 22 55 4e 49 51 55 45 20 63 6f 6e 73 74     "UNIQUE const
1d2f0 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  raints");.      
1d300 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1d310 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
1d320 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 64  }.      if( pInd
1d330 65 78 2d 3e 61 43 6f 6c 45 78 70 72 3d 3d 30 20  ex->aColExpr==0 
1d340 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
1d350 78 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70 4c  x->aColExpr = pL
1d360 69 73 74 3b 0a 20 20 20 20 20 20 20 20 70 4c 69  ist;.        pLi
1d370 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  st = 0;.      }.
1d380 20 20 20 20 20 20 6a 20 3d 20 58 4e 5f 45 58 50        j = XN_EXP
1d390 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  R;.      pIndex-
1d3a0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58  >aiColumn[i] = X
1d3b0 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49  N_EXPR;.      pI
1d3c0 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  ndex->uniqNotNul
1d3d0 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  l = 0;.    }else
1d3e0 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 43 45 78  {.      j = pCEx
1d3f0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
1d400 20 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 30 78     assert( j<=0x
1d410 37 66 66 66 20 29 3b 0a 20 20 20 20 20 20 69 66  7fff );.      if
1d420 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( j<0 ){.       
1d430 20 6a 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79   j = pTab->iPKey
1d440 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1d450 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ( pTab->aCol[j].
1d460 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20  notNull==0 ){.  
1d470 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e        pIndex->un
1d480 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20  iqNotNull = 0;. 
1d490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
1d4a0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
1d4b0 20 3d 20 28 69 31 36 29 6a 3b 0a 20 20 20 20 7d   = (i16)j;.    }
1d4c0 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a  .    zColl = 0;.
1d4d0 20 20 20 20 69 66 28 20 70 4c 69 73 74 49 74 65      if( pListIte
1d4e0 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  m->pExpr->op==TK
1d4f0 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20  _COLLATE ){.    
1d500 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20    int nColl;.   
1d510 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74     zColl = pList
1d520 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a  Item->pExpr->u.z
1d530 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f  Token;.      nCo
1d540 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  ll = sqlite3Strl
1d550 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b  en30(zColl) + 1;
1d560 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
1d570 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a  Extra>=nColl );.
1d580 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 78        memcpy(zEx
1d590 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c  tra, zColl, nCol
1d5a0 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20  l);.      zColl 
1d5b0 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20  = zExtra;.      
1d5c0 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b  zExtra += nColl;
1d5d0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2d 3d  .      nExtra -=
1d5e0 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73   nColl;.    }els
1d5f0 65 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20  e if( j>=0 ){.  
1d600 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62      zColl = pTab
1d610 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[j].zColl;
1d620 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
1d630 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20  zColl ) zColl = 
1d640 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
1d650 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  ;.    if( !db->i
1d660 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c  nit.busy && !sql
1d670 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
1d680 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  q(pParse, zColl)
1d690 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
1d6a0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1d6b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
1d6c0 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20  ex->azColl[i] = 
1d6d0 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65  zColl;.    reque
1d6e0 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20  stedSortOrder = 
1d6f0 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 46  pListItem->sortF
1d700 6c 61 67 73 20 26 20 73 6f 72 74 4f 72 64 65 72  lags & sortOrder
1d710 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78  Mask;.    pIndex
1d720 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1d730 3d 20 28 75 38 29 72 65 71 75 65 73 74 65 64 53  = (u8)requestedS
1d740 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
1d750 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 74   /* Append the t
1d760 61 62 6c 65 20 6b 65 79 20 74 6f 20 74 68 65 20  able key to the 
1d770 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
1d780 2e 20 20 46 6f 72 20 57 49 54 48 4f 55 54 20 52  .  For WITHOUT R
1d790 4f 57 49 44 0a 20 20 2a 2a 20 74 61 62 6c 65 73  OWID.  ** tables
1d7a0 20 28 77 68 65 6e 20 70 50 6b 21 3d 30 29 20 74   (when pPk!=0) t
1d7b0 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
1d7c0 64 65 63 6c 61 72 65 64 20 50 52 49 4d 41 52 59  declared PRIMARY
1d7d0 20 4b 45 59 2e 20 20 46 6f 72 0a 20 20 2a 2a 20   KEY.  For.  ** 
1d7e0 6e 6f 72 6d 61 6c 20 74 61 62 6c 65 73 20 28 77  normal tables (w
1d7f0 68 65 6e 20 70 50 6b 3d 3d 30 29 20 74 68 69 73  hen pPk==0) this
1d800 20 77 69 6c 6c 20 62 65 20 74 68 65 20 72 6f 77   will be the row
1d810 69 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  id..  */.  if( p
1d820 50 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  Pk ){.    for(j=
1d830 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f  0; j<pPk->nKeyCo
1d840 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; j++){.      i
1d850 6e 74 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f  nt x = pPk->aiCo
1d860 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 61  lumn[j];.      a
1d870 73 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20  ssert( x>=0 );. 
1d880 20 20 20 20 20 69 66 28 20 69 73 44 75 70 43 6f       if( isDupCo
1d890 6c 75 6d 6e 28 70 49 6e 64 65 78 2c 20 70 49 6e  lumn(pIndex, pIn
1d8a0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50  dex->nKeyCol, pP
1d8b0 6b 2c 20 6a 29 20 29 7b 0a 20 20 20 20 20 20 20  k, j) ){.       
1d8c0 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
1d8d0 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73 65  --; .      }else
1d8e0 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
1d8f0 73 65 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49  se( hasColumn(pI
1d900 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 70  ndex->aiColumn,p
1d910 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 78  Index->nKeyCol,x
1d920 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  ) );.        pIn
1d930 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
1d940 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 49   = x;.        pI
1d950 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20  ndex->azColl[i] 
1d960 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d  = pPk->azColl[j]
1d970 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ;.        pIndex
1d980 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1d990 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65  = pPk->aSortOrde
1d9a0 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b  r[j];.        i+
1d9b0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
1d9c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d  .    assert( i==
1d9d0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
1d9e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1d9f0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1da00 5b 69 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a  [i] = XN_ROWID;.
1da10 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
1da20 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 53  ll[i] = sqlite3S
1da30 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 20 20  trBINARY;.  }.  
1da40 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f  sqlite3DefaultRo
1da50 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 20 20  wEst(pIndex);.  
1da60 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  if( pParse->pNew
1da70 54 61 62 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d  Table==0 ) estim
1da80 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49  ateIndexWidth(pI
1da90 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ndex);..  /* If 
1daa0 74 68 69 73 20 69 6e 64 65 78 20 63 6f 6e 74 61  this index conta
1dab0 69 6e 73 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e  ins every column
1dac0 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2c 20 74   of its table, t
1dad0 68 65 6e 20 6d 61 72 6b 0a 20 20 2a 2a 20 69 74  hen mark.  ** it
1dae0 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69   as a covering i
1daf0 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74  ndex */.  assert
1db00 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
1db10 20 0a 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d   .      || pTab-
1db20 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 73 71 6c 69  >iPKey<0 || sqli
1db30 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
1db40 28 70 49 6e 64 65 78 2c 20 70 54 61 62 2d 3e 69  (pIndex, pTab->i
1db50 50 4b 65 79 29 3e 3d 30 20 29 3b 0a 20 20 72 65  PKey)>=0 );.  re
1db60 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f  computeColumnsNo
1db70 74 49 6e 64 65 78 65 64 28 70 49 6e 64 65 78 29  tIndexed(pIndex)
1db80 3b 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65  ;.  if( pTblName
1db90 21 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 6e  !=0 && pIndex->n
1dba0 43 6f 6c 75 6d 6e 3e 3d 70 54 61 62 2d 3e 6e 43  Column>=pTab->nC
1dbb0 6f 6c 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  ol ){.    pIndex
1dbc0 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31  ->isCovering = 1
1dbd0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1dbe0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
1dbf0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d  ){.      if( j==
1dc00 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f  pTab->iPKey ) co
1dc10 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
1dc20 28 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  ( sqlite3ColumnO
1dc30 66 49 6e 64 65 78 28 70 49 6e 64 65 78 2c 6a 29  fIndex(pIndex,j)
1dc40 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  >=0 ) continue;.
1dc50 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 69 73        pIndex->is
1dc60 43 6f 76 65 72 69 6e 67 20 3d 20 30 3b 0a 20 20  Covering = 0;.  
1dc70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1dc80 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 61 62  .  }..  if( pTab
1dc90 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ==pParse->pNewTa
1dca0 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ble ){.    /* Th
1dcb0 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62  is routine has b
1dcc0 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  een called to cr
1dcd0 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69  eate an automati
1dce0 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20  c index as a.   
1dcf0 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20   ** result of a 
1dd00 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
1dd10 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20  NIQUE clause on 
1dd20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  a column definit
1dd30 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  ion, or.    ** a
1dd40 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
1dd50 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f  UNIQUE clause fo
1dd60 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75  llowing the colu
1dd70 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a  mn definitions..
1dd80 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20      ** i.e. one 
1dd90 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
1dda0 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
1ddb0 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
1ddc0 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54  y);.    ** CREAT
1ddd0 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20  E TABLE t(x, y, 
1dde0 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
1ddf0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74     **.    ** Eit
1de00 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74  her way, check t
1de10 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62  o see if the tab
1de20 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73  le already has s
1de30 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66  uch an index. If
1de40 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27  .    ** so, don'
1de50 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e  t bother creatin
1de60 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73  g this one. This
1de70 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f   only applies to
1de80 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
1de90 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e  cally created in
1dea0 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e  dices. Users can
1deb0 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68   do as they wish
1dec0 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70   with.    ** exp
1ded0 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20  licit indices.. 
1dee0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f     **.    ** Two
1def0 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41   UNIQUE or PRIMA
1df00 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
1df10 74 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  ts are considere
1df20 64 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20  d equivalent.   
1df30 20 2a 2a 20 28 61 6e 64 20 74 68 75 73 20 73 75   ** (and thus su
1df40 70 70 72 65 73 73 69 6e 67 20 74 68 65 20 73 65  ppressing the se
1df50 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20 69  cond one) even i
1df60 66 20 74 68 65 79 20 68 61 76 65 20 64 69 66 66  f they have diff
1df70 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72  erent.    ** sor
1df80 74 20 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a  t orders..    **
1df90 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
1dfa0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 63   are different c
1dfb0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1dfc0 65 73 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6c  es or if the col
1dfd0 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74  umns of.    ** t
1dfe0 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63  he constraint oc
1dff0 63 75 72 20 69 6e 20 64 69 66 66 65 72 65 6e 74  cur in different
1e000 20 6f 72 64 65 72 73 2c 20 74 68 65 6e 20 74 68   orders, then th
1e010 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  e constraints ar
1e020 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65  e.    ** conside
1e030 72 65 64 20 64 69 73 74 69 6e 63 74 20 61 6e 64  red distinct and
1e040 20 62 6f 74 68 20 72 65 73 75 6c 74 20 69 6e 20   both result in 
1e050 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73  separate indices
1e060 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64  ..    */.    Ind
1e070 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
1e080 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
1e090 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
1e0a0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
1e0b0 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
1e0c0 20 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 75   assert( IsUniqu
1e0d0 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 3b 0a  eIndex(pIdx) );.
1e0e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1e0f0 64 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c  dx->idxType!=SQL
1e100 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
1e110 45 46 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EF );.      asse
1e120 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65  rt( IsUniqueInde
1e130 78 28 70 49 6e 64 65 78 29 20 29 3b 0a 0a 20 20  x(pIndex) );..  
1e140 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b      if( pIdx->nK
1e150 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e  eyCol!=pIndex->n
1e160 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75  KeyCol ) continu
1e170 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  e;.      for(k=0
1e180 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; k<pIdx->nKeyCo
1e190 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; k++){.       
1e1a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b   const char *z1;
1e1b0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
1e1c0 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20  har *z2;.       
1e1d0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
1e1e0 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b  iColumn[k]>=0 );
1e1f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
1e200 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d  x->aiColumn[k]!=
1e210 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1e220 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  [k] ) break;.   
1e230 20 20 20 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e       z1 = pIdx->
1e240 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20  azColl[k];.     
1e250 20 20 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e     z2 = pIndex->
1e260 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20  azColl[k];.     
1e270 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1e280 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20  rICmp(z1, z2) ) 
1e290 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1e2a0 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78       if( k==pIdx
1e2b0 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  ->nKeyCol ){.   
1e2c0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
1e2d0 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e  nError!=pIndex->
1e2e0 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  onError ){.     
1e2f0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
1e300 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20  straint creates 
1e310 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61  the same index a
1e320 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  s a previous.   
1e330 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
1e340 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73  aint specified s
1e350 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20  omewhere in the 
1e360 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
1e370 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20  tement..        
1e380 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65    ** However the
1e390 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
1e3a0 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65  uses are differe
1e3b0 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73  nt. If both this
1e3c0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63   .          ** c
1e3d0 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
1e3e0 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76  e previous equiv
1e3f0 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74  alent constraint
1e400 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20   have explicit. 
1e410 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43           ** ON C
1e420 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
1e430 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  this is an error
1e440 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65  . Otherwise, use
1e450 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
1e460 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  * explicitly spe
1e470 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 72 20  cified behavior 
1e480 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  for the index.. 
1e490 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1e4a0 20 20 20 20 20 20 69 66 28 20 21 28 70 49 64 78        if( !(pIdx
1e4b0 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
1e4c0 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d  fault || pIndex-
1e4d0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
1e4e0 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20  ault) ){.       
1e4f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1e500 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
1e510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
1e520 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f  onflicting ON CO
1e530 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73  NFLICT clauses s
1e540 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20  pecified", 0);. 
1e550 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e560 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
1e570 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
1e580 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  lt ){.          
1e590 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20    pIdx->onError 
1e5a0 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  = pIndex->onErro
1e5b0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
1e5c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e5d0 20 69 66 28 20 69 64 78 54 79 70 65 3d 3d 53 51   if( idxType==SQ
1e5e0 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49  LITE_IDXTYPE_PRI
1e5f0 4d 41 52 59 4b 45 59 20 29 20 70 49 64 78 2d 3e  MARYKEY ) pIdx->
1e600 69 64 78 54 79 70 65 20 3d 20 69 64 78 54 79 70  idxType = idxTyp
1e610 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  e;.        if( I
1e620 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
1e630 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 6e  ){.          pIn
1e640 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61  dex->pNext = pPa
1e650 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78 3b 0a  rse->pNewIndex;.
1e660 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
1e670 2d 3e 70 4e 65 77 49 6e 64 65 78 20 3d 20 70 49  ->pNewIndex = pI
1e680 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20  ndex;.          
1e690 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
1e6a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f      }.        go
1e6b0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1e6c0 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
1e6d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21    }.  }..  if( !
1e6e0 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
1e6f0 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b   ){..    /* Link
1e700 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73   the new Index s
1e710 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20  tructure to its 
1e720 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65  table and to the
1e730 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 69 6e   other.    ** in
1e740 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1e750 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20   structures. .  
1e760 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1e770 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
1e780 20 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   );.    if( db->
1e790 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
1e7a0 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
1e7b0 20 20 20 61 73 73 65 72 74 28 20 21 49 4e 5f 53     assert( !IN_S
1e7c0 50 45 43 49 41 4c 5f 50 41 52 53 45 20 29 3b 0a  PECIAL_PARSE );.
1e7d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
1e7e0 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
1e7f0 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64  Held(db, 0, pInd
1e800 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a  ex->pSchema) );.
1e810 20 20 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61        if( pTblNa
1e820 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me!=0 ){.       
1e830 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
1e840 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
1e850 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
1e860 6c 69 74 65 33 49 6e 64 65 78 48 61 73 44 75 70  lite3IndexHasDup
1e870 6c 69 63 61 74 65 52 6f 6f 74 50 61 67 65 28 70  licateRootPage(p
1e880 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20  Index) ){.      
1e890 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1e8a0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 76  Msg(pParse, "inv
1e8b0 61 6c 69 64 20 72 6f 6f 74 70 61 67 65 22 29 3b  alid rootpage");
1e8c0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
1e8d0 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  e->rc = SQLITE_C
1e8e0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1e8f0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
1e900 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1e910 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e920 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74  .      p = sqlit
1e930 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 49  e3HashInsert(&pI
1e940 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69  ndex->pSchema->i
1e950 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  dxHash, .       
1e960 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
1e970 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  , pIndex);.     
1e980 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
1e990 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e    assert( p==pIn
1e9a0 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  dex );  /* Mallo
1e9b0 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
1e9c0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  ed */.        sq
1e9d0 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
1e9e0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
1e9f0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1ea00 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
1ea10 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d   db->mDbFlags |=
1ea20 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68   DBFLAG_SchemaCh
1ea30 61 6e 67 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ange;.    }..   
1ea40 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
1ea50 68 65 20 69 6e 69 74 69 61 6c 20 43 52 45 41 54  he initial CREAT
1ea60 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
1ea70 74 20 28 6f 72 20 43 52 45 41 54 45 20 54 41 42  t (or CREATE TAB
1ea80 4c 45 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a  LE if the.    **
1ea90 20 69 6e 64 65 78 20 69 73 20 61 6e 20 69 6d 70   index is an imp
1eaa0 6c 69 65 64 20 69 6e 64 65 78 20 66 6f 72 20 61  lied index for a
1eab0 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41   UNIQUE or PRIMA
1eac0 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
1ead0 74 29 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 65  t) then.    ** e
1eae0 6d 69 74 20 63 6f 64 65 20 74 6f 20 61 6c 6c 6f  mit code to allo
1eaf0 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 72  cate the index r
1eb00 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69 73 6b 20  ootpage on disk 
1eb10 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72  and make an entr
1eb20 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74 68 65  y for.    ** the
1eb30 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 73 71   index in the sq
1eb40 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
1eb50 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74  e and populate t
1eb60 68 65 20 69 6e 64 65 78 20 77 69 74 68 0a 20 20  he index with.  
1eb70 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 42    ** content.  B
1eb80 75 74 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  ut, do not do th
1eb90 69 73 20 69 66 20 77 65 20 61 72 65 20 73 69 6d  is if we are sim
1eba0 70 6c 79 20 72 65 61 64 69 6e 67 20 74 68 65 20  ply reading the 
1ebb0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20  sqlite_master.  
1ebc0 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 70 61    ** table to pa
1ebd0 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2c 20  rse the schema, 
1ebe0 6f 72 20 69 66 20 74 68 69 73 20 69 6e 64 65 78  or if this index
1ebf0 20 69 73 20 74 68 65 20 50 52 49 4d 41 52 59 20   is the PRIMARY 
1ec00 4b 45 59 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  KEY index.    **
1ec10 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f   of a WITHOUT RO
1ec20 57 49 44 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  WID table..    *
1ec30 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70 54 62 6c  *.    ** If pTbl
1ec40 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
1ec50 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67   this index is g
1ec60 65 6e 65 72 61 74 65 64 20 61 73 20 61 6e 20 69  enerated as an i
1ec70 6d 70 6c 69 65 64 20 50 52 49 4d 41 52 59 20 4b  mplied PRIMARY K
1ec80 45 59 0a 20 20 20 20 2a 2a 20 6f 72 20 55 4e 49  EY.    ** or UNI
1ec90 51 55 45 20 69 6e 64 65 78 20 69 6e 20 61 20 43  QUE index in a C
1eca0 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
1ecb0 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68  ement.  Since th
1ecc0 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 68  e table.    ** h
1ecd0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65  as just been cre
1ece0 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e  ated, it contain
1ecf0 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68  s no data and th
1ed00 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69  e index initiali
1ed10 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 73 74  zation.    ** st
1ed20 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65  ep can be skippe
1ed30 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65 6c  d..    */.    el
1ed40 73 65 20 69 66 28 20 48 61 73 52 6f 77 69 64 28  se if( HasRowid(
1ed50 70 54 61 62 29 20 7c 7c 20 70 54 62 6c 4e 61 6d  pTab) || pTblNam
1ed60 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 56 64  e!=0 ){.      Vd
1ed70 62 65 20 2a 76 3b 0a 20 20 20 20 20 20 63 68 61  be *v;.      cha
1ed80 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 20 20  r *zStmt;.      
1ed90 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  int iMem = ++pPa
1eda0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20  rse->nMem;..    
1edb0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1edc0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1edd0 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67      if( v==0 ) g
1ede0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1edf0 69 6e 64 65 78 3b 0a 0a 20 20 20 20 20 20 73 71  index;..      sq
1ee00 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1ee10 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
1ee20 20 31 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 20   1, iDb);..     
1ee30 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72   /* Create the r
1ee40 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20  ootpage for the 
1ee50 69 6e 64 65 78 20 75 73 69 6e 67 20 43 72 65 61  index using Crea
1ee60 74 65 49 6e 64 65 78 2e 20 42 75 74 20 62 65 66  teIndex. But bef
1ee70 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 64 6f 69  ore.      ** doi
1ee80 6e 67 20 73 6f 2c 20 63 6f 64 65 20 61 20 4e 6f  ng so, code a No
1ee90 6f 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  op instruction a
1eea0 6e 64 20 73 74 6f 72 65 20 69 74 73 20 61 64 64  nd store its add
1eeb0 72 65 73 73 20 69 6e 20 0a 20 20 20 20 20 20 2a  ress in .      *
1eec0 2a 20 49 6e 64 65 78 2e 74 6e 75 6d 2e 20 54 68  * Index.tnum. Th
1eed0 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20 69  is is required i
1eee0 6e 20 63 61 73 65 20 74 68 69 73 20 69 6e 64 65  n case this inde
1eef0 78 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  x is actually a 
1ef00 0a 20 20 20 20 20 20 2a 2a 20 50 52 49 4d 41 52  .      ** PRIMAR
1ef10 59 20 4b 45 59 20 61 6e 64 20 74 68 65 20 74 61  Y KEY and the ta
1ef20 62 6c 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ble is actually 
1ef30 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
1ef40 74 61 62 6c 65 2e 20 49 6e 20 0a 20 20 20 20 20  table. In .     
1ef50 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 74 68   ** that case th
1ef60 65 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f  e convertToWitho
1ef70 75 74 52 6f 77 69 64 54 61 62 6c 65 28 29 20 72  utRowidTable() r
1ef80 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 70 6c  outine will repl
1ef90 61 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ace.      ** the
1efa0 20 4e 6f 6f 70 20 77 69 74 68 20 61 20 47 6f 74   Noop with a Got
1efb0 6f 20 74 6f 20 6a 75 6d 70 20 6f 76 65 72 20 74  o to jump over t
1efc0 68 65 20 56 44 42 45 20 63 6f 64 65 20 67 65 6e  he VDBE code gen
1efd0 65 72 61 74 65 64 20 62 65 6c 6f 77 2e 20 2a 2f  erated below. */
1efe0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  .      pIndex->t
1eff0 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  num = sqlite3Vdb
1f000 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f  eAddOp0(v, OP_No
1f010 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
1f020 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1f030 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 2c 20  OP_CreateBtree, 
1f040 69 44 62 2c 20 69 4d 65 6d 2c 20 42 54 52 45 45  iDb, iMem, BTREE
1f050 5f 42 4c 4f 42 4b 45 59 29 3b 0a 0a 20 20 20 20  _BLOBKEY);..    
1f060 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20    /* Gather the 
1f070 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
1f080 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
1f090 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f  X statement into
1f0a0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 7a 53  .      ** the zS
1f0b0 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20  tmt variable.   
1f0c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
1f0d0 72 74 28 20 70 4e 61 6d 65 21 3d 30 20 7c 7c 20  rt( pName!=0 || 
1f0e0 70 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20  pStart==0 );.   
1f0f0 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b     if( pStart ){
1f100 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
1f110 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e 73   (int)(pParse->s
1f120 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e  LastToken.z - pN
1f130 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65  ame->z) + pParse
1f140 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a  ->sLastToken.n;.
1f150 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d          if( pNam
1f160 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29  e->z[n-1]==';' )
1f170 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 2f 2a   n--;.        /*
1f180 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77   A named index w
1f190 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20  ith an explicit 
1f1a0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
1f1b0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  tement */.      
1f1c0 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
1f1d0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52  3MPrintf(db, "CR
1f1e0 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a  EATE%s INDEX %.*
1f1f0 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
1f200 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
1f210 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45   ? "" : " UNIQUE
1f220 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b  ", n, pName->z);
1f230 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1f240 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f        /* An auto
1f250 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61  matic index crea
1f260 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52 59  ted by a PRIMARY
1f270 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
1f280 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
1f290 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20       /* zStmt = 
1f2a0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
1f2b0 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a  "); */.        z
1f2c0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1f2d0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20  }..      /* Add 
1f2e0 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69  an entry in sqli
1f2f0 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68  te_master for th
1f300 69 73 20 69 6e 64 65 78 0a 20 20 20 20 20 20 2a  is index.      *
1f310 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  /.      sqlite3N
1f320 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
1f330 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 49  e, .          "I
1f340 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73  NSERT INTO %Q.%s
1f350 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c   VALUES('index',
1f360 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c  %Q,%Q,#%d,%Q);",
1f370 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61  .          db->a
1f380 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
1f390 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20  , MASTER_NAME,. 
1f3a0 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d           pIndex-
1f3b0 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
1f3c0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
1f3d0 20 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20           iMem,. 
1f3e0 20 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20           zStmt. 
1f3f0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
1f400 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1f410 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20  db, zStmt);..   
1f420 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69     /* Fill the i
1f430 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20 61  ndex with data a
1f440 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20 73  nd reparse the s
1f450 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f  chema. Code an O
1f460 50 5f 45 78 70 69 72 65 0a 20 20 20 20 20 20 2a  P_Expire.      *
1f470 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
1f480 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64  all pre-compiled
1f490 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20   statements..   
1f4a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1f4b0 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pTblName ){.    
1f4c0 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
1f4d0 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
1f4e0 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20  Index, iMem);.  
1f4f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61        sqlite3Cha
1f500 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
1f510 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
1f520 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61  sqlite3VdbeAddPa
1f530 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69  rseSchemaOp(v, i
1f540 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
1f550 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
1f560 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e  b, "name='%q' AN
1f570 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c  D type='index'",
1f580 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29   pIndex->zName))
1f590 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1f5a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1f5b0 50 5f 45 78 70 69 72 65 2c 20 30 2c 20 31 29 3b  P_Expire, 0, 1);
1f5c0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1f5d0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1f5e0 65 72 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 74  ere(v, pIndex->t
1f5f0 6e 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  num);.    }.  }.
1f600 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e  .  /* When addin
1f610 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68  g an index to th
1f620 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65  e list of indice
1f630 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d  s for a table, m
1f640 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c  ake.  ** sure al
1f650 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65  l indices labele
1f660 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d  d OE_Replace com
1f670 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73  e after all thos
1f680 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f  e labeled.  ** O
1f690 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20  E_Ignore.  This 
1f6a0 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
1f6b0 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6e   the correct con
1f6c0 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a 20 20  straint check.  
1f6d0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 28 69  ** processing (i
1f6e0 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74  n sqlite3Generat
1f6f0 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b  eConstraintCheck
1f700 73 28 29 29 20 61 73 20 70 61 72 74 20 6f 66 0a  s()) as part of.
1f710 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e 64 20    ** UPDATE and 
1f720 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
1f730 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  s.  .  */.  if( 
1f740 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
1f750 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a   pTblName==0 ){.
1f760 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21      if( onError!
1f770 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70  =OE_Replace || p
1f780 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20  Tab->pIndex==0. 
1f790 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d          || pTab-
1f7a0 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  >pIndex->onError
1f7b0 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20  ==OE_Replace){. 
1f7c0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
1f7d0 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  xt = pTab->pInde
1f7e0 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70  x;.      pTab->p
1f7f0 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
1f800 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f810 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d   Index *pOther =
1f820 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
1f830 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68       while( pOth
1f840 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74  er->pNext && pOt
1f850 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72  her->pNext->onEr
1f860 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
1f870 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65  ){.        pOthe
1f880 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  r = pOther->pNex
1f890 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1f8a0 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
1f8b0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
1f8c0 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e        pOther->pN
1f8d0 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  ext = pIndex;.  
1f8e0 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20 3d    }.    pIndex =
1f8f0 20 30 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69   0;.  }.  else i
1f900 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
1f910 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ECT ){.    asser
1f920 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49  t( pParse->pNewI
1f930 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ndex==0 );.    p
1f940 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78  Parse->pNewIndex
1f950 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 70   = pIndex;.    p
1f960 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Index = 0;.  }..
1f970 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65    /* Clean up be
1f980 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
1f990 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1f9a0 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  x:.  if( pIndex 
1f9b0 29 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64  ) sqlite3FreeInd
1f9c0 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
1f9d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1f9e0 65 74 65 28 64 62 2c 20 70 50 49 57 68 65 72 65  ete(db, pPIWhere
1f9f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1fa00 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1fa10 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
1fa20 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
1fa30 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73  , pTblName);.  s
1fa40 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1fa50 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   zName);.}../*.*
1fa60 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78  * Fill the Index
1fa70 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61  .aiRowEst[] arra
1fa80 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69  y with default i
1fa90 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66  nformation - inf
1faa0 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  ormation.** to b
1fab0 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68  e used when we h
1fac0 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20  ave not run the 
1fad0 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e  ANALYZE command.
1fae0 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b  .**.** aiRowEst[
1faf0 30 5d 20 69 73 20 73 75 70 70 6f 73 65 64 20 74  0] is supposed t
1fb00 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
1fb10 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
1fb20 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a   in the index..*
1fb30 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f  * Since we do no
1fb40 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20  t know, guess 1 
1fb50 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45  million.  aiRowE
1fb60 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69  st[1] is an esti
1fb70 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e  mate of the.** n
1fb80 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1fb90 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
1fba0 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
1fbb0 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68  ular value of th
1fbc0 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d  e.** first colum
1fbd0 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  n of the index. 
1fbe0 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20   aiRowEst[2] is 
1fbf0 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
1fc00 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
1fc10 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20  rows that match 
1fc20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63  any particular c
1fc30 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68  ombination of th
1fc40 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e  e first 2 column
1fc50 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65  s.** of the inde
1fc60 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  x.  And so forth
1fc70 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79  .  It must alway
1fc80 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  s be the case th
1fc90 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  at.*.**         
1fca0 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61    aiRowEst[N]<=a
1fcb0 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20  iRowEst[N-1].** 
1fcc0 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
1fcd0 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41  st[N]>=1.**.** A
1fce0 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20  part from that, 
1fcf0 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74  we have little t
1fd00 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20  o go on besides 
1fd10 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a  intuition as to.
1fd20 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b  ** how aiRowEst[
1fd30 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  ] should be init
1fd40 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75  ialized.  The nu
1fd50 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20  mbers generated 
1fd60 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65  here.** are base
1fd70 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c  d on typical val
1fd80 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74  ues found in act
1fd90 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a  ual indices..*/.
1fda0 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61  void sqlite3Defa
1fdb0 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20  ultRowEst(Index 
1fdc0 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20  *pIdx){.  /*    
1fdd0 20 20 20 20 20 20 20 20 20 20 20 20 31 30 2c 20              10, 
1fde0 20 39 2c 20 20 38 2c 20 20 37 2c 20 20 36 20 2a   9,  8,  7,  6 *
1fdf0 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b  /.  LogEst aVal[
1fe00 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33 30  ] = { 33, 32, 30
1fe10 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f  , 28, 26 };.  Lo
1fe20 67 45 73 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e  gEst *a = pIdx->
1fe30 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69  aiRowLogEst;.  i
1fe40 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41  nt nCopy = MIN(A
1fe50 72 72 61 79 53 69 7a 65 28 61 56 61 6c 29 2c 20  rraySize(aVal), 
1fe60 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a  pIdx->nKeyCol);.
1fe70 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49    int i;..  /* I
1fe80 6e 64 65 78 65 73 20 77 69 74 68 20 64 65 66 61  ndexes with defa
1fe90 75 6c 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65  ult row estimate
1fea0 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76  s should not hav
1feb0 65 20 73 74 61 74 31 20 64 61 74 61 20 2a 2f 0a  e stat1 data */.
1fec0 20 20 61 73 73 65 72 74 28 20 21 70 49 64 78 2d    assert( !pIdx-
1fed0 3e 68 61 73 53 74 61 74 31 20 29 3b 0a 0a 20 20  >hasStat1 );..  
1fee0 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72 73 74  /* Set the first
1fef0 20 65 6e 74 72 79 20 28 6e 75 6d 62 65 72 20 6f   entry (number o
1ff00 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e  f rows in the in
1ff10 64 65 78 29 20 74 6f 20 74 68 65 20 65 73 74 69  dex) to the esti
1ff20 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e 75 6d 62  mated .  ** numb
1ff30 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
1ff40 65 20 74 61 62 6c 65 2c 20 6f 72 20 68 61 6c 66  e table, or half
1ff50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
1ff60 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
1ff70 0a 20 20 2a 2a 20 66 6f 72 20 61 20 70 61 72 74  .  ** for a part
1ff80 69 61 6c 20 69 6e 64 65 78 2e 20 20 20 42 75 74  ial index.   But
1ff90 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20   do not let the 
1ffa0 65 73 74 69 6d 61 74 65 20 64 72 6f 70 20 62 65  estimate drop be
1ffb0 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20 20 61 5b 30  low 10. */.  a[0
1ffc0 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  ] = pIdx->pTable
1ffd0 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20  ->nRowLogEst;.  
1ffe0 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49  if( pIdx->pPartI
1fff0 64 78 57 68 65 72 65 21 3d 30 20 29 20 61 5b 30  dxWhere!=0 ) a[0
20000 5d 20 2d 3d 20 31 30 3b 20 20 61 73 73 65 72 74  ] -= 10;  assert
20010 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 10==sqlite3Log
20020 45 73 74 28 32 29 20 29 3b 0a 20 20 69 66 28 20  Est(2) );.  if( 
20030 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20 3d  a[0]<33 ) a[0] =
20040 20 33 33 3b 20 20 20 20 20 20 20 20 20 20 20 20   33;            
20050 20 20 20 20 20 20 61 73 73 65 72 74 28 20 33 33        assert( 33
20060 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
20070 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 73 74  10) );..  /* Est
20080 69 6d 61 74 65 20 74 68 61 74 20 61 5b 31 5d 20  imate that a[1] 
20090 69 73 20 31 30 2c 20 61 5b 32 5d 20 69 73 20 39  is 10, a[2] is 9
200a0 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20 61 5b 34  , a[3] is 8, a[4
200b0 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20 69 73 0a  ] is 7, a[5] is.
200c0 20 20 2a 2a 20 36 20 61 6e 64 20 65 61 63 68 20    ** 6 and each 
200d0 73 75 62 73 65 71 75 65 6e 74 20 76 61 6c 75 65  subsequent value
200e0 20 28 69 66 20 61 6e 79 29 20 69 73 20 35 2e 20   (if any) is 5. 
200f0 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 61 5b   */.  memcpy(&a[
20100 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70 79 2a  1], aVal, nCopy*
20110 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 29 3b  sizeof(LogEst));
20120 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79 2b 31  .  for(i=nCopy+1
20130 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ; i<=pIdx->nKeyC
20140 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 5b  ol; i++){.    a[
20150 69 5d 20 3d 20 32 33 3b 20 20 20 20 20 20 20 20  i] = 23;        
20160 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
20170 72 74 28 20 32 33 3d 3d 73 71 6c 69 74 65 33 4c  rt( 23==sqlite3L
20180 6f 67 45 73 74 28 35 29 20 29 3b 0a 20 20 7d 0a  ogEst(5) );.  }.
20190 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71  .  assert( 0==sq
201a0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20 29  lite3LogEst(1) )
201b0 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75 65  ;.  if( IsUnique
201c0 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 61 5b  Index(pIdx) ) a[
201d0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d  pIdx->nKeyCol] =
201e0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
201f0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
20200 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
20210 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68  named index.  Th
20220 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d  is routine.** im
20230 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f  plements the DRO
20240 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  P INDEX statemen
20250 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
20260 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  e3DropIndex(Pars
20270 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
20280 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
20290 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65  fExists){.  Inde
202a0 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62  x *pIndex;.  Vdb
202b0 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
202c0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
202d0 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
202e0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
202f0 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  nErr==0 );   /* 
20300 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  Never called wit
20310 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a  h prior errors *
20320 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
20330 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
20340 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
20350 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
20360 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
20370 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  =1 );.  if( SQLI
20380 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
20390 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
203a0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
203b0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
203c0 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
203d0 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
203e0 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
203f0 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
20400 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  .zDatabase);.  i
20410 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
20420 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74      if( !ifExist
20430 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
20440 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
20450 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
20460 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30  x: %S", pName, 0
20470 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
20480 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
20490 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61  erifyNamedSchema
204a0 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e  (pParse, pName->
204b0 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
204c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
204d0 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
204e0 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   1;.    goto exi
204f0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
20500 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  }.  if( pIndex->
20510 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  idxType!=SQLITE_
20520 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20 29  IDXTYPE_APPDEF )
20530 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
20540 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
20550 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
20560 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20  with UNIQUE ".  
20570 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20      "or PRIMARY 
20580 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  KEY constraint c
20590 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  annot be dropped
205a0 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ", 0);.    goto 
205b0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
205c0 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
205d0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
205e0 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  x(db, pIndex->pS
205f0 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20  chema);.#ifndef 
20600 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
20610 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
20620 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c    int code = SQL
20630 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a  ITE_DROP_INDEX;.
20640 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
20650 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
20660 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
20670 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
20680 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
20690 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
206a0 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
206b0 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28  LE(iDb);.    if(
206c0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
206d0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
206e0 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
206f0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
20700 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
20710 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
20720 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
20730 20 26 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d   && iDb ) code =
20740 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
20750 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
20760 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
20770 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
20780 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70  pIndex->zName, p
20790 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
207a0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
207b0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
207c0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
207d0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
207e0 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
207f0 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f  he index and fro
20800 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
20810 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  le */.  v = sqli
20820 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
20830 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
20840 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
20850 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
20860 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20  arse, 1, iDb);. 
20870 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
20880 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
20890 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
208a0 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61  M %Q.%s WHERE na
208b0 6d 65 3d 25 51 20 41 4e 44 20 74 79 70 65 3d 27  me=%Q AND type='
208c0 69 6e 64 65 78 27 22 2c 0a 20 20 20 20 20 20 20  index'",.       
208d0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
208e0 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  SName, MASTER_NA
208f0 4d 45 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ME, pIndex->zNam
20900 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  e.    );.    sql
20910 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62  ite3ClearStatTab
20920 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c  les(pParse, iDb,
20930 20 22 69 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e   "idx", pIndex->
20940 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
20950 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
20960 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
20970 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
20980 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  e(pParse, pIndex
20990 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
209a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
209b0 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e  Op4(v, OP_DropIn
209c0 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  dex, iDb, 0, 0, 
209d0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
209e0 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
209f0 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74  p_index:.  sqlit
20a00 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
20a10 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
20a20 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61  *.** pArray is a
20a30 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61   pointer to an a
20a40 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e  rray of objects.
20a50 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20   Each object in 
20a60 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20  the.** array is 
20a70 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e  szEntry bytes in
20a80 20 73 69 7a 65 2e 20 54 68 69 73 20 72 6f 75 74   size. This rout
20a90 69 6e 65 20 75 73 65 73 20 73 71 6c 69 74 65 33  ine uses sqlite3
20aa0 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74  DbRealloc().** t
20ab0 6f 20 65 78 74 65 6e 64 20 74 68 65 20 61 72 72  o extend the arr
20ac0 61 79 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  ay so that there
20ad0 20 69 73 20 73 70 61 63 65 20 66 6f 72 20 61 20   is space for a 
20ae0 6e 65 77 20 6f 62 6a 65 63 74 20 61 74 20 74 68  new object at th
20af0 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  e end..**.** Whe
20b00 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
20b10 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e  is called, *pnEn
20b20 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  try contains the
20b30 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
20b40 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20 28 69  .** the array (i
20b50 6e 20 65 6e 74 72 69 65 73 20 2d 20 73 6f 20 74  n entries - so t
20b60 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  he allocation is
20b70 20 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73   ((*pnEntry) * s
20b80 7a 45 6e 74 72 79 29 20 62 79 74 65 73 0a 2a 2a  zEntry) bytes.**
20b90 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a   in total)..**.*
20ba0 2a 20 49 66 20 74 68 65 20 72 65 61 6c 6c 6f 63  * If the realloc
20bb0 28 29 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  () is successful
20bc0 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d   (i.e. if no OOM
20bd0 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72   condition occur
20be0 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65  s), the.** space
20bf0 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
20c00 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73  he new object is
20c10 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72   zeroed, *pnEntr
20c20 79 20 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20  y updated to.** 
20c30 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77 20  reflect the new 
20c40 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61  size of the arra
20c50 79 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  y and a pointer 
20c60 74 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  to the new alloc
20c70 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65  ation.** returne
20c80 64 2e 20 2a 70 49 64 78 20 69 73 20 73 65 74 20  d. *pIdx is set 
20c90 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
20ca0 74 68 65 20 6e 65 77 20 61 72 72 61 79 20 65 6e  the new array en
20cb0 74 72 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  try in this case
20cc0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
20cd0 65 2c 20 69 66 20 74 68 65 20 72 65 61 6c 6c 6f  e, if the reallo
20ce0 63 28 29 20 66 61 69 6c 73 2c 20 2a 70 49 64 78  c() fails, *pIdx
20cf0 20 69 73 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a   is set to -1, *
20d00 70 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a  pnEntry remains.
20d10 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ** unchanged and
20d20 20 61 20 63 6f 70 79 20 6f 66 20 70 41 72 72 61   a copy of pArra
20d30 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76  y returned..*/.v
20d40 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61  oid *sqlite3Arra
20d50 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c  yAllocate(.  sql
20d60 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f  ite3 *db,      /
20d70 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * Connection to 
20d80 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63  notify of malloc
20d90 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76   failures */.  v
20da0 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20  oid *pArray,    
20db0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a   /* Array of obj
20dc0 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20  ects.  Might be 
20dd0 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  reallocated */. 
20de0 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20   int szEntry,   
20df0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61     /* Size of ea
20e00 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ch object in the
20e10 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
20e20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a  *pnEntry,     /*
20e30 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63   Number of objec
20e40 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  ts currently in 
20e50 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49  use */.  int *pI
20e60 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  dx         /* Wr
20e70 69 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66  ite the index of
20e80 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65   a new slot here
20e90 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
20ea0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
20eb0 34 20 6e 20 3d 20 2a 70 49 64 78 20 3d 20 2a 70  4 n = *pIdx = *p
20ec0 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28 20 28 6e  nEntry;.  if( (n
20ed0 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (n-1))==0 ){.
20ee0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
20ef0 34 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20  4 sz = (n==0) ? 
20f00 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69  1 : 2*n;.    voi
20f10 64 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  d *pNew = sqlite
20f20 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
20f30 41 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72  Array, sz*szEntr
20f40 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  y);.    if( pNew
20f50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49  ==0 ){.      *pI
20f60 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  dx = -1;.      r
20f70 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20  eturn pArray;.  
20f80 20 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20 3d    }.    pArray =
20f90 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d   pNew;.  }.  z =
20fa0 20 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a   (char*)pArray;.
20fb0 20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20    memset(&z[n * 
20fc0 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45  szEntry], 0, szE
20fd0 6e 74 72 79 29 3b 0a 20 20 2b 2b 2a 70 6e 45 6e  ntry);.  ++*pnEn
20fe0 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41  try;.  return pA
20ff0 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rray;.}../*.** A
21000 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d  ppend a new elem
21010 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ent to the given
21020 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65   IdList.  Create
21030 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66   a new IdList if
21040 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a  .** need be..**.
21050 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20  ** A new IdList 
21060 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
21070 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
21080 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73   fails..*/.IdLis
21090 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
210a0 41 70 70 65 6e 64 28 50 61 72 73 65 20 2a 70 50  Append(Parse *pP
210b0 61 72 73 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c  arse, IdList *pL
210c0 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
210d0 65 6e 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  en){.  sqlite3 *
210e0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
210f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
21100 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
21110 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44  pList = sqlite3D
21120 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
21130 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29  sizeof(IdList) )
21140 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
21150 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
21160 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20   }.  pList->a = 
21170 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
21180 63 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a  cate(.      db,.
21190 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a        pList->a,.
211a0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69        sizeof(pLi
211b0 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20  st->a[0]),.     
211c0 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20   &pList->nId,.  
211d0 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66      &i.  );.  if
211e0 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  ( i<0 ){.    sql
211f0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
21200 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
21210 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
21220 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
21230 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
21240 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
21250 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 49 4e 5f  oken);.  if( IN_
21260 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26 26  RENAME_OBJECT &&
21270 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
21280 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  me ){.    sqlite
21290 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28  3RenameTokenMap(
212a0 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 70  pParse, (void*)p
212b0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
212c0 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20  , pToken);.  }. 
212d0 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
212e0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
212f0 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  n IdList..*/.voi
21300 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  d sqlite3IdListD
21310 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
21320 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  b, IdList *pList
21330 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
21340 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
21350 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
21360 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
21370 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
21380 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d  bFree(db, pList-
21390 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
213a0 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
213b0 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b  e(db, pList->a);
213c0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
213d0 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
213e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
213f0 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
21400 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
21410 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
21420 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
21430 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
21440 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  t sqlite3IdListI
21450 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69  ndex(IdList *pLi
21460 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
21470 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  zName){.  int i;
21480 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
21490 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66  ) return -1;.  f
214a0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
214b0 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
214c0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
214d0 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
214e0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
214f0 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
21500 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
21510 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 69  /*.** Maximum si
21520 7a 65 20 6f 66 20 61 20 53 72 63 4c 69 73 74 20  ze of a SrcList 
21530 6f 62 6a 65 63 74 2e 0a 2a 2a 20 54 68 65 20 53  object..** The S
21540 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 69 73  rcList object is
21550 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
21560 6e 74 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  nt the FROM clau
21570 73 65 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43  se of a.** SELEC
21580 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6e 64  T statement, and
21590 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e   the query plann
215a0 65 72 20 63 61 6e 6e 6f 74 20 64 65 61 6c 20 77  er cannot deal w
215b0 69 74 68 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e  ith more.** than
215c0 20 36 34 20 74 61 62 6c 65 73 20 69 6e 20 61 20   64 tables in a 
215d0 6a 6f 69 6e 2e 20 20 53 6f 20 61 6e 79 20 76 61  join.  So any va
215e0 6c 75 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20  lue larger than 
215f0 36 34 20 68 65 72 65 0a 2a 2a 20 69 73 20 73 75  64 here.** is su
21600 66 66 69 63 69 65 6e 74 20 66 6f 72 20 6d 6f 73  fficient for mos
21610 74 20 75 73 65 73 2e 20 20 53 6d 61 6c 6c 65 72  t uses.  Smaller
21620 20 76 61 6c 75 65 73 2c 20 6c 69 6b 65 20 73 61   values, like sa
21630 79 20 31 30 2c 20 61 72 65 0a 2a 2a 20 61 70 70  y 10, are.** app
21640 72 6f 70 72 69 61 74 65 20 66 6f 72 20 73 6d 61  ropriate for sma
21650 6c 6c 20 61 6e 64 20 6d 65 6d 6f 72 79 2d 6c 69  ll and memory-li
21660 6d 69 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f  mited applicatio
21670 6e 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ns..*/.#ifndef S
21680 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53  QLITE_MAX_SRCLIS
21690 54 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  T.# define SQLIT
216a0 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 20 32 30  E_MAX_SRCLIST 20
216b0 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
216c0 45 78 70 61 6e 64 20 74 68 65 20 73 70 61 63 65  Expand the space
216d0 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
216e0 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
216f0 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72   object by.** cr
21700 65 61 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65  eating nExtra ne
21710 77 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e  w slots beginnin
21720 67 20 61 74 20 69 53 74 61 72 74 2e 20 20 69 53  g at iStart.  iS
21730 74 61 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73  tart is zero bas
21740 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73  ed..** New slots
21750 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
21760 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
21770 73 75 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73  suppose a SrcLis
21780 74 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74  t initially cont
21790 61 69 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73  ains two entries
217a0 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70  : A,B..** To app
217b0 65 6e 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65  end 3 new entrie
217c0 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20  s onto the end, 
217d0 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  do this:.**.**  
217e0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
217f0 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63  Enlarge(db, pSrc
21800 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a  list, 3, 2);.**.
21810 2a 2a 20 41 66 74 65 72 20 74 68 65 20 63 61 6c  ** After the cal
21820 6c 20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64  l above it would
21830 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c   contain:  A, B,
21840 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a   nil, nil, nil..
21850 2a 2a 20 49 66 20 74 68 65 20 69 53 74 61 72 74  ** If the iStart
21860 20 61 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65   argument had be
21870 65 6e 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20  en 1 instead of 
21880 32 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  2, then the resu
21890 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65  lt.** would have
218a0 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20   been:  A, nil, 
218b0 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f  nil, nil, B.  To
218c0 20 70 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77   prepend the new
218d0 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69   slots,.** the i
218e0 53 74 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c  Start value woul
218f0 64 20 62 65 20 30 2e 20 20 54 68 65 20 72 65 73  d be 0.  The res
21900 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a  ult then would.*
21910 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20  * be: nil, nil, 
21920 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a  nil, A, B..**.**
21930 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
21940 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 6f 72  ocation fails or
21950 20 74 68 65 20 53 72 63 4c 69 73 74 20 62 65 63   the SrcList bec
21960 6f 6d 65 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20  omes too large, 
21970 6c 65 61 76 65 0a 2a 2a 20 74 68 65 20 6f 72 69  leave.** the ori
21980 67 69 6e 61 6c 20 53 72 63 4c 69 73 74 20 75 6e  ginal SrcList un
21990 63 68 61 6e 67 65 64 2c 20 72 65 74 75 72 6e 20  changed, return 
219a0 4e 55 4c 4c 2c 20 61 6e 64 20 6c 65 61 76 65 20  NULL, and leave 
219b0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
219c0 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  .** in pParse..*
219d0 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
219e0 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
219f0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
21a00 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
21a10 67 20 63 6f 6e 74 65 78 74 20 69 6e 74 6f 20 77  g context into w
21a20 68 69 63 68 20 65 72 72 6f 72 73 20 61 72 65 20  hich errors are 
21a30 72 65 70 6f 72 74 65 64 20 2a 2f 0a 20 20 53 72  reported */.  Sr
21a40 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
21a50 20 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20   /* The SrcList 
21a60 74 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a  to be enlarged *
21a70 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
21a80 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21a90 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f   of new slots to
21aa0 20 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b   add to pSrc->a[
21ab0 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72  ] */.  int iStar
21ac0 74 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  t         /* Ind
21ad0 65 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20  ex in pSrc->a[] 
21ae0 6f 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f  of first new slo
21af0 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
21b00 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
21b10 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e  ecking on callin
21b20 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  g parameters */.
21b30 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74    assert( iStart
21b40 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
21b50 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20   nExtra>=1 );.  
21b60 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20  assert( pSrc!=0 
21b70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
21b80 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20  art<=pSrc->nSrc 
21b90 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
21ba0 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61  e additional spa
21bb0 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  ce if needed */.
21bc0 20 20 69 66 28 20 28 75 33 32 29 70 53 72 63 2d    if( (u32)pSrc-
21bd0 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72  >nSrc+nExtra>pSr
21be0 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  c->nAlloc ){.   
21bf0 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
21c00 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
21c10 34 20 6e 41 6c 6c 6f 63 20 3d 20 32 2a 28 73 71  4 nAlloc = 2*(sq
21c20 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 53 72 63  lite3_int64)pSrc
21c30 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20  ->nSrc+nExtra;. 
21c40 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
21c50 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
21c60 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
21c70 2b 6e 45 78 74 72 61 3e 3d 53 51 4c 49 54 45 5f  +nExtra>=SQLITE_
21c80 4d 41 58 5f 53 52 43 4c 49 53 54 20 29 7b 0a 20  MAX_SRCLIST ){. 
21c90 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
21ca0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
21cb0 6f 20 6d 61 6e 79 20 46 52 4f 4d 20 63 6c 61 75  o many FROM clau
21cc0 73 65 20 74 65 72 6d 73 2c 20 6d 61 78 3a 20 25  se terms, max: %
21cd0 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
21ce0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
21cf0 5f 4d 41 58 5f 53 52 43 4c 49 53 54 29 3b 0a 20  _MAX_SRCLIST);. 
21d00 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
21d10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 6c     }.    if( nAl
21d20 6c 6f 63 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 53  loc>SQLITE_MAX_S
21d30 52 43 4c 49 53 54 20 29 20 6e 41 6c 6c 6f 63 20  RCLIST ) nAlloc 
21d40 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43  = SQLITE_MAX_SRC
21d50 4c 49 53 54 3b 0a 20 20 20 20 70 4e 65 77 20 3d  LIST;.    pNew =
21d60 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
21d70 63 28 64 62 2c 20 70 53 72 63 2c 0a 20 20 20 20  c(db, pSrc,.    
21d80 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
21d90 66 28 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c  f(*pSrc) + (nAll
21da0 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53 72  oc-1)*sizeof(pSr
21db0 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20  c->a[0]) );.    
21dc0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
21dd0 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
21de0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
21df0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
21e00 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20  .    }.    pSrc 
21e10 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 53 72 63  = pNew;.    pSrc
21e20 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f  ->nAlloc = nAllo
21e30 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76  c;.  }..  /* Mov
21e40 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73  e existing slots
21e50 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72   that come after
21e60 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72   the newly inser
21e70 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f  ted slots.  ** o
21e80 75 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f  ut of the way */
21e90 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e  .  for(i=pSrc->n
21ea0 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74  Src-1; i>=iStart
21eb0 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63  ; i--){.    pSrc
21ec0 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20  ->a[i+nExtra] = 
21ed0 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a  pSrc->a[i];.  }.
21ee0 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20    pSrc->nSrc += 
21ef0 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65  nExtra;..  /* Ze
21f00 72 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c  ro the newly all
21f10 6f 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a  ocated slots */.
21f20 20 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d 3e    memset(&pSrc->
21f30 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73 69  a[iStart], 0, si
21f40 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29  zeof(pSrc->a[0])
21f50 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72 28  *nExtra);.  for(
21f60 69 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74 61  i=iStart; i<iSta
21f70 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b  rt+nExtra; i++){
21f80 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e  .    pSrc->a[i].
21f90 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
21fa0 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61  }..  /* Return a
21fb0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
21fc0 65 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73 74  enlarged SrcList
21fd0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53 72   */.  return pSr
21fe0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  c;.}.../*.** App
21ff0 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20  end a new table 
22000 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65  name to the give
22010 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61  n SrcList.  Crea
22020 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  te a new SrcList
22030 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20   if.** need be. 
22040 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   A new entry is 
22050 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53  created in the S
22060 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70  rcList even if p
22070 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a  Table is NULL..*
22080 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20 69  *.** A SrcList i
22090 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
220a0 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20  ULL if there is 
220b0 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 72 20  an OOM error or 
220c0 69 66 20 74 68 65 0a 2a 2a 20 53 72 63 4c 69 73  if the.** SrcLis
220d0 74 20 67 72 6f 77 73 20 74 6f 20 6c 61 72 67 65  t grows to large
220e0 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a  .  The returned.
220f0 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  ** SrcList might
22100 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
22110 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
22120 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74   was input or it
22130 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e   might be.** a n
22140 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f  ew one.  If an O
22150 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  OM error does oc
22160 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70  curs, then the p
22170 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c  rior value of pL
22180 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69  ist.** that is i
22190 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75  nput to this rou
221a0 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69  tine is automati
221b0 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a  cally freed..**.
221c0 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20  ** If pDatabase 
221d0 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20  is not null, it 
221e0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74  means that the t
221f0 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69  able has an opti
22200 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  onal.** database
22210 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c   name prefix.  L
22220 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61  ike this:  "data
22230 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68  base.table".  Th
22240 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70  e pDatabase.** p
22250 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62  oints to the tab
22260 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
22270 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  pTable points to
22280 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
22290 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69  me..** The SrcLi
222a0 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65  st.a[].zName fie
222b0 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ld is filled wit
222c0 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
222d0 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20   which might.** 
222e0 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  come from pTable
222f0 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69   (if pDatabase i
22300 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20  s NULL) or from 
22310 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20  pDatabase.  .** 
22320 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74  SrcList.a[].zDat
22330 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20  abase is filled 
22340 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
22350 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62  e name from pTab
22360 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e  le,.** or with N
22370 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61  ULL if no databa
22380 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e  se is specified.
22390 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
223a0 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c  words, if call l
223b0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
223c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
223d0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
223e0 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,0);.**.** The
223f0 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e  n B is a table n
22400 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
22410 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73  base name is uns
22420 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61  pecified.  If ca
22430 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69  lled.** like thi
22440 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
22450 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
22460 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a  ppend(D,A,B,C);.
22470 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20  **.** Then C is 
22480 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
22490 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61  nd B is the data
224a0 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43  base name.  If C
224b0 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74   is defined.** t
224c0 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e  hen so is B.  In
224d0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65   other words, we
224e0 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 63 61   never have a ca
224f0 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20  se where:.**.** 
22500 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
22510 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
22520 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74  ,0,C);.**.** Bot
22530 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61  h pTable and pDa
22540 74 61 62 61 73 65 20 61 72 65 20 61 73 73 75 6d  tabase are assum
22550 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ed to be quoted.
22560 20 20 54 68 65 79 20 61 72 65 20 64 65 71 75 6f    They are dequo
22570 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65  ted.** before be
22580 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65  ing added to the
22590 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63   SrcList..*/.Src
225a0 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
225b0 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61  ListAppend(.  Pa
225c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
225d0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
225e0 74 65 78 74 2c 20 69 6e 20 77 68 69 63 68 20 65  text, in which e
225f0 72 72 6f 72 73 20 61 72 65 20 72 65 70 6f 72 74  rrors are report
22600 65 64 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ed */.  SrcList 
22610 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41  *pList,     /* A
22620 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72  ppend to this Sr
22630 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61  cList. NULL crea
22640 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73  tes a new SrcLis
22650 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  t */.  Token *pT
22660 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61  able,      /* Ta
22670 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f  ble to append */
22680 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  .  Token *pDatab
22690 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ase    /* Databa
226a0 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  se of the table 
226b0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
226c0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
226d0 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
226e0 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 61  b;.  assert( pDa
226f0 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61  tabase==0 || pTa
22700 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61  ble!=0 );  /* Ca
22710 6e 6e 6f 74 20 68 61 76 65 20 43 20 77 69 74 68  nnot have C with
22720 6f 75 74 20 42 20 2a 2f 0a 20 20 61 73 73 65 72  out B */.  asser
22730 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
22740 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
22750 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 64 62 20  ->db!=0 );.  db 
22760 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
22770 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
22780 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
22790 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
227a0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
227b0 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a  eof(SrcList) );.
227c0 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
227d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
227e0 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
227f0 20 31 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   1;.    pList->n
22800 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d  Src = 1;.    mem
22810 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 30 5d  set(&pList->a[0]
22820 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  , 0, sizeof(pLis
22830 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 70  t->a[0]));.    p
22840 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
22850 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  or = -1;.  }else
22860 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  {.    SrcList *p
22870 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 72 63  New = sqlite3Src
22880 4c 69 73 74 45 6e 6c 61 72 67 65 28 70 50 61 72  ListEnlarge(pPar
22890 73 65 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c  se, pList, 1, pL
228a0 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 20 20  ist->nSrc);.    
228b0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
228c0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
228d0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
228e0 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ist);.      retu
228f0 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rn 0;.    }else{
22900 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70  .      pList = p
22910 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  New;.    }.  }. 
22920 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
22930 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  >a[pList->nSrc-1
22940 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61  ];.  if( pDataba
22950 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  se && pDatabase-
22960 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61  >z==0 ){.    pDa
22970 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
22980 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
22990 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  ){.    pItem->zN
229a0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
229b0 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
229c0 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70  Database);.    p
229d0 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
229e0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
229f0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c  mToken(db, pTabl
22a00 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
22a10 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
22a20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
22a30 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29  oken(db, pTable)
22a40 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44 61  ;.    pItem->zDa
22a50 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
22a60 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
22a70 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
22a80 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78  VdbeCursor index
22a90 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20   numbers to all 
22aa0 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c  tables in a SrcL
22ab0 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ist.*/.void sqli
22ac0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
22ad0 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70  Cursors(Parse *p
22ae0 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
22af0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
22b00 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
22b10 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
22b20 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c   assert(pList ||
22b30 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
22b40 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
22b50 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
22b60 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
22b70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
22b80 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
22b90 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  em++){.      if(
22ba0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e   pItem->iCursor>
22bb0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
22bc0 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
22bd0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
22be0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  +;.      if( pIt
22bf0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
22c00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
22c10 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
22c20 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  rs(pParse, pItem
22c30 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29  ->pSelect->pSrc)
22c40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22c50 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
22c60 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
22c70 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
22c80 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
22c90 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
22ca0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
22cb0 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
22cc0 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
22cd0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
22ce0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
22cf0 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
22d00 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
22d10 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
22d20 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
22d30 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
22d40 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
22d50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
22d60 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
22d70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
22d80 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
22d90 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
22da0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
22db0 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
22dc0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
22dd0 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 73 71  isIndexedBy ) sq
22de0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
22df0 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pItem->u1.zIndex
22e00 65 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  edBy);.    if( p
22e10 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
22e20 6e 63 20 29 20 73 71 6c 69 74 65 33 45 78 70 72  nc ) sqlite3Expr
22e30 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
22e40 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
22e50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
22e60 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
22e70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
22e80 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
22e90 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
22ea0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
22eb0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
22ec0 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b  db, pItem->pOn);
22ed0 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
22ee0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  stDelete(db, pIt
22ef0 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
22f00 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
22f10 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
22f20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
22f30 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
22f40 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  y the parser to 
22f50 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74  add a new term t
22f60 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
22f70 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63  a growing FROM c
22f80 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20  lause.  The "p" 
22f90 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
22fa0 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
22fb0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74  FROM clause that
22fc0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
22fd0 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20  n constructed.  
22fe0 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69  "p" is NULL.** i
22ff0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
23000 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  rst term of the 
23010 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54  FROM clause.  pT
23020 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61  able and pDataba
23030 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61  se.** are the na
23040 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
23050 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d  and database nam
23060 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
23070 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70  lause term..** p
23080 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c  Database is NULL
23090 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
230a0 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20   name qualifier 
230b0 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65  is missing - the
230c0 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20  .** usual case. 
230d0 20 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73   If the term has
230e0 20 61 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e 20   an alias, then 
230f0 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f  pAlias points to
23100 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f   the.** alias to
23110 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72  ken.  If the ter
23120 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c  m is a subquery,
23130 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79 20   then pSubquery 
23140 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54  is the.** SELECT
23150 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
23160 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e 63  the subquery enc
23170 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c  odes.  The pTabl
23180 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61  e and.** pDataba
23190 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  se parameters ar
231a0 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75  e NULL for subqu
231b0 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20  eries.  The pOn 
231c0 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61  and pUsing.** pa
231d0 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68 65  rameters are the
231e0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
231f0 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
23200 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  uses..**.** Retu
23210 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  rn a new SrcList
23220 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69   which encodes i
23230 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20  s the FROM with 
23240 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20  the new.** term 
23250 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73  added..*/.SrcLis
23260 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
23270 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
23280 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
23290 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
232a0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
232b0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20  .  SrcList *p,  
232c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
232d0 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74  e left part of t
232e0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61  he FROM clause a
232f0 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20  lready seen */. 
23300 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
23310 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
23320 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
23330 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d   add to the FROM
23340 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b   clause */.  Tok
23350 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20  en *pDatabase,  
23360 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
23370 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
23380 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a  taining pTable *
23390 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61  /.  Token *pAlia
233a0 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  s,          /* T
233b0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
233c0 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75 62  de of the AS sub
233d0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
233e0 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72  Select *pSubquer
233f0 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  y,      /* A sub
23400 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c  query used in pl
23410 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e  ace of a table n
23420 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ame */.  Expr *p
23430 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  On,             
23440 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73   /* The ON claus
23450 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20  e of a join */. 
23460 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20   IdList *pUsing 
23470 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23480 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
23490 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73  a join */.){.  s
234a0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
234b0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
234c0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
234d0 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20  e->db;.  if( !p 
234e0 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e  && (pOn || pUsin
234f0 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  g) ){.    sqlite
23500 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
23510 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65  , "a JOIN clause
23520 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
23530 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20  ore %s", .      
23540 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55  (pOn ? "ON" : "U
23550 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20  SING").    );.  
23560 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72    goto append_fr
23570 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  om_error;.  }.  
23580 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  p = sqlite3SrcLi
23590 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
235a0 20 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74   p, pTable, pDat
235b0 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  abase);.  if( p=
235c0 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61  =0 ){.    goto a
235d0 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
235e0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
235f0 70 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20 70  p->nSrc>0 );.  p
23600 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
23610 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72  nSrc-1];.  asser
23620 74 28 20 28 70 54 61 62 6c 65 3d 3d 30 29 3d 3d  t( (pTable==0)==
23630 28 70 44 61 74 61 62 61 73 65 3d 3d 30 29 20 29  (pDatabase==0) )
23640 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
23650 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70  m->zName==0 || p
23660 44 61 74 61 62 61 73 65 21 3d 30 20 29 3b 0a 20  Database!=0 );. 
23670 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
23680 42 4a 45 43 54 20 26 26 20 70 49 74 65 6d 2d 3e  BJECT && pItem->
23690 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 54 6f 6b  zName ){.    Tok
236a0 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 28 41 4c  en *pToken = (AL
236b0 57 41 59 53 28 70 44 61 74 61 62 61 73 65 29 20  WAYS(pDatabase) 
236c0 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 29  && pDatabase->z)
236d0 20 3f 20 70 44 61 74 61 62 61 73 65 20 3a 20 70   ? pDatabase : p
236e0 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74  Table;.    sqlit
236f0 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70  e3RenameTokenMap
23700 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
23710 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b 0a  zName, pToken);.
23720 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 41    }.  assert( pA
23730 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66 28  lias!=0 );.  if(
23740 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20   pAlias->n ){.  
23750 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20    pItem->zAlias 
23760 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
23770 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61  mToken(db, pAlia
23780 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  s);.  }.  pItem-
23790 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71  >pSelect = pSubq
237a0 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70  uery;.  pItem->p
237b0 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65  On = pOn;.  pIte
237c0 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69  m->pUsing = pUsi
237d0 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ng;.  return p;.
237e0 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  . append_from_er
237f0 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70  ror:.  assert( p
23800 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
23810 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
23820 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64  On);.  sqlite3Id
23830 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
23840 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  Using);.  sqlite
23850 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
23860 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20  , pSubquery);.  
23870 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
23880 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45  ** Add an INDEXE
23890 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45  D BY or NOT INDE
238a0 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68  XED clause to th
238b0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
238c0 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e  added .** elemen
238d0 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d  t of the source-
238e0 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
238f0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
23900 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
23910 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65  te3SrcListIndexe
23920 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  dBy(Parse *pPars
23930 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54  e, SrcList *p, T
23940 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79  oken *pIndexedBy
23950 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ){.  assert( pIn
23960 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20 20  dexedBy!=0 );.  
23970 69 66 28 20 70 20 26 26 20 70 49 6e 64 65 78 65  if( p && pIndexe
23980 64 42 79 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  dBy->n>0 ){.    
23990 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
239a0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
239b0 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 72 63 3e  assert( p->nSrc>
239c0 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d  0 );.    pItem =
239d0 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31   &p->a[p->nSrc-1
239e0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
239f0 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65  Item->fg.notInde
23a00 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  xed==0 );.    as
23a10 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e  sert( pItem->fg.
23a20 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29  isIndexedBy==0 )
23a30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
23a40 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
23a50 63 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  c==0 );.    if( 
23a60 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31  pIndexedBy->n==1
23a70 20 26 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d   && !pIndexedBy-
23a80 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  >z ){.      /* A
23a90 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63   "NOT INDEXED" c
23aa0 6c 61 75 73 65 20 77 61 73 20 73 75 70 70 6c 69  lause was suppli
23ab0 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20  ed. See parse.y 
23ac0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72  .      ** constr
23ad0 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74  uct "indexed_opt
23ae0 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a  " for details. *
23af0 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66  /.      pItem->f
23b00 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31  g.notIndexed = 1
23b10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
23b20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e     pItem->u1.zIn
23b30 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65  dexedBy = sqlite
23b40 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
23b50 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65  Parse->db, pInde
23b60 78 65 64 42 79 29 3b 0a 20 20 20 20 20 20 70 49  xedBy);.      pI
23b70 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
23b80 64 42 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  dBy = 1;.    }. 
23b90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
23ba0 74 68 65 20 6c 69 73 74 20 6f 66 20 66 75 6e 63  the list of func
23bb0 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74  tion arguments t
23bc0 6f 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 6e  o the SrcList en
23bd0 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62  try for a.** tab
23be0 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 69  le-valued-functi
23bf0 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
23c00 74 65 33 53 72 63 4c 69 73 74 46 75 6e 63 41 72  te3SrcListFuncAr
23c10 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  gs(Parse *pParse
23c20 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 45 78  , SrcList *p, Ex
23c30 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
23c40 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
23c50 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
23c60 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
23c70 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
23c80 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
23c90 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  >fg.notIndexed==
23ca0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
23cb0 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
23cc0 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20  exedBy==0 );.   
23cd0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
23ce0 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20  fg.isTabFunc==0 
23cf0 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 31  );.    pItem->u1
23d00 2e 70 46 75 6e 63 41 72 67 20 3d 20 70 4c 69 73  .pFuncArg = pLis
23d10 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  t;.    pItem->fg
23d20 2e 69 73 54 61 62 46 75 6e 63 20 3d 20 31 3b 0a  .isTabFunc = 1;.
23d30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
23d40 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
23d50 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
23d60 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  List);.  }.}../*
23d70 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e  .** When buildin
23d80 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75  g up a FROM clau
23d90 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  se in the parser
23da0 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  , the join opera
23db0 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61  tor.** is initia
23dc0 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f 20  lly attached to 
23dd0 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
23de0 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65 20  .  But the code 
23df0 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70  generator.** exp
23e00 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ects the join op
23e10 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20  erator to be on 
23e20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
23e30 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
23e40 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a  .** Shifts all j
23e50 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72  oin operators fr
23e60 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
23e70 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46   for an entire F
23e80 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a  ROM.** clause..*
23e90 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75  *.** Example: Su
23ea0 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69  ppose the join i
23eb0 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
23ec0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20 6e  **           A n
23ed0 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69  atural cross joi
23ee0 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  n B.**.** The op
23ef0 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72  erator is "natur
23f00 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20  al cross join". 
23f10 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65   The A and B ope
23f20 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64  rands are stored
23f30 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61  .** in p->a[0] a
23f40 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70  nd p->a[1], resp
23f50 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70  ectively.  The p
23f60 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20  arser initially 
23f70 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70  stores the.** op
23f80 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20  erator with A.  
23f90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69  This routine shi
23fa0 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f  fts that operato
23fb0 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a  r over to B..*/.
23fc0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
23fd0 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65  istShiftJoinType
23fe0 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20  (SrcList *p){.  
23ff0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
24000 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d   i;.    for(i=p-
24010 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d  >nSrc-1; i>0; i-
24020 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69  -){.      p->a[i
24030 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  ].fg.jointype = 
24040 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f 69  p->a[i-1].fg.joi
24050 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20  ntype;.    }.   
24060 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69 6e   p->a[0].fg.join
24070 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  type = 0;.  }.}.
24080 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
24090 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20  VDBE code for a 
240a0 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e  BEGIN statement.
240b0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
240c0 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  BeginTransaction
240d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
240e0 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c  int type){.  sql
240f0 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
24100 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20   *v;.  int i;.. 
24110 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
24120 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  =0 );.  db = pPa
24130 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
24140 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
24150 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
24160 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
24170 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
24180 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b  BEGIN", 0, 0) ){
24190 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
241a0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
241b0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
241c0 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e   if( !v ) return
241d0 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b  ;.  if( type!=TK
241e0 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20  _DEFERRED ){.   
241f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
24200 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
24210 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24220 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  p2(v, OP_Transac
24230 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d  tion, i, (type==
24240 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29  TK_EXCLUSIVE)+1)
24250 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
24260 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
24270 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  i);.    }.  }.  
24280 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24290 30 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  0(v, OP_AutoComm
242a0 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  it);.}../*.** Ge
242b0 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
242c0 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72   for a COMMIT or
242d0 20 52 4f 4c 4c 42 41 43 4b 20 73 74 61 74 65 6d   ROLLBACK statem
242e0 65 6e 74 2e 0a 2a 2a 20 43 6f 64 65 20 66 6f 72  ent..** Code for
242f0 20 52 4f 4c 4c 42 41 43 4b 20 69 73 20 67 65 6e   ROLLBACK is gen
24300 65 72 61 74 65 64 20 69 66 20 65 54 79 70 65 3d  erated if eType=
24310 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20 4f  =TK_ROLLBACK.  O
24320 74 68 65 72 77 69 73 65 0a 2a 2a 20 63 6f 64 65  therwise.** code
24330 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 6f   is generated fo
24340 72 20 61 20 43 4f 4d 4d 49 54 2e 0a 2a 2f 0a 76  r a COMMIT..*/.v
24350 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 72  oid sqlite3EndTr
24360 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
24370 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 54 79  *pParse, int eTy
24380 70 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  pe){.  Vdbe *v;.
24390 20 20 69 6e 74 20 69 73 52 6f 6c 6c 62 61 63 6b    int isRollback
243a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
243b0 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
243c0 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d  rt( pParse->db!=
243d0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  0 );.  assert( e
243e0 54 79 70 65 3d 3d 54 4b 5f 43 4f 4d 4d 49 54 20  Type==TK_COMMIT 
243f0 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 45 4e 44  || eType==TK_END
24400 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f   || eType==TK_RO
24410 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 69 73 52 6f  LLBACK );.  isRo
24420 6c 6c 62 61 63 6b 20 3d 20 65 54 79 70 65 3d 3d  llback = eType==
24430 54 4b 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 69  TK_ROLLBACK;.  i
24440 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
24450 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
24460 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
24470 0a 20 20 20 20 20 20 20 69 73 52 6f 6c 6c 62 61  .       isRollba
24480 63 6b 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 22 20  ck ? "ROLLBACK" 
24490 3a 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  : "COMMIT", 0, 0
244a0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
244b0 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74  .  }.  v = sqlit
244c0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
244d0 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
244e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
244f0 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op2(v, OP_AutoCo
24500 6d 6d 69 74 2c 20 31 2c 20 69 73 52 6f 6c 6c 62  mmit, 1, isRollb
24510 61 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ack);.  }.}../*.
24520 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
24530 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
24540 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74  e parser when it
24550 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e   parses a comman
24560 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20  d to create,.** 
24570 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
24580 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70  ack an SQL savep
24590 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  oint. .*/.void s
245a0 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28  qlite3Savepoint(
245b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
245c0 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e  nt op, Token *pN
245d0 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
245e0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
245f0 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
24600 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  e->db, pName);. 
24610 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
24620 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
24630 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
24640 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
24650 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
24660 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63  ATION.    static
24670 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f   const char * co
24680 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45  nst az[] = { "BE
24690 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c  GIN", "RELEASE",
246a0 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20   "ROLLBACK" };. 
246b0 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56 45     assert( !SAVE
246c0 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53  POINT_BEGIN && S
246d0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
246e0 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54  ==1 && SAVEPOINT
246f0 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a  _ROLLBACK==2 );.
24700 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21  #endif.    if( !
24710 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68  v || sqlite3Auth
24720 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
24730 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20  LITE_SAVEPOINT, 
24740 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30  az[op], zName, 0
24750 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
24760 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
24770 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >db, zName);.   
24780 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
24790 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
247a0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76  AddOp4(v, OP_Sav
247b0 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30  epoint, op, 0, 0
247c0 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41  , zName, P4_DYNA
247d0 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  MIC);.  }.}../*.
247e0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
247f0 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69   TEMP database i
24800 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c  s open and avail
24810 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52  able for use.  R
24820 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
24830 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
24840 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
24850 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20  messages in the 
24860 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
24870 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24880 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
24890 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
248a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
248b0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
248c0 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  f( db->aDb[1].pB
248d0 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  t==0 && !pParse-
248e0 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
248f0 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65  int rc;.    Btre
24900 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74  e *pBt;.    stat
24910 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61  ic const int fla
24920 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  gs = .          
24930 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
24940 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20  WRITE |.        
24950 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
24960 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
24970 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
24980 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20  LUSIVE |.       
24990 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
249a0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
249b0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
249c0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20  OPEN_TEMP_DB;.. 
249d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
249e0 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66  treeOpen(db->pVf
249f0 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20  s, 0, db, &pBt, 
24a00 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  0, flags);.    i
24a10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24a20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
24a30 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
24a40 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  , "unable to ope
24a50 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61  n a temporary da
24a60 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20  tabase ".       
24a70 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69   "file for stori
24a80 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
24a90 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61  les");.      pPa
24aa0 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
24ab0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
24ac0 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b    }.    db->aDb[
24ad0 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  1].pBt = pBt;.  
24ae0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
24af0 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
24b00 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
24b10 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72  OMEM==sqlite3Btr
24b20 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 42  eeSetPageSize(pB
24b30 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73  t, db->nextPages
24b40 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20  ize, -1, 0) ){. 
24b50 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
24b60 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20  ault(db);.      
24b70 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
24b80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
24b90 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  }../*.** Record 
24ba0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
24bb0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
24bc0 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  will need to be 
24bd0 76 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20  verified.** for 
24be0 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 20 54  database iDb.  T
24bf0 68 65 20 63 6f 64 65 20 74 6f 20 61 63 74 75 61  he code to actua
24c00 6c 6c 79 20 76 65 72 69 66 79 20 74 68 65 20 73  lly verify the s
24c10 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20  chema cookie.** 
24c20 77 69 6c 6c 20 6f 63 63 75 72 20 61 74 20 74 68  will occur at th
24c30 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 6f 70  e end of the top
24c40 2d 6c 65 76 65 6c 20 56 44 42 45 20 61 6e 64 20  -level VDBE and 
24c50 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
24c60 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20 73  d.** later, by s
24c70 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
24c80 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ng()..*/.void sq
24c90 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
24ca0 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61  chema(Parse *pPa
24cb0 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  rse, int iDb){. 
24cc0 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
24cd0 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
24ce0 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
24cf0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  ;..  assert( iDb
24d00 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72 73  >=0 && iDb<pPars
24d10 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  e->db->nDb );.  
24d20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
24d30 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
24d40 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b  !=0 || iDb==1 );
24d50 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 53  .  assert( iDb<S
24d60 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
24d70 45 44 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74  ED+2 );.  assert
24d80 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
24d90 75 74 65 78 48 65 6c 64 28 70 50 61 72 73 65 2d  utexHeld(pParse-
24da0 3e 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  >db, iDb, 0) );.
24db0 20 20 69 66 28 20 44 62 4d 61 73 6b 54 65 73 74    if( DbMaskTest
24dc0 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b  (pToplevel->cook
24dd0 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
24de0 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74  ){.    DbMaskSet
24df0 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b  (pToplevel->cook
24e00 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20  ieMask, iDb);.  
24e10 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
24e20 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
24e30 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
24e40 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 54  nTempDatabase(pT
24e50 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a  oplevel);.    }.
24e60 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
24e70 61 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20  argument zDb is 
24e80 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20  NULL, then call 
24e90 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
24ea0 79 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61  ySchema() for ea
24eb0 63 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20  ch .** attached 
24ec0 64 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77  database. Otherw
24ed0 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66  ise, invoke it f
24ee0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
24ef0 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a  named zDb only..
24f00 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
24f10 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
24f20 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
24f30 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
24f40 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  zDb){.  sqlite3 
24f50 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
24f60 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
24f70 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
24f80 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
24f90 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
24fa0 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
24fb0 42 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30  Bt && (!zDb || 0
24fc0 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
24fd0 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e  (zDb, pDb->zDbSN
24fe0 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 20 20 73  ame)) ){.      s
24ff0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
25000 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
25010 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
25020 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
25030 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72  DBE code that pr
25040 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67  epares for doing
25050 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68   an operation th
25060 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
25070 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ge the database.
25080 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
25090 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77  ine starts a new
250a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
250b0 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61  we are not alrea
250c0 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74  dy within.** a t
250d0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
250e0 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77  we are already w
250f0 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
25100 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63  ion, then a chec
25110 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74  kpoint.** is set
25120 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65   if the setState
25130 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69  ment parameter i
25140 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b  s true.  A check
25150 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  point should.** 
25160 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61  be set for opera
25170 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74  tions that might
25180 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20   fail (due to a 
25190 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74  constraint) part
251a0 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74   of.** the way t
251b0 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68  hrough and which
251c0 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e   will need to un
251d0 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77  do some writes w
251e0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
251f0 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  .** rollback the
25200 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69   whole transacti
25210 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69  on.  For operati
25220 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f  ons where all co
25230 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e  nstraints.** can
25240 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f   be checked befo
25250 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61  re any changes a
25260 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
25270 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e  atabase, it is n
25280 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72  ever.** necessar
25290 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74  y to undo a writ
252a0 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70  e and the checkp
252b0 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  oint should not 
252c0 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  be set..*/.void 
252d0 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
252e0 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65  eOperation(Parse
252f0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65   *pParse, int se
25300 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20  tStatement, int 
25310 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  iDb){.  Parse *p
25320 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
25330 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
25340 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
25350 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
25360 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
25370 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f  .  DbMaskSet(pTo
25380 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73  plevel->writeMas
25390 6b 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c  k, iDb);.  pTopl
253a0 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69  evel->isMultiWri
253b0 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d 65  te |= setStateme
253c0 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64  nt;.}../*.** Ind
253d0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 73  icate that the s
253e0 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74  tatement current
253f0 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
25400 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72 69 74  ction might writ
25410 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f  e.** more than o
25420 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d 70 6c  ne entry (exampl
25430 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20  e: deleting one 
25440 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72 74 69  row then inserti
25450 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69  ng another,.** i
25460 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c  nserting multipl
25470 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62 6c  e rows in a tabl
25480 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20  e, or inserting 
25490 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78 20  a row and index 
254a0 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20  entries.).** If 
254b0 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72 73 20  an abort occurs 
254c0 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20 74 68  after some of th
254d0 65 73 65 20 77 72 69 74 65 73 20 68 61 76 65 20  ese writes have 
254e0 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e 20  completed, then 
254f0 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65  it will.** be ne
25500 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
25510 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20 77 72  the completed wr
25520 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ites..*/.void sq
25530 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28  lite3MultiWrite(
25540 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
25550 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
25560 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
25570 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
25580 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
25590 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d 20 31  isMultiWrite = 1
255a0 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20  ;.}../* .** The 
255b0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63  code generator c
255c0 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
255d0 65 20 69 66 20 69 73 20 64 69 73 63 6f 76 65 72  e if is discover
255e0 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20  s that it is.** 
255f0 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62 6f 72  possible to abor
25600 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 70 72  t a statement pr
25610 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f  ior to completio
25620 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  n.  In order to 
25630 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 69 73  .** perform this
25640 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74 20 63   abort without c
25650 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20 64 61  orrupting the da
25660 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65 64 20  tabase, we need 
25670 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20  to make.** sure 
25680 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
25690 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65 64 20  nt is protected 
256a0 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  by a statement t
256b0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
256c0 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77  * Technically, w
256d0 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73  e only need to s
256e0 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72 74 20  et the mayAbort 
256f0 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a 20 69  flag if the.** i
25700 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c 61 67  sMultiWrite flag
25710 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
25720 73 65 74 2e 20 20 54 68 65 72 65 20 69 73 20 61  set.  There is a
25730 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79   time dependency
25740 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20 74 68  .** such that th
25750 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f 63 63  e abort must occ
25760 75 72 20 61 66 74 65 72 20 74 68 65 20 6d 75 6c  ur after the mul
25770 74 69 77 72 69 74 65 2e 20 20 54 68 69 73 20 6d  tiwrite.  This m
25780 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61  akes.** some sta
25790 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e  tements involvin
257a0 67 20 74 68 65 20 52 45 50 4c 41 43 45 20 63 6f  g the REPLACE co
257b0 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
257c0 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67  n algorithm.** g
257d0 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74 65  o a little faste
257e0 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67 20 61  r.  But taking a
257f0 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69 73  dvantage of this
25800 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79   time dependency
25810 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72  .** makes it mor
25820 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 70  e difficult to p
25830 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 63 6f  rove that the co
25840 64 65 20 69 73 20 63 6f 72 72 65 63 74 20 28 69  de is correct (i
25850 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72  n .** particular
25860 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20 75 73  , it prevents us
25870 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e   from writing an
25880 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d   effective.** im
25890 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
258a0 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79  sqlite3AssertMay
258b0 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73 6f 20  Abort()) and so 
258c0 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a  we have chosen.*
258d0 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20 73 61  * to take the sa
258e0 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73 6b 69  fe route and ski
258f0 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  p the optimizati
25900 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
25910 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72 73  te3MayAbort(Pars
25920 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61  e *pParse){.  Pa
25930 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
25940 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
25950 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
25960 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41   pToplevel->mayA
25970 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  bort = 1;.}../*.
25980 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61  ** Code an OP_Ha
25990 6c 74 20 74 68 61 74 20 63 61 75 73 65 73 20 74  lt that causes t
259a0 68 65 20 76 64 62 65 20 74 6f 20 72 65 74 75 72  he vdbe to retur
259b0 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n an SQLITE_CONS
259c0 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e  TRAINT.** error.
259d0 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61 72   The onError par
259e0 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65  ameter determine
259f0 73 20 77 68 69 63 68 20 28 69 66 20 61 6e 79 29  s which (if any)
25a00 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
25a10 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72  t.** and/or curr
25a20 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
25a30 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
25a40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 48  */.void sqlite3H
25a50 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  altConstraint(. 
25a60 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
25a70 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
25a80 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65  ntext */.  int e
25a90 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20  rrCode,      /* 
25aa0 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63  extended error c
25ab0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  ode */.  int onE
25ac0 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f  rror,      /* Co
25ad0 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f  nstraint type */
25ae0 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20 20 20  .  char *p4,    
25af0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65       /* Error me
25b00 73 73 61 67 65 20 2a 2f 0a 20 20 69 38 20 70 34  ssage */.  i8 p4
25b10 74 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  type,        /* 
25b20 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50 34 5f  P4_STATIC or P4_
25b30 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75  TRANSIENT */.  u
25b40 38 20 70 35 45 72 72 6d 73 67 20 20 20 20 20 20  8 p5Errmsg      
25b50 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20 74 79   /* P5_ErrMsg ty
25b60 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  pe */.){.  Vdbe 
25b70 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
25b80 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
25b90 73 73 65 72 74 28 20 28 65 72 72 43 6f 64 65 26  ssert( (errCode&
25ba0 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
25bb0 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20 20 69 66  NSTRAINT );.  if
25bc0 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62  ( onError==OE_Ab
25bd0 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ort ){.    sqlit
25be0 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
25bf0 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
25c00 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
25c10 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c  P_Halt, errCode,
25c20 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c   onError, 0, p4,
25c30 20 70 34 74 79 70 65 29 3b 0a 20 20 73 71 6c 69   p4type);.  sqli
25c40 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
25c50 76 2c 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a  v, p5Errmsg);.}.
25c60 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
25c70 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 55 4e  P_Halt due to UN
25c80 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20  IQUE or PRIMARY 
25c90 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  KEY constraint v
25ca0 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  iolation..*/.voi
25cb0 64 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43  d sqlite3UniqueC
25cc0 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
25cd0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
25ce0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
25cf0 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  t */.  int onErr
25d00 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73  or,      /* Cons
25d10 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20  traint type */. 
25d20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
25d30 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
25d40 74 68 61 74 20 74 72 69 67 67 65 72 73 20 74 68  that triggers th
25d50 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
25d60 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  ){.  char *zErr;
25d70 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41  .  int j;.  StrA
25d80 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54  ccum errMsg;.  T
25d90 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64  able *pTab = pId
25da0 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71  x->pTable;..  sq
25db0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
25dc0 74 28 26 65 72 72 4d 73 67 2c 20 70 50 61 72 73  t(&errMsg, pPars
25dd0 65 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 0a 20 20  e->db, 0, 0, .  
25de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25df0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
25e00 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
25e10 4d 49 54 5f 4c 45 4e 47 54 48 5d 29 3b 0a 20 20  MIT_LENGTH]);.  
25e20 69 66 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  if( pIdx->aColEx
25e30 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
25e40 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 65  3_str_appendf(&e
25e50 72 72 4d 73 67 2c 20 22 69 6e 64 65 78 20 27 25  rrMsg, "index '%
25e60 71 27 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  q'", pIdx->zName
25e70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
25e80 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  for(j=0; j<pIdx-
25e90 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  >nKeyCol; j++){.
25ea0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
25eb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
25ec0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
25ed0 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 7a 43  ]>=0 );.      zC
25ee0 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
25ef0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
25f00 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  ]].zName;.      
25f10 69 66 28 20 6a 20 29 20 73 71 6c 69 74 65 33 5f  if( j ) sqlite3_
25f20 73 74 72 5f 61 70 70 65 6e 64 28 26 65 72 72 4d  str_append(&errM
25f30 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20  sg, ", ", 2);.  
25f40 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
25f50 61 70 70 65 6e 64 61 6c 6c 28 26 65 72 72 4d 73  appendall(&errMs
25f60 67 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  g, pTab->zName);
25f70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
25f80 74 72 5f 61 70 70 65 6e 64 28 26 65 72 72 4d 73  tr_append(&errMs
25f90 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20 20 20  g, ".", 1);.    
25fa0 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
25fb0 70 65 6e 64 61 6c 6c 28 26 65 72 72 4d 73 67 2c  pendall(&errMsg,
25fc0 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   zCol);.    }.  
25fd0 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74  }.  zErr = sqlit
25fe0 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
25ff0 28 26 65 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c  (&errMsg);.  sql
26000 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
26010 6e 74 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  nt(pParse, .    
26020 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
26030 78 28 70 49 64 78 29 20 3f 20 53 51 4c 49 54 45  x(pIdx) ? SQLITE
26040 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d  _CONSTRAINT_PRIM
26050 41 52 59 4b 45 59 20 0a 20 20 20 20 20 20 20 20  ARYKEY .        
26060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26070 20 20 20 20 3a 20 53 51 4c 49 54 45 5f 43 4f 4e      : SQLITE_CON
26080 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 2c 0a  STRAINT_UNIQUE,.
26090 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20 7a 45 72      onError, zEr
260a0 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20 50  r, P4_DYNAMIC, P
260b0 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71  5_ConstraintUniq
260c0 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ue);.}.../*.** C
260d0 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64  ode an OP_Halt d
260e0 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65  ue to non-unique
260f0 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20   rowid..*/.void 
26100 73 71 6c 69 74 65 33 52 6f 77 69 64 43 6f 6e 73  sqlite3RowidCons
26110 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
26120 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
26130 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
26140 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
26150 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
26160 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
26170 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54 61 62 6c  orithm */.  Tabl
26180 65 20 2a 70 54 61 62 20 20 20 20 20 20 20 2f 2a  e *pTab       /*
26190 20 54 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   The table with 
261a0 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72  the non-unique r
261b0 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20 20 63 68  owid */ .){.  ch
261c0 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74 20  ar *zMsg;.  int 
261d0 72 63 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  rc;.  if( pTab->
261e0 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20  iPKey>=0 ){.    
261f0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
26200 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
26210 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d  , "%s.%s", pTab-
26220 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
26230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26240 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61    pTab->aCol[pTa
26250 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29  b->iPKey].zName)
26260 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
26270 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49  E_CONSTRAINT_PRI
26280 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65 6c 73 65  MARYKEY;.  }else
26290 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  {.    zMsg = sql
262a0 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
262b0 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72 6f 77 69  se->db, "%s.rowi
262c0 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
262d0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
262e0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57  E_CONSTRAINT_ROW
262f0 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ID;.  }.  sqlite
26300 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
26310 70 50 61 72 73 65 2c 20 72 63 2c 20 6f 6e 45 72  pParse, rc, onEr
26320 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  ror, zMsg, P4_DY
26330 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20 20 20 20  NAMIC,.         
26340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
26350 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71  5_ConstraintUniq
26360 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ue);.}../*.** Ch
26370 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49  eck to see if pI
26380 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f  ndex uses the co
26390 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
263a0 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a   pColl.  Return.
263b0 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  ** true if it do
263c0 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  es and false if 
263d0 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a  it does not..*/.
263e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
263f0 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
26400 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e  ic int collation
26410 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72  Match(const char
26420 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a   *zColl, Index *
26430 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69  pIndex){.  int i
26440 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c  ;.  assert( zCol
26450 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  l!=0 );.  for(i=
26460 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f  0; i<pIndex->nCo
26470 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
26480 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
26490 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
264a0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  ];.    assert( z
264b0 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 61  !=0 || pIndex->a
264c0 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a  iColumn[i]<0 );.
264d0 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
264e0 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26  aiColumn[i]>=0 &
264f0 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  & 0==sqlite3StrI
26500 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Cmp(z, zColl) ){
26510 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
26520 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
26530 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
26540 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
26550 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
26560 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74 68  pTab that use th
26570 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
26580 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49  ence pColl..** I
26590 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20  f pColl==0 then 
265a0 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  recompute all in
265b0 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a  dices of pTab..*
265c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
265d0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
265e0 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65  atic void reinde
265f0 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  xTable(Parse *pP
26600 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
26610 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  b, char const *z
26620 43 6f 6c 6c 29 7b 0a 20 20 69 66 28 20 21 49 73  Coll){.  if( !Is
26630 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
26640 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  .    Index *pInd
26650 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
26660 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
26670 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
26680 62 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 70 49  b */..    for(pI
26690 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  ndex=pTab->pInde
266a0 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
266b0 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29  x=pIndex->pNext)
266c0 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c  {.      if( zCol
266d0 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f  l==0 || collatio
266e0 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49  nMatch(zColl, pI
266f0 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20  ndex) ){.       
26700 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
26710 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
26720 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
26730 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
26740 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
26750 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
26760 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
26770 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
26780 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
26790 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
267a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
267b0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
267c0 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  * Recompute all 
267d0 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74  indices of all t
267e0 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  ables in all dat
267f0 61 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65  abases where the
26800 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20  .** indices use 
26810 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
26820 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49  quence pColl.  I
26830 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20  f pColl==0 then 
26840 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c  recompute.** all
26850 20 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68   indices everywh
26860 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ere..*/.#ifndef 
26870 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
26880 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
26890 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
268a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
268b0 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
268c0 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  l){.  Db *pDb;  
268d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268e0 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61    /* A single da
268f0 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
26900 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
26910 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
26920 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75  atabase index nu
26930 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mber */.  sqlite
26940 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
26950 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74  db;   /* The dat
26960 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
26970 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   */.  HashElem *
26980 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
26990 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
269a0 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20   over tables in 
269b0 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  pDb */.  Table *
269c0 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
269d0 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
269e0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
269f0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
26a00 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
26a10 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
26a20 20 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20    /* Needed for 
26a30 73 63 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f  schema access */
26a40 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44  .  for(iDb=0, pD
26a50 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64  b=db->aDb; iDb<d
26a60 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70  b->nDb; iDb++, p
26a70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72  Db++){.    asser
26a80 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20  t( pDb!=0 );.   
26a90 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73   for(k=sqliteHas
26aa0 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63  hFirst(&pDb->pSc
26ab0 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
26ac0 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68   k; k=sqliteHash
26ad0 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20  Next(k)){.      
26ae0 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73  pTab = (Table*)s
26af0 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29  qliteHashData(k)
26b00 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54  ;.      reindexT
26b10 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
26b20 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  b, zColl);.    }
26b30 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
26b40 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
26b50 64 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44  de for the REIND
26b60 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
26b70 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
26b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b90 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31              -- 1
26ba0 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
26bb0 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20  EX  <collation> 
26bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
26bd0 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   2.**        REI
26be0 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65  NDEX  ?<database
26bf0 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20  >.?<tablename>  
26c00 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 3.**        R
26c10 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
26c20 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e  se>.?<indexname>
26c30 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72    -- 4.**.** For
26c40 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69  m 1 causes all i
26c50 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74  ndices in all at
26c60 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
26c70 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a   to be rebuilt..
26c80 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c  ** Form 2 rebuil
26c90 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  ds all indices i
26ca0 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  n all databases 
26cb0 74 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d  that use the nam
26cc0 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20  ed.** collating 
26cd0 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73  function.  Forms
26ce0 20 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64   3 and 4 rebuild
26cf0 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
26d00 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63   or all.** indic
26d10 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
26d20 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  th the named tab
26d30 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  le..*/.#ifndef S
26d40 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
26d50 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  EX.void sqlite3R
26d60 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  eindex(Parse *pP
26d70 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
26d80 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  me1, Token *pNam
26d90 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e2){.  CollSeq *
26da0 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
26db0 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
26dc0 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72  sequence to be r
26dd0 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c  eindexed, or NUL
26de0 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  L */.  char *z; 
26df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e00 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20     /* Name of a 
26e10 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a  table or index *
26e20 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
26e30 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  zDb;            
26e40 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
26e50 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62  atabase */.  Tab
26e60 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
26e70 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
26e80 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
26e90 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ase */.  Index *
26ea0 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  pIndex;         
26eb0 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
26ec0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
26ed0 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
26ee0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
26ef0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
26f00 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
26f10 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
26f20 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
26f30 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
26f40 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
26f50 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a  */.  Token *pObj
26f60 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
26f70 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
26f80 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
26f90 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a  o be reindexed *
26fa0 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  /..  /* Read the
26fb0 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
26fc0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
26fd0 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
26fe0 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
26ff0 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
27000 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
27010 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
27020 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
27030 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
27040 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
27050 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e  n;.  }..  if( pN
27060 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ame1==0 ){.    r
27070 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
27080 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20  pParse, 0);.    
27090 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
270a0 69 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32  if( NEVER(pName2
270b0 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e  ==0) || pName2->
270c0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  z==0 ){.    char
270d0 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73   *zColl;.    ass
270e0 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29  ert( pName1->z )
270f0 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71  ;.    zColl = sq
27100 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
27110 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
27120 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20  Name1);.    if( 
27130 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b  !zColl ) return;
27140 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
27150 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
27160 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
27170 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ll, 0);.    if( 
27180 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
27190 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
271a0 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a  pParse, zColl);.
271b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
271c0 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
271d0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
271e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
271f0 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
27200 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
27210 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
27220 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
27230 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61   pName2, &pObjNa
27240 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
27250 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d   ) return;.  z =
27260 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
27270 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61  Token(db, pObjNa
27280 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  me);.  if( z==0 
27290 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20  ) return;.  zDb 
272a0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
272b0 44 62 53 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20  DbSName;.  pTab 
272c0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
272d0 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a  le(db, z, zDb);.
272e0 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
272f0 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70    reindexTable(p
27300 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b  Parse, pTab, 0);
27310 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
27320 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72  ee(db, z);.    r
27330 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e  eturn;.  }.  pIn
27340 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
27350 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44  dIndex(db, z, zD
27360 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  b);.  sqlite3DbF
27370 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66  ree(db, z);.  if
27380 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
27390 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
273a0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
273b0 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 0, iDb);.    
273c0 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
273d0 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
273e0 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  x, -1);.    retu
273f0 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
27400 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
27410 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65  , "unable to ide
27420 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74  ntify the object
27430 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
27440 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ");.}.#endif../*
27450 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 4b 65 79  .** Return a Key
27460 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
27470 68 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61  hat is appropria
27480 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  te for the given
27490 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68   Index..**.** Th
274a0 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  e caller should 
274b0 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b 65  invoke sqlite3Ke
274c0 79 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e 20  yInfoUnref() on 
274d0 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a  the returned obj
274e0 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20 68  ect.** when it h
274f0 61 73 20 66 69 6e 69 73 68 65 64 20 75 73 69 6e  as finished usin
27500 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f  g it..*/.KeyInfo
27510 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f   *sqlite3KeyInfo
27520 4f 66 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  OfIndex(Parse *p
27530 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
27540 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dx){.  int i;.  
27550 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d  int nCol = pIdx-
27560 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20  >nColumn;.  int 
27570 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e 4b 65  nKey = pIdx->nKe
27580 79 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  yCol;.  KeyInfo 
27590 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20 70 50 61  *pKey;.  if( pPa
275a0 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
275b0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 64 78  rn 0;.  if( pIdx
275c0 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29 7b  ->uniqNotNull ){
275d0 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69  .    pKey = sqli
275e0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
275f0 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79  pParse->db, nKey
27600 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20  , nCol-nKey);.  
27610 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 20  }else{.    pKey 
27620 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
27630 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
27640 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d 0a  , nCol, 0);.  }.
27650 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
27660 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27670 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
27680 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20 20 20  ble(pKey) );.   
27690 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
276a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
276b0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
276c0 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  = pIdx->azColl[i
276d0 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61  ];.      pKey->a
276e0 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3d  Coll[i] = zColl=
276f0 3d 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52  =sqlite3StrBINAR
27700 59 20 3f 20 30 20 3a 0a 20 20 20 20 20 20 20 20  Y ? 0 :.        
27710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27720 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
27730 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
27740 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d  ll);.      pKey-
27750 3e 61 53 6f 72 74 46 6c 61 67 73 5b 69 5d 20 3d  >aSortFlags[i] =
27760 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
27770 72 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  r[i];.      asse
27780 72 74 28 20 30 3d 3d 28 70 4b 65 79 2d 3e 61 53  rt( 0==(pKey->aS
27790 6f 72 74 46 6c 61 67 73 5b 69 5d 20 26 20 4b 45  ortFlags[i] & KE
277a0 59 49 4e 46 4f 5f 4f 52 44 45 52 5f 42 49 47 4e  YINFO_ORDER_BIGN
277b0 55 4c 4c 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  ULL) );.    }.  
277c0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
277d0 72 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  rr ){.      asse
277e0 72 74 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d  rt( pParse->rc==
277f0 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f 4d 49 53  SQLITE_ERROR_MIS
27800 53 49 4e 47 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a  SING_COLLSEQ );.
27810 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
27820 62 4e 6f 51 75 65 72 79 3d 3d 30 20 29 7b 0a 20  bNoQuery==0 ){. 
27830 20 20 20 20 20 20 20 2f 2a 20 44 65 61 63 74 69         /* Deacti
27840 76 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 62  vate the index b
27850 65 63 61 75 73 65 20 69 74 20 63 6f 6e 74 61 69  ecause it contai
27860 6e 73 20 61 6e 20 75 6e 6b 6e 6f 77 6e 20 63 6f  ns an unknown co
27870 6c 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 20 20  llating.        
27880 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68  ** sequence.  Th
27890 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 72 65  e only way to re
278a0 61 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78  active the index
278b0 20 69 73 20 74 6f 20 72 65 6c 6f 61 64 20 74 68   is to reload th
278c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 63 68  e.        ** sch
278d0 65 6d 61 2e 20 20 41 64 64 69 6e 67 20 74 68 65  ema.  Adding the
278e0 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69   missing collati
278f0 6e 67 20 73 65 71 75 65 6e 63 65 20 6c 61 74 65  ng sequence late
27900 72 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20  r does not.     
27910 20 20 20 2a 2a 20 72 65 61 63 74 69 76 65 20 74     ** reactive t
27920 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 61  he index.  The a
27930 70 70 6c 69 63 61 74 69 6f 6e 20 68 61 64 20 74  pplication had t
27940 68 65 20 63 68 61 6e 63 65 20 74 6f 20 72 65 67  he chance to reg
27950 69 73 74 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  ister.        **
27960 20 74 68 65 20 6d 69 73 73 69 6e 67 20 69 6e 64   the missing ind
27970 65 78 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c  ex using the col
27980 6c 61 74 69 6f 6e 2d 6e 65 65 64 65 64 20 63 61  lation-needed ca
27990 6c 6c 62 61 63 6b 2e 20 20 46 6f 72 0a 20 20 20  llback.  For.   
279a0 20 20 20 20 20 2a 2a 20 73 69 6d 70 6c 69 63 69       ** simplici
279b0 74 79 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  ty, SQLite will 
279c0 6e 6f 74 20 67 69 76 65 20 74 68 65 20 61 70 70  not give the app
279d0 6c 69 63 61 74 69 6f 6e 20 61 20 73 65 63 6f 6e  lication a secon
279e0 64 20 63 68 61 6e 63 65 2e 0a 20 20 20 20 20 20  d chance..      
279f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49 64    */.        pId
27a00 78 2d 3e 62 4e 6f 51 75 65 72 79 20 3d 20 31 3b  x->bNoQuery = 1;
27a10 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
27a20 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
27a30 4f 52 5f 52 45 54 52 59 3b 0a 20 20 20 20 20 20  OR_RETRY;.      
27a40 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b  }.      sqlite3K
27a50 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
27a60 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20  );.      pKey = 
27a70 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
27a80 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a 23  eturn pKey;.}..#
27a90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
27aa0 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68  IT_CTE./* .** Th
27ab0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
27ac0 76 6f 6b 65 64 20 6f 6e 63 65 20 70 65 72 20 43  voked once per C
27ad0 54 45 20 62 79 20 74 68 65 20 70 61 72 73 65 72  TE by the parser
27ae0 20 77 68 69 6c 65 20 70 61 72 73 69 6e 67 20 61   while parsing a
27af0 20 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65   .** WITH clause
27b00 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a 73 71 6c 69  . .*/.With *sqli
27b10 74 65 33 57 69 74 68 41 64 64 28 0a 20 20 50 61  te3WithAdd(.  Pa
27b20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
27b30 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
27b40 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 69   context */.  Wi
27b50 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20  th *pWith,      
27b60 20 20 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e        /* Existin
27b70 67 20 57 49 54 48 20 63 6c 61 75 73 65 2c 20 6f  g WITH clause, o
27b80 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  r NULL */.  Toke
27b90 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20  n *pName,       
27ba0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
27bb0 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20  he common-table 
27bc0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
27bd0 41 72 67 6c 69 73 74 2c 20 20 20 20 20 2f 2a 20  Arglist,     /* 
27be0 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20  Optional column 
27bf0 6e 61 6d 65 20 6c 69 73 74 20 66 6f 72 20 74 68  name list for th
27c00 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c  e table */.  Sel
27c10 65 63 74 20 2a 70 51 75 65 72 79 20 20 20 20 20  ect *pQuery     
27c20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 75 73       /* Query us
27c30 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
27c40 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b   the table */.){
27c50 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
27c60 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 57   pParse->db;.  W
27c70 69 74 68 20 2a 70 4e 65 77 3b 0a 20 20 63 68 61  ith *pNew;.  cha
27c80 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20  r *zName;..  /* 
27c90 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 43  Check that the C
27ca0 54 45 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  TE name is uniqu
27cb0 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 57 49  e within this WI
27cc0 54 48 20 63 6c 61 75 73 65 2e 20 49 66 0a 20 20  TH clause. If.  
27cd0 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72 65 20 61 6e  ** not, store an
27ce0 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61   error in the Pa
27cf0 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a  rse structure. *
27d00 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  zName = sqli
27d10 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
27d20 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
27d30 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
27d40 20 26 26 20 70 57 69 74 68 20 29 7b 0a 20 20 20   && pWith ){.   
27d50 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
27d60 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43  i=0; i<pWith->nC
27d70 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
27d80 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
27d90 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68 2d  mp(zName, pWith-
27da0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
27db0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
27dc0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
27dd0 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 57 49  e, "duplicate WI
27de0 54 48 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25  TH table name: %
27df0 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
27e00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
27e10 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
27e20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
27e30 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
27e40 70 57 69 74 68 29 20 2b 20 28 73 69 7a 65 6f 66  pWith) + (sizeof
27e50 28 70 57 69 74 68 2d 3e 61 5b 31 5d 29 20 2a 20  (pWith->a[1]) * 
27e60 70 57 69 74 68 2d 3e 6e 43 74 65 29 3b 0a 20 20  pWith->nCte);.  
27e70 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
27e80 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 57  DbRealloc(db, pW
27e90 69 74 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  ith, nByte);.  }
27ea0 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d  else{.    pNew =
27eb0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
27ec0 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
27ed0 2a 70 57 69 74 68 29 29 3b 0a 20 20 7d 0a 20 20  *pWith));.  }.  
27ee0 61 73 73 65 72 74 28 20 28 70 4e 65 77 21 3d 30  assert( (pNew!=0
27ef0 20 26 26 20 7a 4e 61 6d 65 21 3d 30 29 20 7c 7c   && zName!=0) ||
27f00 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
27f10 64 20 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  d );..  if( db->
27f20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
27f30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
27f40 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 41  istDelete(db, pA
27f50 72 67 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  rglist);.    sql
27f60 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
27f70 28 64 62 2c 20 70 51 75 65 72 79 29 3b 0a 20 20  (db, pQuery);.  
27f80 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
27f90 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
27fa0 70 4e 65 77 20 3d 20 70 57 69 74 68 3b 0a 20 20  pNew = pWith;.  
27fb0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
27fc0 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70  >a[pNew->nCte].p
27fd0 53 65 6c 65 63 74 20 3d 20 70 51 75 65 72 79 3b  Select = pQuery;
27fe0 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65  .    pNew->a[pNe
27ff0 77 2d 3e 6e 43 74 65 5d 2e 70 43 6f 6c 73 20 3d  w->nCte].pCols =
28000 20 70 41 72 67 6c 69 73 74 3b 0a 20 20 20 20 70   pArglist;.    p
28010 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74  New->a[pNew->nCt
28020 65 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  e].zName = zName
28030 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e  ;.    pNew->a[pN
28040 65 77 2d 3e 6e 43 74 65 5d 2e 7a 43 74 65 45 72  ew->nCte].zCteEr
28050 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  r = 0;.    pNew-
28060 3e 6e 43 74 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  >nCte++;.  }..  
28070 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
28080 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 63  /*.** Free the c
28090 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 57  ontents of the W
280a0 69 74 68 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ith object passe
280b0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
280c0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  argument..*/.voi
280d0 64 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c  d sqlite3WithDel
280e0 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
280f0 20 57 69 74 68 20 2a 70 57 69 74 68 29 7b 0a 20   With *pWith){. 
28100 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
28110 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
28120 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e  (i=0; i<pWith->n
28130 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
28140 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43 74   struct Cte *pCt
28150 65 20 3d 20 26 70 57 69 74 68 2d 3e 61 5b 69 5d  e = &pWith->a[i]
28160 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
28170 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
28180 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a  , pCte->pCols);.
28190 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
281a0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  ectDelete(db, pC
281b0 74 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  te->pSelect);.  
281c0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
281d0 65 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  e(db, pCte->zNam
281e0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
281f0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
28200 70 57 69 74 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65  pWith);.  }.}.#e
28210 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
28220 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45  (SQLITE_OMIT_CTE
28230 29 20 2a 2f 0a                                   ) */.