/ Hex Artifact Content
Login

Artifact 0c9704f95817aa585fdad2668c611280d0b62bc4c1c836cd1c797ba96879a7d6:


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 43 6f 6e 76 65 72 74 20 61 6e 20 74 61 62 6c   Convert an tabl
6ed0: 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
6ee0: 69 6e 74 6f 20 61 20 69 6e 64 65 78 20 63 6f 6c  into a index col
6ef0: 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68 61  umn number.  Tha
6f00: 74 20 69 73 2c 0a 2a 2a 20 66 6f 72 20 74 68 65  t is,.** for the
6f10: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 69 6e 20   column iCol in 
6f20: 74 68 65 20 74 61 62 6c 65 20 28 61 73 20 64 65  the table (as de
6f30: 66 69 6e 65 64 20 62 79 20 74 68 65 20 43 52 45  fined by the CRE
6f40: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
6f50: 65 6e 74 29 0a 2a 2a 20 66 69 6e 64 20 74 68 65  ent).** find the
6f60: 20 28 66 69 72 73 74 29 20 6f 66 66 73 65 74 20   (first) offset 
6f70: 6f 66 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  of that column i
6f80: 6e 20 69 6e 64 65 78 20 70 49 64 78 2e 20 20 4f  n index pIdx.  O
6f90: 72 20 72 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69  r return -1.** i
6fa0: 66 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 69 73  f column iCol is
6fb0: 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 69 6e 64   not used in ind
6fc0: 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 69 31 36 20  ex pIdx..*/.i16 
6fd0: 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75  sqlite3TableColu
6fe0: 6d 6e 54 6f 49 6e 64 65 78 28 49 6e 64 65 78 20  mnToIndex(Index 
6ff0: 2a 70 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29  *pIdx, i16 iCol)
7000: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
7010: 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43  (i=0; i<pIdx->nC
7020: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
7030: 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d   if( iCol==pIdx-
7040: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72  >aiColumn[i] ) r
7050: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
7060: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 23 69 66  eturn -1;.}..#if
7070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7080: 5f 47 45 4e 45 52 41 54 45 44 5f 43 4f 4c 55 4d  _GENERATED_COLUM
7090: 4e 53 0a 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20  NS./* Convert a 
70a0: 73 74 6f 72 61 67 65 20 63 6f 6c 75 6d 6e 20 6e  storage column n
70b0: 75 6d 62 65 72 20 69 6e 74 6f 20 61 20 74 61 62  umber into a tab
70c0: 6c 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  le column number
70d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 6f 72  ..**.** The stor
70e0: 61 67 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  age column numbe
70f0: 72 20 28 30 2c 31 2c 32 2c 2e 2e 2e 2e 29 20 69  r (0,1,2,....) i
7100: 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
7110: 68 65 20 76 61 6c 75 65 0a 2a 2a 20 61 73 20 69  he value.** as i
7120: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
7130: 20 72 65 63 6f 72 64 20 6f 6e 20 64 69 73 6b 2e   record on disk.
7140: 20 20 54 68 65 20 74 72 75 65 20 63 6f 6c 75 6d    The true colum
7150: 6e 20 6e 75 6d 62 65 72 0a 2a 2a 20 69 73 20 74  n number.** is t
7160: 68 65 20 69 6e 64 65 78 20 28 30 2c 31 2c 32 2c  he index (0,1,2,
7170: 2e 2e 2e 29 20 6f 66 20 74 68 65 20 63 6f 6c 75  ...) of the colu
7180: 6d 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  mn in the CREATE
7190: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
71a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 6f 72  ..**.** The stor
71b0: 61 67 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  age column numbe
71c0: 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74  r is less than t
71d0: 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
71e0: 6e 75 6d 62 65 72 20 69 66 0a 2a 2a 20 61 6e 64  number if.** and
71f0: 20 6f 6e 6c 79 20 74 68 65 72 65 20 61 72 65 20   only there are 
7200: 56 49 52 54 55 41 4c 20 63 6f 6c 75 6d 6e 73 20  VIRTUAL columns 
7210: 74 6f 20 74 68 65 20 6c 65 66 74 2e 0a 2a 2a 0a  to the left..**.
7220: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ** If SQLITE_OMI
7230: 54 5f 47 45 4e 45 52 41 54 45 44 5f 43 4f 4c 55  T_GENERATED_COLU
7240: 4d 4e 53 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  MNS, this routin
7250: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6d 61 63  e is a no-op mac
7260: 72 6f 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c 69 74  ro..*/.i16 sqlit
7270: 65 33 53 74 6f 72 61 67 65 43 6f 6c 75 6d 6e 54  e3StorageColumnT
7280: 6f 54 61 62 6c 65 28 54 61 62 6c 65 20 2a 70 54  oTable(Table *pT
7290: 61 62 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20  ab, i16 iCol){. 
72a0: 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c   if( pTab->tabFl
72b0: 61 67 73 20 26 20 54 46 5f 48 61 73 56 69 72 74  ags & TF_HasVirt
72c0: 75 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ual ){.    int i
72d0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
72e0: 3c 3d 69 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <=iCol; i++){.  
72f0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43      if( pTab->aC
7300: 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26  ol[i].colFlags &
7310: 20 43 4f 4c 46 4c 41 47 5f 56 49 52 54 55 41 4c   COLFLAG_VIRTUAL
7320: 20 29 20 69 43 6f 6c 2b 2b 3b 0a 20 20 20 20 7d   ) iCol++;.    }
7330: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 43  .  }.  return iC
7340: 6f 6c 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ol;.}.#endif..#i
7350: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7360: 54 5f 47 45 4e 45 52 41 54 45 44 5f 43 4f 4c 55  T_GENERATED_COLU
7370: 4d 4e 53 0a 2f 2a 20 43 6f 6e 76 65 72 74 20 61  MNS./* Convert a
7380: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 6e 75   table column nu
7390: 6d 62 65 72 20 69 6e 74 6f 20 61 20 73 74 6f 72  mber into a stor
73a0: 61 67 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  age column numbe
73b0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 6f  r..**.** The sto
73c0: 72 61 67 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  rage column numb
73d0: 65 72 20 28 30 2c 31 2c 32 2c 2e 2e 2e 2e 29 20  er (0,1,2,....) 
73e0: 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
73f0: 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 61 73 20  the value.** as 
7400: 69 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  it appears in th
7410: 65 20 72 65 63 6f 72 64 20 6f 6e 20 64 69 73 6b  e record on disk
7420: 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 69 6e  .  Or, if the in
7430: 70 75 74 20 63 6f 6c 75 6d 6e 20 69 73 0a 2a 2a  put column is.**
7440: 20 74 68 65 20 4e 2d 74 68 20 76 69 72 74 75 61   the N-th virtua
7450: 6c 20 63 6f 6c 75 6d 6e 20 28 7a 65 72 6f 2d 62  l column (zero-b
7460: 61 73 65 64 29 20 74 68 65 6e 20 74 68 65 20 73  ased) then the s
7470: 74 6f 72 61 67 65 20 6e 75 6d 62 65 72 20 69 73  torage number is
7480: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
7490: 66 20 6e 6f 6e 2d 76 69 72 74 75 61 6c 20 63 6f  f non-virtual co
74a0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
74b0: 6c 65 20 70 6c 75 73 20 4e 2e 20 20 0a 2a 2a 0a  le plus N.  .**.
74c0: 2a 2a 20 54 68 65 20 74 72 75 65 20 63 6f 6c 75  ** The true colu
74d0: 6d 6e 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65  mn number is the
74e0: 20 69 6e 64 65 78 20 28 30 2c 31 2c 32 2c 2e 2e   index (0,1,2,..
74f0: 2e 29 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  .) of the column
7500: 20 69 6e 0a 2a 2a 20 74 68 65 20 43 52 45 41 54   in.** the CREAT
7510: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
7520: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
7530: 69 6e 70 75 74 20 63 6f 6c 75 6d 6e 20 69 73 20  input column is 
7540: 61 20 56 49 52 54 55 41 4c 20 63 6f 6c 75 6d 6e  a VIRTUAL column
7550: 2c 20 74 68 65 6e 20 69 74 20 73 68 6f 75 6c 64  , then it should
7560: 20 6e 6f 74 20 61 70 70 65 61 72 0a 2a 2a 20 69   not appear.** i
7570: 6e 20 73 74 6f 72 61 67 65 2e 20 20 42 75 74 20  n storage.  But 
7580: 74 68 65 20 76 61 6c 75 65 20 73 6f 6d 65 74 69  the value someti
7590: 6d 65 73 20 69 73 20 63 61 63 68 65 64 20 69 6e  mes is cached in
75a0: 20 72 65 67 69 73 74 65 72 73 20 74 68 61 74 0a   registers that.
75b0: 2a 2a 20 66 6f 6c 6c 6f 77 20 74 68 65 20 72 61  ** follow the ra
75c0: 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nge of registers
75d0: 20 75 73 65 64 20 74 6f 20 63 6f 6e 73 74 72 75   used to constru
75e0: 63 74 20 73 74 6f 72 61 67 65 2e 20 20 54 68 69  ct storage.  Thi
75f0: 73 0a 2a 2a 20 61 76 6f 69 64 73 20 63 6f 6d 70  s.** avoids comp
7600: 75 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 56  uting the same V
7610: 49 52 54 55 41 4c 20 63 6f 6c 75 6d 6e 20 6d 75  IRTUAL column mu
7620: 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 61 6e  ltiple times, an
7630: 64 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 76 61  d provides.** va
7640: 6c 75 65 73 20 66 6f 72 20 75 73 65 20 62 79 20  lues for use by 
7650: 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 73  OP_Param opcodes
7660: 20 69 6e 20 74 72 69 67 67 65 72 73 2e 20 20 48   in triggers.  H
7670: 65 6e 63 65 2c 20 69 66 20 74 68 65 0a 2a 2a 20  ence, if the.** 
7680: 69 6e 70 75 74 20 63 6f 6c 75 6d 6e 20 69 73 20  input column is 
7690: 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65 2c  a VIRTUAL table,
76a0: 20 70 75 74 20 69 74 20 61 66 74 65 72 20 61 6c   put it after al
76b0: 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6c 75  l the other colu
76c0: 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  mns..**.** In th
76d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 2c 20 4e 20 6d  e following, N m
76e0: 65 61 6e 73 20 22 6e 6f 72 6d 61 6c 20 63 6f 6c  eans "normal col
76f0: 75 6d 6e 22 2c 20 53 20 6d 65 61 6e 73 20 53 54  umn", S means ST
7700: 4f 52 45 44 2c 20 61 6e 64 0a 2a 2a 20 56 20 6d  ORED, and.** V m
7710: 65 61 6e 73 20 56 49 52 54 55 41 4c 2e 20 20 53  eans VIRTUAL.  S
7720: 75 70 70 6f 73 65 20 74 68 65 20 43 52 45 41 54  uppose the CREAT
7730: 45 20 54 41 42 4c 45 20 68 61 73 20 63 6f 6c 75  E TABLE has colu
7740: 6d 6e 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  mns like this:.*
7750: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 43 52 45 41  *.**        CREA
7760: 54 45 20 54 41 42 4c 45 20 65 78 28 4e 2c 53 2c  TE TABLE ex(N,S,
7770: 56 2c 4e 2c 53 2c 56 2c 4e 2c 53 2c 56 29 3b 0a  V,N,S,V,N,S,V);.
7780: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
7790: 20 20 20 20 20 20 20 2d 2d 20 30 20 31 20 32 20         -- 0 1 2 
77a0: 33 20 34 20 35 20 36 20 37 20 38 0a 2a 2a 0a 2a  3 4 5 6 7 8.**.*
77b0: 2a 20 54 68 65 6e 20 74 68 65 20 6d 61 70 70 69  * Then the mappi
77c0: 6e 67 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  ng from this fun
77d0: 63 74 69 6f 6e 20 69 73 20 61 73 20 66 6f 6c 6c  ction is as foll
77e0: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e  ows:.**.**    IN
77f0: 50 55 54 53 3a 20 20 20 20 20 30 20 31 20 32 20  PUTS:     0 1 2 
7800: 33 20 34 20 35 20 36 20 37 20 38 0a 2a 2a 20 20  3 4 5 6 7 8.**  
7810: 20 20 4f 55 54 50 55 54 53 3a 20 20 20 20 30 20    OUTPUTS:    0 
7820: 31 20 36 20 32 20 33 20 37 20 34 20 35 20 38 0a  1 6 2 3 7 4 5 8.
7830: 2a 2a 0a 2a 2a 20 53 6f 2c 20 69 6e 20 6f 74 68  **.** So, in oth
7840: 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 20 72  er words, this r
7850: 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 61 6c  outine shifts al
7860: 6c 20 74 68 65 20 76 69 72 74 75 61 6c 20 63 6f  l the virtual co
7870: 6c 75 6d 6e 73 20 74 6f 0a 2a 2a 20 74 68 65 20  lumns to.** the 
7880: 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  end..**.** If SQ
7890: 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 4e 45 52 41  LITE_OMIT_GENERA
78a0: 54 45 44 5f 43 4f 4c 55 4d 4e 53 20 74 68 65 6e  TED_COLUMNS then
78b0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 76 69   there are no vi
78c0: 72 74 75 61 6c 20 63 6f 6c 75 6d 6e 73 20 61 6e  rtual columns an
78d0: 64 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  d.** this routin
78e0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6d 61 63  e is a no-op mac
78f0: 72 6f 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c 69 74  ro..*/.i16 sqlit
7900: 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 54 6f 53  e3TableColumnToS
7910: 74 6f 72 61 67 65 28 54 61 62 6c 65 20 2a 70 54  torage(Table *pT
7920: 61 62 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20  ab, i16 iCol){. 
7930: 20 69 6e 74 20 69 3b 0a 20 20 69 31 36 20 6e 3b   int i;.  i16 n;
7940: 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3c  .  assert( iCol<
7950: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
7960: 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
7970: 61 67 73 20 26 20 54 46 5f 48 61 73 56 69 72 74  ags & TF_HasVirt
7980: 75 61 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ual)==0 ) return
7990: 20 69 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30   iCol;.  for(i=0
79a0: 2c 20 6e 3d 30 3b 20 69 3c 69 43 6f 6c 3b 20 69  , n=0; i<iCol; i
79b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54  ++){.    if( (pT
79c0: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46  ab->aCol[i].colF
79d0: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 56  lags & COLFLAG_V
79e0: 49 52 54 55 41 4c 29 3d 3d 30 20 29 20 6e 2b 2b  IRTUAL)==0 ) n++
79f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
7a00: 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c 61  ->aCol[i].colFla
7a10: 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 56 49 52  gs & COLFLAG_VIR
7a20: 54 55 41 4c 20 29 7b 0a 20 20 20 20 2f 2a 20 69  TUAL ){.    /* i
7a30: 43 6f 6c 20 69 73 20 61 20 76 69 72 74 75 61 6c  Col is a virtual
7a40: 20 63 6f 6c 75 6d 6e 20 69 74 73 65 6c 66 20 2a   column itself *
7a50: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 54 61  /.    return pTa
7a60: 62 2d 3e 6e 4e 56 43 6f 6c 20 2b 20 69 20 2d 20  b->nNVCol + i - 
7a70: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
7a80: 2f 2a 20 69 43 6f 6c 20 69 73 20 61 20 6e 6f 72  /* iCol is a nor
7a90: 6d 61 6c 20 6f 72 20 73 74 6f 72 65 64 20 63 6f  mal or stored co
7aa0: 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 72 65 74 75  lumn */.    retu
7ab0: 72 6e 20 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  rn n;.  }.}.#end
7ac0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  if../*.** Begin 
7ad0: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e  constructing a n
7ae0: 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65  ew table represe
7af0: 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72  ntation in memor
7b00: 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74  y.  This is.** t
7b10: 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65  he first of seve
7b20: 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  ral action routi
7b30: 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c  nes that get cal
7b40: 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a  led in response.
7b50: 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54  ** to a CREATE T
7b60: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
7b70: 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20   In particular, 
7b80: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
7b90: 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20  called.** after 
7ba0: 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43  seeing tokens "C
7bb0: 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c  REATE" and "TABL
7bc0: 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  E" and the table
7bd0: 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d   name. The isTem
7be0: 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  p.** flag is tru
7bf0: 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  e if the table s
7c00: 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
7c10: 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
7c20: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
7c30: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20  e instead of in 
7c40: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
7c50: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  e file.  This is
7c60: 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61   normally the ca
7c70: 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22  se.** when the "
7c80: 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52  TEMP" or "TEMPOR
7c90: 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63  ARY" keyword occ
7ca0: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a  urs in between.*
7cb0: 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42  * CREATE and TAB
7cc0: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  LE..**.** The ne
7cd0: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  w table record i
7ce0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  s initialized an
7cf0: 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d  d put in pParse-
7d00: 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41  >pNewTable..** A
7d10: 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52  s more of the CR
7d20: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
7d30: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20  ment is parsed, 
7d40: 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f  additional actio
7d50: 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69  n.** routines wi
7d60: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  ll be called to 
7d70: 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  add more informa
7d80: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63  tion to this rec
7d90: 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ord..** At the e
7da0: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
7db0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
7dc0: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64  , the sqlite3End
7dd0: 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a  Table() routine.
7de0: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ** is called to 
7df0: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e  complete the con
7e00: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65  struction of the
7e10: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
7e20: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
7e30: 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20  e3StartTable(.  
7e40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7e50: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
7e60: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
7e70: 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73  Name1,   /* Firs
7e80: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  t part of the na
7e90: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
7ea0: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  or view */.  Tok
7eb0: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a  en *pName2,   /*
7ec0: 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
7ed0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
7ee0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
7ef0: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
7f00: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
7f10: 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61  his is a TEMP ta
7f20: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ble */.  int isV
7f30: 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  iew,      /* Tru
7f40: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
7f50: 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  IEW */.  int isV
7f60: 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75  irtual,   /* Tru
7f70: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
7f80: 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a  IRTUAL table */.
7f90: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
7fa0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
7fb0: 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64   if table alread
7fc0: 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
7fd0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a   Table *pTable;.
7fe0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
7ff0: 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f  0; /* The name o
8000: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
8010: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
8020: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
8030: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
8040: 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
8050: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
8060: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
8070: 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ble in */.  Toke
8080: 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  n *pName;    /* 
8090: 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
80a0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
80b0: 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66   create */..  if
80c0: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
80d0: 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  && db->init.newT
80e0: 6e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  num==1 ){.    /*
80f0: 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20   Special case:  
8100: 50 61 72 73 69 6e 67 20 74 68 65 20 73 71 6c 69  Parsing the sqli
8110: 74 65 5f 6d 61 73 74 65 72 20 6f 72 20 73 71 6c  te_master or sql
8120: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
8130: 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69 44  schema */.    iD
8140: 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  b = db->init.iDb
8150: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  ;.    zName = sq
8160: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
8170: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
8180: 44 62 29 29 3b 0a 20 20 20 20 70 4e 61 6d 65 20  Db));.    pName 
8190: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 65 6c 73  = pName1;.  }els
81a0: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  e{.    /* The co
81b0: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20  mmon case */.   
81c0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
81d0: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
81e0: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
81f0: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
8200: 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
8210: 6e 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  n;.    if( !OMIT
8220: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
8230: 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  p && pName2->n>0
8240: 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20   && iDb!=1 ){.  
8250: 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69      /* If creati
8260: 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c  ng a temp table,
8270: 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f   the name may no
8280: 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20  t be qualified. 
8290: 55 6e 6c 65 73 73 20 0a 20 20 20 20 20 20 2a 2a  Unless .      **
82a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
82b0: 6d 65 20 69 73 20 22 74 65 6d 70 22 20 61 6e 79  me is "temp" any
82c0: 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73  way.  */.      s
82d0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
82e0: 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72  Parse, "temporar
82f0: 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73  y table name mus
8300: 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64  t be unqualified
8310: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
8320: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8330: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
8340: 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31  isTemp ) iDb = 1
8350: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  ;.    zName = sq
8360: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
8370: 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
8380: 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45     if( IN_RENAME
8390: 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20  _OBJECT ){.     
83a0: 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f   sqlite3RenameTo
83b0: 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28  kenMap(pParse, (
83c0: 76 6f 69 64 2a 29 7a 4e 61 6d 65 2c 20 70 4e 61  void*)zName, pNa
83d0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
83e0: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
83f0: 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20  ken = *pName;.  
8400: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72  if( zName==0 ) r
8410: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
8420: 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
8430: 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
8440: 65 2c 20 69 73 56 69 65 77 3f 22 76 69 65 77 22  e, isView?"view"
8450: 3a 22 74 61 62 6c 65 22 2c 20 7a 4e 61 6d 65 29  :"table", zName)
8460: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67   ){.    goto beg
8470: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
8480: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
8490: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
84a0: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
84b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
84c0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
84d0: 72 74 28 20 69 73 54 65 6d 70 3d 3d 30 20 7c 7c  rt( isTemp==0 ||
84e0: 20 69 73 54 65 6d 70 3d 3d 31 20 29 3b 0a 20 20   isTemp==1 );.  
84f0: 61 73 73 65 72 74 28 20 69 73 56 69 65 77 3d 3d  assert( isView==
8500: 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 31 20 29  0 || isView==1 )
8510: 3b 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69 63  ;.  {.    static
8520: 20 63 6f 6e 73 74 20 75 38 20 61 43 6f 64 65 5b   const u8 aCode[
8530: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 53 51 4c  ] = {.       SQL
8540: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
8550: 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,.       SQLITE_
8560: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
8570: 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45  E,.       SQLITE
8580: 5f 43 52 45 41 54 45 5f 56 49 45 57 2c 0a 20 20  _CREATE_VIEW,.  
8590: 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41       SQLITE_CREA
85a0: 54 45 5f 54 45 4d 50 5f 56 49 45 57 0a 20 20 20  TE_TEMP_VIEW.   
85b0: 20 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44   };.    char *zD
85c0: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
85d0: 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69  .zDbSName;.    i
85e0: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
85f0: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
8600: 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
8610: 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c  A_TABLE(isTemp),
8620: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
8630: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
8640: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
8650: 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74 75      if( !isVirtu
8660: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75 74  al && sqlite3Aut
8670: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 28  hCheck(pParse, (
8680: 69 6e 74 29 61 43 6f 64 65 5b 69 73 54 65 6d 70  int)aCode[isTemp
8690: 2b 32 2a 69 73 56 69 65 77 5d 2c 0a 20 20 20 20  +2*isView],.    
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86c0: 20 20 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62     zName, 0, zDb
86d0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
86e0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
86f0: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  r;.    }.  }.#en
8700: 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  dif..  /* Make s
8710: 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c  ure the new tabl
8720: 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20  e name does not 
8730: 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20  collide with an 
8740: 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e  existing.  ** in
8750: 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d  dex or table nam
8760: 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  e in the same da
8770: 74 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61  tabase.  Issue a
8780: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
8790: 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e  if.  ** it does.
87a0: 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
87b0: 73 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  s if the stateme
87c0: 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65 64 20  nt being parsed 
87d0: 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a 20  was passed.  ** 
87e0: 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64 65  to an sqlite3_de
87f0: 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61 6c  clare_vtab() cal
8800: 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 20  l. In that case 
8810: 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  only the column 
8820: 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74  names.  ** and t
8830: 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65  ypes will be use
8840: 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  d, so there is n
8850: 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66  o need to test f
8860: 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a  or namespace.  *
8870: 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20  * collisions..  
8880: 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 53 50 45  */.  if( !IN_SPE
8890: 43 49 41 4c 5f 50 41 52 53 45 20 29 7b 0a 20 20  CIAL_PARSE ){.  
88a0: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
88b0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
88c0: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  ame;.    if( SQL
88d0: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
88e0: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
88f0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
8900: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
8910: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  r;.    }.    pTa
8920: 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ble = sqlite3Fin
8930: 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
8940: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
8950: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  pTable ){.      
8960: 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20  if( !noErr ){.  
8970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8980: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
8990: 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20  able %T already 
89a0: 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b  exists", pName);
89b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
89c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
89d0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
89e0: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
89f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
8a00: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
8a10: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
8a20: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62    }.      goto b
8a30: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
8a40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8a50: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
8a60: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29  (db, zName, zDb)
8a70: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
8a80: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8a90: 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
8aa0: 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20  lready an index 
8ab0: 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
8ac0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  );.      goto be
8ad0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
8ae0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54  .    }.  }..  pT
8af0: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62  able = sqlite3Db
8b00: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
8b10: 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
8b20: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
8b30: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
8b40: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
8b50: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
8b60: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
8b70: 42 4b 50 54 3b 0a 20 20 20 20 70 50 61 72 73 65  BKPT;.    pParse
8b80: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
8b90: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
8ba0: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
8bb0: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
8bc0: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b  e;.  pTable->iPK
8bd0: 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c  ey = -1;.  pTabl
8be0: 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  e->pSchema = db-
8bf0: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
8c00: 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 54 61  a;.  pTable->nTa
8c10: 62 52 65 66 20 3d 20 31 3b 0a 23 69 66 64 65 66  bRef = 1;.#ifdef
8c20: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
8c30: 52 4f 57 45 53 54 0a 20 20 70 54 61 62 6c 65 2d  ROWEST.  pTable-
8c40: 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71  >nRowLogEst = sq
8c50: 6c 69 74 65 33 4c 6f 67 45 73 74 28 53 51 4c 49  lite3LogEst(SQLI
8c60: 54 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45 53  TE_DEFAULT_ROWES
8c70: 54 29 3b 0a 23 65 6c 73 65 0a 20 20 70 54 61 62  T);.#else.  pTab
8c80: 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  le->nRowLogEst =
8c90: 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
8ca0: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
8cb0: 28 31 30 34 38 35 37 36 29 20 29 3b 0a 23 65 6e  (1048576) );.#en
8cc0: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 50  dif.  assert( pP
8cd0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
8ce0: 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =0 );.  pParse->
8cf0: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
8d00: 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  le;..  /* If thi
8d10: 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73  s is the magic s
8d20: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
8d30: 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74  able used by aut
8d40: 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a  oincrement,.  **
8d50: 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70   then record a p
8d60: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74  ointer to this t
8d70: 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  able in the main
8d80: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
8d90: 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ure.  ** so that
8da0: 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64   INSERT can find
8db0: 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c   the table easil
8dc0: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
8dd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
8de0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20  INCREMENT.  if( 
8df0: 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20  !pParse->nested 
8e00: 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  && strcmp(zName,
8e10: 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
8e20: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  e")==0 ){.    as
8e30: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
8e40: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
8e50: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
8e60: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
8e70: 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c  >pSeqTab = pTabl
8e80: 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
8e90: 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
8ea0: 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68  ting the code th
8eb0: 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74  at will insert t
8ec0: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
8ed0: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51  into.  ** the SQ
8ee0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
8ef0: 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74  e.  Note in part
8f00: 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d  icular that we m
8f10: 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a  ust go ahead.  *
8f20: 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74  * and allocate t
8f30: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
8f40: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65   for the table e
8f50: 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72  ntry now.  Befor
8f60: 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41  e any.  ** PRIMA
8f70: 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
8f80: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61   keywords are pa
8f90: 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79  rsed.  Those key
8fa0: 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65  words will cause
8fb0: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f  .  ** indices to
8fc0: 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20   be created and 
8fd0: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
8fe0: 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72   must come befor
8ff0: 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69  e the .  ** indi
9000: 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ces.  Hence, the
9010: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
9020: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73  or the table mus
9030: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20  t be allocated. 
9040: 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   ** now..  */.  
9050: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
9060: 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74  sy && (v = sqlit
9070: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
9080: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))!=0 ){.    int
9090: 20 61 64 64 72 31 3b 0a 20 20 20 20 69 6e 74 20   addr1;.    int 
90a0: 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20  fileFormat;.    
90b0: 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20  int reg1, reg2, 
90c0: 72 65 67 33 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c  reg3;.    /* nul
90d0: 6c 52 6f 77 5b 5d 20 69 73 20 61 6e 20 4f 50 5f  lRow[] is an OP_
90e0: 52 65 63 6f 72 64 20 65 6e 63 6f 64 69 6e 67 20  Record encoding 
90f0: 6f 66 20 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e  of a row contain
9100: 69 6e 67 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20  ing 5 NULLs */. 
9110: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
9120: 63 68 61 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d  char nullRow[] =
9130: 20 7b 20 36 2c 20 30 2c 20 30 2c 20 30 2c 20 30   { 6, 0, 0, 0, 0
9140: 2c 20 30 20 7d 3b 0a 20 20 20 20 73 71 6c 69 74  , 0 };.    sqlit
9150: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
9160: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
9170: 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
9180: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
9190: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
91a0: 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20   isVirtual ){.  
91b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
91c0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67  ddOp0(v, OP_VBeg
91d0: 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  in);.    }.#endi
91e0: 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  f..    /* If the
91f0: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64   file format and
9200: 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65   encoding in the
9210: 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20 6e   database have n
9220: 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20  ot been set, .  
9230: 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f    ** set them no
9240: 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  w..    */.    re
9250: 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67  g1 = pParse->reg
9260: 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
9270: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32  ->nMem;.    reg2
9280: 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f   = pParse->regRo
9290: 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ot = ++pParse->n
92a0: 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20  Mem;.    reg3 = 
92b0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
92c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
92d0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64  ddOp3(v, OP_Read
92e0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67  Cookie, iDb, reg
92f0: 33 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  3, BTREE_FILE_FO
9300: 52 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  RMAT);.    sqlit
9310: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
9320: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 61 64 64  v, iDb);.    add
9330: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
9340: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
9350: 20 72 65 67 33 29 3b 20 56 64 62 65 43 6f 76 65   reg3); VdbeCove
9360: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 66 69 6c  rage(v);.    fil
9370: 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66  eFormat = (db->f
9380: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65  lags & SQLITE_Le
9390: 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20  gacyFileFmt)!=0 
93a0: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
93b0: 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d      1 : SQLITE_M
93c0: 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a  AX_FILE_FORMAT;.
93d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
93e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
93f0: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45  ookie, iDb, BTRE
9400: 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 66  E_FILE_FORMAT, f
9410: 69 6c 65 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  ileFormat);.    
9420: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9430: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
9440: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 54 45  e, iDb, BTREE_TE
9450: 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 45 4e 43  XT_ENCODING, ENC
9460: 28 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  (db));.    sqlit
9470: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
9480: 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 20 20 2f  , addr1);..    /
9490: 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65 61  * This just crea
94a0: 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64  tes a place-hold
94b0: 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  er record in the
94c0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
94d0: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  able..    ** The
94e0: 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64 20   record created 
94f0: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
9500: 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20   anything yet.  
9510: 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61  It will be repla
9520: 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ced.    ** by th
9530: 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20  e real entry in 
9540: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 61  code generated a
9550: 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  t sqlite3EndTabl
9560: 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
9570: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
9580: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
9590: 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74  s left in regist
95a0: 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  er pParse->regRo
95b0: 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  wid..    ** The 
95c0: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
95d0: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
95e0: 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  e is left in reg
95f0: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
9600: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  ..    ** The row
9610: 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  id and root page
9620: 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20 61   number values a
9630: 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  re needed by the
9640: 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 2a   code that.    *
9650: 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  * sqlite3EndTabl
9660: 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e  e will generate.
9670: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  .    */.#if !def
9680: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9690: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
96a0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
96b0: 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
96c0: 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69   if( isView || i
96d0: 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20  sVirtual ){.    
96e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
96f0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
9700: 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20 20  r, 0, reg2);.   
9710: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
9720: 20 20 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65    {.      pParse
9730: 2d 3e 61 64 64 72 43 72 54 61 62 20 3d 0a 20 20  ->addrCrTab =.  
9740: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9750: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
9760: 72 65 61 74 65 42 74 72 65 65 2c 20 69 44 62 2c  reateBtree, iDb,
9770: 20 72 65 67 32 2c 20 42 54 52 45 45 5f 49 4e 54   reg2, BTREE_INT
9780: 4b 45 59 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  KEY);.    }.    
9790: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
97a0: 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  rTable(pParse, i
97b0: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
97c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
97d0: 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 72 65  _NewRowid, 0, re
97e0: 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g1);.    sqlite3
97f0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
9800: 5f 42 6c 6f 62 2c 20 36 2c 20 72 65 67 33 2c 20  _Blob, 6, reg3, 
9810: 30 2c 20 6e 75 6c 6c 52 6f 77 2c 20 50 34 5f 53  0, nullRow, P4_S
9820: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
9830: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
9840: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72   OP_Insert, 0, r
9850: 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  eg3, reg1);.    
9860: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
9870: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
9880: 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74  PEND);.    sqlit
9890: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
98a0: 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a  OP_Close);.  }..
98b0: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e    /* Normal (non
98c0: 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20  -error) return. 
98d0: 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  */.  return;..  
98e0: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
98f0: 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68  ccurs, we jump h
9900: 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62  ere */.begin_tab
9910: 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  le_error:.  sqli
9920: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
9930: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
9940: 7d 0a 0a 2f 2a 20 53 65 74 20 70 72 6f 70 65 72  }../* Set proper
9950: 74 69 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20  ties of a table 
9960: 63 6f 6c 75 6d 6e 20 62 61 73 65 64 20 6f 6e 20  column based on 
9970: 74 68 65 20 28 6d 61 67 69 63 61 6c 29 0a 2a 2a  the (magical).**
9980: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   name of the col
9990: 75 6d 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  umn..*/.#if SQLI
99a0: 54 45 5f 45 4e 41 42 4c 45 5f 48 49 44 44 45 4e  TE_ENABLE_HIDDEN
99b0: 5f 43 4f 4c 55 4d 4e 53 0a 76 6f 69 64 20 73 71  _COLUMNS.void sq
99c0: 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65  lite3ColumnPrope
99d0: 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 54 61  rtiesFromName(Ta
99e0: 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f 6c 75 6d  ble *pTab, Colum
99f0: 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20 69 66 28 20  n *pCol){.  if( 
9a00: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
9a10: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 5f  (pCol->zName, "_
9a20: 5f 68 69 64 64 65 6e 5f 5f 22 2c 20 31 30 29 3d  _hidden__", 10)=
9a30: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e  =0 ){.    pCol->
9a40: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
9a50: 4c 41 47 5f 48 49 44 44 45 4e 3b 0a 20 20 7d 65  LAG_HIDDEN;.  }e
9a60: 6c 73 65 20 69 66 28 20 70 54 61 62 20 26 26 20  lse if( pTab && 
9a70: 70 43 6f 6c 21 3d 70 54 61 62 2d 3e 61 43 6f 6c  pCol!=pTab->aCol
9a80: 20 26 26 20 28 70 43 6f 6c 5b 2d 31 5d 2e 63 6f   && (pCol[-1].co
9a90: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
9aa0: 5f 48 49 44 44 45 4e 29 20 29 7b 0a 20 20 20 20  _HIDDEN) ){.    
9ab0: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
9ac0: 3d 20 54 46 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a  = TF_OOOHidden;.
9ad0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
9ae0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63  *.** Add a new c
9af0: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62  olumn to the tab
9b00: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
9b10: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a  ng constructed..
9b20: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
9b30: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
9b40: 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ine once for eac
9b50: 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  h column declara
9b60: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45  tion.** in a CRE
9b70: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
9b80: 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61  ent.  sqlite3Sta
9b90: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
9ba0: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
9bb0: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
9bc0: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
9bd0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
9be0: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
9bf0: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
9c00: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61  ite3AddColumn(Pa
9c10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
9c20: 65 6e 20 2a 70 4e 61 6d 65 2c 20 54 6f 6b 65 6e  en *pName, Token
9c30: 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c   *pType){.  Tabl
9c40: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
9c50: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72   char *z;.  char
9c60: 20 2a 7a 54 79 70 65 3b 0a 20 20 43 6f 6c 75 6d   *zType;.  Colum
9c70: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74  n *pCol;.  sqlit
9c80: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
9c90: 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  >db;.  if( (p = 
9ca0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
9cb0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
9cc0: 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e    if( p->nCol+1>
9cd0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
9ce0: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
9cf0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
9d00: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9d10: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
9d20: 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d   on %s", p->zNam
9d30: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
9d40: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
9d50: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
9d60: 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 70 54 79 70   pName->n + pTyp
9d70: 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20 20 69 66 28  e->n + 2);.  if(
9d80: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
9d90: 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
9da0: 4f 42 4a 45 43 54 20 29 20 73 71 6c 69 74 65 33  OBJECT ) sqlite3
9db0: 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70  RenameTokenMap(p
9dc0: 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a 2c  Parse, (void*)z,
9dd0: 20 70 4e 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70   pName);.  memcp
9de0: 79 28 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70  y(z, pName->z, p
9df0: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 4e  Name->n);.  z[pN
9e00: 61 6d 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73  ame->n] = 0;.  s
9e10: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29  qlite3Dequote(z)
9e20: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
9e30: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
9e40: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
9e50: 72 69 63 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c  ricmp(z, p->aCol
9e60: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
9e70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
9e80: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9e90: 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e  duplicate column
9ea0: 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a   name: %s", z);.
9eb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
9ec0: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
9ed0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
9ee0: 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43    }.  if( (p->nC
9ef0: 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a  ol & 0x7)==0 ){.
9f00: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77      Column *aNew
9f10: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c  ;.    aNew = sql
9f20: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
9f30: 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f  ,p->aCol,(p->nCo
9f40: 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  l+8)*sizeof(p->a
9f50: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  Col[0]));.    if
9f60: 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
9f70: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
9f80: 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72  (db, z);.      r
9f90: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
9fa0: 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b   p->aCol = aNew;
9fb0: 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70  .  }.  pCol = &p
9fc0: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b  ->aCol[p->nCol];
9fd0: 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20  .  memset(pCol, 
9fe0: 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  0, sizeof(p->aCo
9ff0: 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e  l[0]));.  pCol->
a000: 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 20 73 71 6c  zName = z;.  sql
a010: 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72  ite3ColumnProper
a020: 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 70 2c 20  tiesFromName(p, 
a030: 70 43 6f 6c 29 3b 0a 20 0a 20 20 69 66 28 20 70  pCol);. .  if( p
a040: 54 79 70 65 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20  Type->n==0 ){.  
a050: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
a060: 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69   no type specifi
a070: 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65  ed, columns have
a080: 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66   the default aff
a090: 69 6e 69 74 79 0a 20 20 20 20 2a 2a 20 27 42 4c  inity.    ** 'BL
a0a0: 4f 42 27 20 77 69 74 68 20 61 20 64 65 66 61 75  OB' with a defau
a0b0: 6c 74 20 73 69 7a 65 20 6f 66 20 34 20 62 79 74  lt size of 4 byt
a0c0: 65 73 2e 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d  es. */.    pCol-
a0d0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
a0e0: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
a0f0: 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 31   pCol->szEst = 1
a100: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
a110: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
a120: 46 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28  FERENCES.    if(
a130: 20 34 3e 3d 73 71 6c 69 74 65 33 47 6c 6f 62 61   4>=sqlite3Globa
a140: 6c 43 6f 6e 66 69 67 2e 73 7a 53 6f 72 74 65 72  lConfig.szSorter
a150: 52 65 66 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  Ref ){.      pCo
a160: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
a170: 4f 4c 46 4c 41 47 5f 53 4f 52 54 45 52 52 45 46  OLFLAG_SORTERREF
a180: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
a190: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54 79 70   }else{.    zTyp
a1a0: 65 20 3d 20 7a 20 2b 20 73 71 6c 69 74 65 33 53  e = z + sqlite3S
a1b0: 74 72 6c 65 6e 33 30 28 7a 29 20 2b 20 31 3b 0a  trlen30(z) + 1;.
a1c0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65      memcpy(zType
a1d0: 2c 20 70 54 79 70 65 2d 3e 7a 2c 20 70 54 79 70  , pType->z, pTyp
a1e0: 65 2d 3e 6e 29 3b 0a 20 20 20 20 7a 54 79 70 65  e->n);.    zType
a1f0: 5b 70 54 79 70 65 2d 3e 6e 5d 20 3d 20 30 3b 0a  [pType->n] = 0;.
a200: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
a210: 74 65 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 70  te(zType);.    p
a220: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
a230: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
a240: 79 70 65 28 7a 54 79 70 65 2c 20 70 43 6f 6c 29  ype(zType, pCol)
a250: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46  ;.    pCol->colF
a260: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
a270: 48 41 53 54 59 50 45 3b 0a 20 20 7d 0a 20 20 70  HASTYPE;.  }.  p
a280: 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 20 20 70 2d 3e 6e  ->nCol++;.  p->n
a290: 4e 56 43 6f 6c 2b 2b 3b 0a 20 20 70 50 61 72 73  NVCol++;.  pPars
a2a0: 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d  e->constraintNam
a2b0: 65 2e 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  e.n = 0;.}../*.*
a2c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
a2d0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
a2e0: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
a2f0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
a300: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
a310: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
a320: 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22  t.  A "NOT NULL"
a330: 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a   constraint has.
a340: 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20  ** been seen on 
a350: 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20  a column.  This 
a360: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
a370: 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e   notNull flag on
a380: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  .** the column c
a390: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
a3a0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
a3b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e  void sqlite3AddN
a3c0: 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50  otNull(Parse *pP
a3d0: 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  arse, int onErro
a3e0: 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  r){.  Table *p;.
a3f0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
a400: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
a410: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
a420: 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e  ==0 || NEVER(p->
a430: 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e  nCol<1) ) return
a440: 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  ;.  pCol = &p->a
a450: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a  Col[p->nCol-1];.
a460: 20 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20    pCol->notNull 
a470: 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20  = (u8)onError;. 
a480: 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20   p->tabFlags |= 
a490: 54 46 5f 48 61 73 4e 6f 74 4e 75 6c 6c 3b 0a 0a  TF_HasNotNull;..
a4a0: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 75 6e 69    /* Set the uni
a4b0: 71 4e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e  qNotNull flag on
a4c0: 20 61 6e 79 20 55 4e 49 51 55 45 20 6f 72 20 50   any UNIQUE or P
a4d0: 4b 20 69 6e 64 65 78 65 73 20 61 6c 72 65 61 64  K indexes alread
a4e0: 79 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 6f  y created.  ** o
a4f0: 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 2e 20 20  n this column.  
a500: 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c 2d 3e 63  */.  if( pCol->c
a510: 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41  olFlags & COLFLA
a520: 47 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20 20 20  G_UNIQUE ){.    
a530: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
a540: 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e   for(pIdx=p->pIn
a550: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
a560: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
a570: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
a580: 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20  ->nKeyCol==1 && 
a590: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
a5a0: 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20  E_None );.      
a5b0: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
a5c0: 6d 6e 5b 30 5d 3d 3d 70 2d 3e 6e 43 6f 6c 2d 31  mn[0]==p->nCol-1
a5d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78   ){.        pIdx
a5e0: 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20  ->uniqNotNull = 
a5f0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
a600: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63  .  }.}../*.** Sc
a610: 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  an the column ty
a620: 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c  pe name zType (l
a630: 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64  ength nType) and
a640: 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61   return the.** a
a650: 73 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69  ssociated affini
a660: 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54  ty type..**.** T
a670: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
a680: 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64   a case-independ
a690: 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54  ent search of zT
a6a0: 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  ype for the .** 
a6b0: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
a6c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
a6d0: 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  e. If one of the
a6e0: 20 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a   substrings is.*
a6f0: 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72  * found, the cor
a700: 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e  responding affin
a710: 69 74 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ity is returned.
a720: 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69   If zType contai
a730: 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  ns.** more than 
a740: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
a750: 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74  rings, entries t
a760: 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66  oward the top of
a770: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74   .** the table t
a780: 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f  ake priority. Fo
a790: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54  r example, if zT
a7a0: 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27  ype is 'BLOBINT'
a7b0: 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  , .** SQLITE_AFF
a7c0: 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65 74 75  _INTEGER is retu
a7d0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73  rned..**.** Subs
a7e0: 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69  tring     | Affi
a7f0: 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  nity.** --------
a800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a810: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54  --------.** 'INT
a820: 27 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  '         | SQLI
a830: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a  TE_AFF_INTEGER.*
a840: 2a 20 27 43 48 41 52 27 20 20 20 20 20 20 20 20  * 'CHAR'        
a850: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
a860: 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20  T.** 'CLOB'     
a870: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
a880: 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20  TEXT.** 'TEXT'  
a890: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
a8a0: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42  FF_TEXT.** 'BLOB
a8b0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
a8c0: 45 5f 41 46 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52  E_AFF_BLOB.** 'R
a8d0: 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51  EAL'        | SQ
a8e0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
a8f0: 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c   'FLOA'        |
a900: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
a910: 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20  .** 'DOUB'      
a920: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
a930: 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e  EAL.**.** If non
a940: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
a950: 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65  ngs in the above
a960: 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64   table are found
a970: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  ,.** SQLITE_AFF_
a980: 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72  NUMERIC is retur
a990: 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  ned..*/.char sql
a9a0: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
a9b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e  (const char *zIn
a9c0: 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b  , Column *pCol){
a9d0: 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20  .  u32 h = 0;.  
a9e0: 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54  char aff = SQLIT
a9f0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
aa00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68   const char *zCh
aa10: 61 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ar = 0;..  asser
aa20: 74 28 20 7a 49 6e 21 3d 30 20 29 3b 0a 20 20 77  t( zIn!=0 );.  w
aa30: 68 69 6c 65 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a  hile( zIn[0] ){.
aa40: 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b      h = (h<<8) +
aa50: 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c   sqlite3UpperToL
aa60: 6f 77 65 72 5b 28 2a 7a 49 6e 29 26 30 78 66 66  ower[(*zIn)&0xff
aa70: 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20  ];.    zIn++;.  
aa80: 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c    if( h==(('c'<<
aa90: 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27  24)+('h'<<16)+('
aaa0: 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20  a'<<8)+'r') ){  
aab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48             /* CH
aac0: 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  AR */.      aff 
aad0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
aae0: 54 3b 0a 20 20 20 20 20 20 7a 43 68 61 72 20 3d  T;.      zChar =
aaf0: 20 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20   zIn;.    }else 
ab00: 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34  if( h==(('c'<<24
ab10: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
ab20: 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20  <<8)+'b') ){    
ab30: 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20     /* CLOB */.  
ab40: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
ab50: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
ab60: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74  else if( h==(('t
ab70: 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29  '<<24)+('e'<<16)
ab80: 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29  +('x'<<8)+'t') )
ab90: 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20  {       /* TEXT 
aba0: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
abb0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
abc0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
abd0: 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('b'<<24)+('l'
abe0: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
abf0: 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b')          /* 
ac00: 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20  BLOB */.        
ac10: 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f  && (aff==SQLITE_
ac20: 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61  AFF_NUMERIC || a
ac30: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff==SQLITE_AFF_R
ac40: 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66  EAL) ){.      af
ac50: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  f = SQLITE_AFF_B
ac60: 4c 4f 42 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  LOB;.      if( z
ac70: 49 6e 5b 30 5d 3d 3d 27 28 27 20 29 20 7a 43 68  In[0]=='(' ) zCh
ac80: 61 72 20 3d 20 7a 49 6e 3b 0a 23 69 66 6e 64 65  ar = zIn;.#ifnde
ac90: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
aca0: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
acb0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
acc0: 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  'r'<<24)+('e'<<1
acd0: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29  6)+('a'<<8)+'l')
ace0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41            /* REA
acf0: 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  L */.        && 
ad00: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
ad10: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
ad20: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
ad30: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
ad40: 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c  e if( h==(('f'<<
ad50: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
ad60: 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20  o'<<8)+'a')     
ad70: 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a       /* FLOA */.
ad80: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
ad90: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
ada0: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
adb0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
adc0: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
add0: 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28   h==(('d'<<24)+(
ade0: 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38  'o'<<16)+('u'<<8
adf0: 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20  )+'b')          
ae00: 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20  /* DOUB */.     
ae10: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
ae20: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
ae30: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
ae40: 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65  ITE_AFF_REAL;.#e
ae50: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69  ndif.    }else i
ae60: 66 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46  f( (h&0x00FFFFFF
ae70: 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27  )==(('i'<<16)+('
ae80: 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20  n'<<8)+'t') ){  
ae90: 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20    /* INT */.    
aea0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
aeb0: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
aec0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
aed0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 43 6f 6c   }..  /* If pCol
aee0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74   is not NULL, st
aef0: 6f 72 65 20 61 6e 20 65 73 74 69 6d 61 74 65 20  ore an estimate 
af00: 6f 66 20 74 68 65 20 66 69 65 6c 64 20 73 69 7a  of the field siz
af10: 65 2e 20 20 54 68 65 0a 20 20 2a 2a 20 65 73 74  e.  The.  ** est
af20: 69 6d 61 74 65 20 69 73 20 73 63 61 6c 65 64 20  imate is scaled 
af30: 73 6f 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  so that the size
af40: 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 69   of an integer i
af50: 73 20 31 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  s 1.  */.  if( p
af60: 43 6f 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 76  Col ){.    int v
af70: 20 3d 20 30 3b 20 20 20 2f 2a 20 64 65 66 61 75   = 0;   /* defau
af80: 6c 74 20 73 69 7a 65 20 69 73 20 61 70 70 72 6f  lt size is appro
af90: 78 20 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20  x 4 bytes */.   
afa0: 20 69 66 28 20 61 66 66 3c 53 51 4c 49 54 45 5f   if( aff<SQLITE_
afb0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
afc0: 20 20 20 20 20 69 66 28 20 7a 43 68 61 72 20 29       if( zChar )
afd0: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
afe0: 20 7a 43 68 61 72 5b 30 5d 20 29 7b 0a 20 20 20   zChar[0] ){.   
aff0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
b000: 65 33 49 73 64 69 67 69 74 28 7a 43 68 61 72 5b  e3Isdigit(zChar[
b010: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0]) ){.         
b020: 20 20 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56     /* BLOB(k), V
b030: 41 52 43 48 41 52 28 6b 29 2c 20 43 48 41 52 28  ARCHAR(k), CHAR(
b040: 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20  k) -> r=(k/4+1) 
b050: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  */.            s
b060: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a  qlite3GetInt32(z
b070: 43 68 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20  Char, &v);.     
b080: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b090: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b0a0: 20 20 20 20 7a 43 68 61 72 2b 2b 3b 0a 20 20 20      zChar++;.   
b0b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
b0c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 76 20 3d 20  se{.        v = 
b0d0: 31 36 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54  16;   /* BLOB, T
b0e0: 45 58 54 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35  EXT, CLOB -> r=5
b0f0: 20 20 28 61 70 70 72 6f 78 20 32 30 20 62 79 74    (approx 20 byt
b100: 65 73 29 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  es)*/.      }.  
b110: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
b120: 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f  E_ENABLE_SORTER_
b130: 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 69  REFERENCES.    i
b140: 66 28 20 76 3e 3d 73 71 6c 69 74 65 33 47 6c 6f  f( v>=sqlite3Glo
b150: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 6f 72 74  balConfig.szSort
b160: 65 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20 70  erRef ){.      p
b170: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
b180: 20 43 4f 4c 46 4c 41 47 5f 53 4f 52 54 45 52 52   COLFLAG_SORTERR
b190: 45 46 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  EF;.    }.#endif
b1a0: 0a 20 20 20 20 76 20 3d 20 76 2f 34 20 2b 20 31  .    v = v/4 + 1
b1b0: 3b 0a 20 20 20 20 69 66 28 20 76 3e 32 35 35 20  ;.    if( v>255 
b1c0: 29 20 76 20 3d 20 32 35 35 3b 0a 20 20 20 20 70  ) v = 255;.    p
b1d0: 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 76 3b 0a  Col->szEst = v;.
b1e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66    }.  return aff
b1f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65  ;.}../*.** The e
b200: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
b210: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
b220: 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
b230: 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d  ntly added colum
b240: 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c  n.** of the tabl
b250: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
b260: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
b270: 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61  **.** Default va
b280: 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  lue expressions 
b290: 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74  must be constant
b2a0: 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78 63 65  .  Raise an exce
b2b0: 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a  ption if this.**
b2c0: 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65   is not the case
b2d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
b2e0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
b2f0: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
b300: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
b310: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
b320: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
b330: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
b340: 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75   sqlite3AddDefau
b350: 6c 74 56 61 6c 75 65 28 0a 20 20 50 61 72 73 65  ltValue(.  Parse
b360: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
b370: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
b380: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
b390: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
b3a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
b3b0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  ed expression of
b3c0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
b3d0: 75 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ue */.  const ch
b3e0: 61 72 20 2a 7a 53 74 61 72 74 2c 20 20 20 20 20  ar *zStart,     
b3f0: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 74 68 65   /* Start of the
b400: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 74   default value t
b410: 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ext */.  const c
b420: 68 61 72 20 2a 7a 45 6e 64 20 20 20 20 20 20 20  har *zEnd       
b430: 20 20 2f 2a 20 46 69 72 73 74 20 63 68 61 72 61    /* First chara
b440: 63 74 65 72 20 70 61 73 74 20 65 6e 64 20 6f 66  cter past end of
b450: 20 64 65 66 61 75 74 20 76 61 6c 75 65 20 74 65   defaut value te
b460: 78 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  xt */.){.  Table
b470: 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *p;.  Column *p
b480: 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Col;.  sqlite3 *
b490: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
b4a0: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
b4b0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
b4c0: 70 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  p!=0 ){.    pCol
b4d0: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e   = &(p->aCol[p->
b4e0: 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66  nCol-1]);.    if
b4f0: 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  ( !sqlite3ExprIs
b500: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
b510: 6f 6e 28 70 45 78 70 72 2c 20 64 62 2d 3e 69 6e  on(pExpr, db->in
b520: 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20  it.busy) ){.    
b530: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
b540: 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61 75  g(pParse, "defau
b550: 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75  lt value of colu
b560: 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63  mn [%s] is not c
b570: 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20  onstant",.      
b580: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29      pCol->zName)
b590: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
b5a0: 5f 4f 4d 49 54 5f 47 45 4e 45 52 41 54 45 44 5f  _OMIT_GENERATED_
b5b0: 43 4f 4c 55 4d 4e 53 0a 20 20 20 20 7d 65 6c 73  COLUMNS.    }els
b5c0: 65 20 69 66 28 20 70 43 6f 6c 2d 3e 63 6f 6c 46  e if( pCol->colF
b5d0: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 47  lags & COLFLAG_G
b5e0: 45 4e 45 52 41 54 45 44 20 29 7b 0a 20 20 20 20  ENERATED ){.    
b5f0: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
b600: 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c  ->colFlags & COL
b610: 46 4c 41 47 5f 56 49 52 54 55 41 4c 20 29 3b 0a  FLAG_VIRTUAL );.
b620: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b630: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26  pCol->colFlags &
b640: 20 43 4f 4c 46 4c 41 47 5f 53 54 4f 52 45 44 20   COLFLAG_STORED 
b650: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b660: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
b670: 20 22 63 61 6e 6e 6f 74 20 75 73 65 20 44 45 46   "cannot use DEF
b680: 41 55 4c 54 20 6f 6e 20 61 20 67 65 6e 65 72 61  AULT on a genera
b690: 74 65 64 20 63 6f 6c 75 6d 6e 22 29 3b 0a 23 65  ted column");.#e
b6a0: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
b6b0: 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20        /* A copy 
b6c0: 6f 66 20 70 45 78 70 72 20 69 73 20 75 73 65 64  of pExpr is used
b6d0: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
b6e0: 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78  original, as pEx
b6f0: 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  pr contains.    
b700: 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74    ** tokens that
b710: 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69   point to volati
b720: 6c 65 20 6d 65 6d 6f 72 79 2e 0a 20 20 20 20 20  le memory..     
b730: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 78   */.      Expr x
b740: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
b750: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43  xprDelete(db, pC
b760: 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20  ol->pDflt);.    
b770: 20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30 2c 20    memset(&x, 0, 
b780: 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
b790: 20 20 78 2e 6f 70 20 3d 20 54 4b 5f 53 50 41 4e    x.op = TK_SPAN
b7a0: 3b 0a 20 20 20 20 20 20 78 2e 75 2e 7a 54 6f 6b  ;.      x.u.zTok
b7b0: 65 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 70  en = sqlite3DbSp
b7c0: 61 6e 44 75 70 28 64 62 2c 20 7a 53 74 61 72 74  anDup(db, zStart
b7d0: 2c 20 7a 45 6e 64 29 3b 0a 20 20 20 20 20 20 78  , zEnd);.      x
b7e0: 2e 70 4c 65 66 74 20 3d 20 70 45 78 70 72 3b 0a  .pLeft = pExpr;.
b7f0: 20 20 20 20 20 20 78 2e 66 6c 61 67 73 20 3d 20        x.flags = 
b800: 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20 70  EP_Skip;.      p
b810: 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c  Col->pDflt = sql
b820: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
b830: 26 78 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  &x, EXPRDUP_REDU
b840: 43 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  CE);.      sqlit
b850: 65 33 44 62 46 72 65 65 28 64 62 2c 20 78 2e 75  e3DbFree(db, x.u
b860: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a  .zToken);.    }.
b870: 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e    }.  if( IN_REN
b880: 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
b890: 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 45    sqlite3RenameE
b8a0: 78 70 72 55 6e 6d 61 70 28 70 50 61 72 73 65 2c  xprUnmap(pParse,
b8b0: 20 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 73   pExpr);.  }.  s
b8c0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
b8d0: 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  (db, pExpr);.}..
b8e0: 2f 2a 0a 2a 2a 20 42 61 63 6b 77 61 72 64 73 20  /*.** Backwards 
b8f0: 43 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 48 61  Compatibility Ha
b900: 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48 69 73 74 6f  ck:.** .** Histo
b910: 72 69 63 61 6c 20 76 65 72 73 69 6f 6e 73 20 6f  rical versions o
b920: 66 20 53 51 4c 69 74 65 20 61 63 63 65 70 74 65  f SQLite accepte
b930: 64 20 73 74 72 69 6e 67 73 20 61 73 20 63 6f 6c  d strings as col
b940: 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 0a 2a 2a 20  umn names in.** 
b950: 69 6e 64 65 78 65 73 20 61 6e 64 20 50 52 49 4d  indexes and PRIM
b960: 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
b970: 6e 74 73 20 61 6e 64 20 69 6e 20 55 4e 49 51 55  nts and in UNIQU
b980: 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  E constraints.  
b990: 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  Example:.**.**  
b9a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
b9b0: 78 79 7a 28 61 2c 62 2c 63 2c 64 2c 65 2c 50 52  xyz(a,b,c,d,e,PR
b9c0: 49 4d 41 52 59 20 4b 45 59 28 27 61 27 29 2c 55  IMARY KEY('a'),U
b9d0: 4e 49 51 55 45 28 27 62 27 2c 27 63 27 20 43 4f  NIQUE('b','c' CO
b9e0: 4c 4c 41 54 45 20 74 72 69 6d 29 0a 2a 2a 20 20  LLATE trim).**  
b9f0: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
ba00: 61 62 63 20 4f 4e 20 78 79 7a 28 27 63 27 2c 27  abc ON xyz('c','
ba10: 64 27 20 44 45 53 43 2c 27 65 27 20 43 4f 4c 4c  d' DESC,'e' COLL
ba20: 41 54 45 20 6e 6f 63 61 73 65 20 44 45 53 43 29  ATE nocase DESC)
ba30: 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ;.**.** This is 
ba40: 67 6f 6f 66 79 2e 20 20 42 75 74 20 74 6f 20 70  goofy.  But to p
ba50: 72 65 73 65 72 76 65 20 62 61 63 6b 77 61 72 64  reserve backward
ba60: 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
ba70: 77 65 20 63 6f 6e 74 69 6e 75 65 20 74 6f 0a 2a  we continue to.*
ba80: 2a 20 61 63 63 65 70 74 20 69 74 2e 20 20 54 68  * accept it.  Th
ba90: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
baa0: 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 63 6f  the necessary co
bab0: 6e 76 65 72 73 69 6f 6e 2e 20 20 49 74 20 63 6f  nversion.  It co
bac0: 6e 76 65 72 74 73 0a 2a 2a 20 74 68 65 20 65 78  nverts.** the ex
bad0: 70 72 65 73 73 69 6f 6e 20 67 69 76 65 6e 20 69  pression given i
bae0: 6e 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20 66  n its argument f
baf0: 72 6f 6d 20 61 20 54 4b 5f 53 54 52 49 4e 47 20  rom a TK_STRING 
bb00: 69 6e 74 6f 20 61 20 54 4b 5f 49 44 0a 2a 2a 20  into a TK_ID.** 
bb10: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
bb20: 6e 20 69 73 20 6a 75 73 74 20 61 20 54 4b 5f 53  n is just a TK_S
bb30: 54 52 49 4e 47 20 77 69 74 68 20 61 6e 20 6f 70  TRING with an op
bb40: 74 69 6f 6e 61 6c 20 43 4f 4c 4c 41 54 45 20 63  tional COLLATE c
bb50: 6c 61 75 73 65 2e 0a 2a 2a 20 49 66 20 74 68 65  lause..** If the
bb60: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
bb70: 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  nything other th
bb80: 61 6e 20 54 4b 5f 53 54 52 49 4e 47 2c 20 74 68  an TK_STRING, th
bb90: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  e expression is.
bba0: 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ** unchanged..*/
bbb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
bbc0: 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 45  ite3StringToId(E
bbd0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
bbe0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op==TK_STRING 
bbf0: 29 7b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54  ){.    p->op = T
bc00: 4b 5f 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  K_ID;.  }else if
bc10: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c  ( p->op==TK_COLL
bc20: 41 54 45 20 26 26 20 70 2d 3e 70 4c 65 66 74 2d  ATE && p->pLeft-
bc30: 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29  >op==TK_STRING )
bc40: 7b 0a 20 20 20 20 70 2d 3e 70 4c 65 66 74 2d 3e  {.    p->pLeft->
bc50: 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 0a  op = TK_ID;.  }.
bc60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 67 20 74 68 65  }../*.** Tag the
bc70: 20 67 69 76 65 6e 20 63 6f 6c 75 6d 6e 20 61 73   given column as
bc80: 20 62 65 69 6e 67 20 70 61 72 74 20 6f 66 20 74   being part of t
bc90: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 0a 2a  he PRIMARY KEY.*
bca0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
bcb0: 6b 65 43 6f 6c 75 6d 6e 50 61 72 74 4f 66 50 72  keColumnPartOfPr
bcc0: 69 6d 61 72 79 4b 65 79 28 50 61 72 73 65 20 2a  imaryKey(Parse *
bcd0: 70 50 61 72 73 65 2c 20 43 6f 6c 75 6d 6e 20 2a  pParse, Column *
bce0: 70 43 6f 6c 29 7b 0a 20 20 70 43 6f 6c 2d 3e 63  pCol){.  pCol->c
bcf0: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
bd00: 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 23 69 66 6e  AG_PRIMKEY;.#ifn
bd10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bd20: 47 45 4e 45 52 41 54 45 44 5f 43 4f 4c 55 4d 4e  GENERATED_COLUMN
bd30: 53 0a 20 20 69 66 28 20 70 43 6f 6c 2d 3e 63 6f  S.  if( pCol->co
bd40: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
bd50: 5f 47 45 4e 45 52 41 54 45 44 20 29 7b 0a 20 20  _GENERATED ){.  
bd60: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
bd70: 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c  ->colFlags & COL
bd80: 46 4c 41 47 5f 56 49 52 54 55 41 4c 20 29 3b 0a  FLAG_VIRTUAL );.
bd90: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
bda0: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43  ol->colFlags & C
bdb0: 4f 4c 46 4c 41 47 5f 53 54 4f 52 45 44 20 29 3b  OLFLAG_STORED );
bdc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
bdd0: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
bde0: 20 20 20 22 67 65 6e 65 72 61 74 65 64 20 63 6f     "generated co
bdf0: 6c 75 6d 6e 73 20 63 61 6e 6e 6f 74 20 62 65 20  lumns cannot be 
be00: 70 61 72 74 20 6f 66 20 74 68 65 20 50 52 49 4d  part of the PRIM
be10: 41 52 59 20 4b 45 59 22 29 3b 0a 20 20 7d 0a 23  ARY KEY");.  }.#
be20: 65 6e 64 69 66 20 20 20 20 20 20 20 20 20 20 0a  endif          .
be30: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61  }../*.** Designa
be40: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
be50: 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  EY for the table
be60: 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  .  pList is a li
be70: 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20  st of names .** 
be80: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
be90: 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79  form the primary
bea0: 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20   key.  If pList 
beb0: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
bec0: 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
bed0: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20  ly added column 
bee0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
bef0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
bf00: 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63  .**.** A table c
bf10: 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  an have at most 
bf20: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  one primary key.
bf30: 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61    If the table a
bf40: 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20  lready has.** a 
bf50: 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64  primary key (and
bf60: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
bf70: 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29  ond primary key)
bf80: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a   then create an.
bf90: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
bfa0: 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  If the PRIMARY K
bfb0: 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c  EY is on a singl
bfc0: 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64  e column whose d
bfd0: 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47  atatype is INTEG
bfe0: 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77  ER,.** then we w
bff0: 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74  ill try to use t
c000: 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  hat column as th
c010: 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68  e rowid.  Set th
c020: 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a  e Table.iPKey.**
c030: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61   field of the ta
c040: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
c050: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65  uction to be the
c060: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
c070: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
c080: 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61   KEY column.  Ta
c090: 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74  ble.iPKey is set
c0a0: 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20   to -1 if there 
c0b0: 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52  is.** no INTEGER
c0c0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a   PRIMARY KEY..**
c0d0: 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69  .** If the key i
c0e0: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
c0f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
c100: 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  en create a uniq
c110: 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20  ue.** index for 
c120: 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64  the key.  No ind
c130: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f  ex is created fo
c140: 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  r INTEGER PRIMAR
c150: 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20  Y KEYs..*/.void 
c160: 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
c170: 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  yKey(.  Parse *p
c180: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
c190: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c1a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
c1b0: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66  t,  /* List of f
c1c0: 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65  ield names to be
c1d0: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
c1e0: 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
c1f0: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
c200: 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20  th a uniqueness 
c210: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e  conflict */.  in
c220: 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20  t autoInc,      
c230: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41  /* True if the A
c240: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79  UTOINCREMENT key
c250: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
c260: 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
c270: 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  er     /* SQLITE
c280: 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54  _SO_ASC or SQLIT
c290: 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a  E_SO_DESC */.){.
c2a0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
c2b0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
c2c0: 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  e;.  Column *pCo
c2d0: 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  l = 0;.  int iCo
c2e0: 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 6e 74  l = -1, i;.  int
c2f0: 20 6e 54 65 72 6d 3b 0a 20 20 69 66 28 20 70 54   nTerm;.  if( pT
c300: 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 69  ab==0 ) goto pri
c310: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
c320: 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c   if( pTab->tabFl
c330: 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d  ags & TF_HasPrim
c340: 61 72 79 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  aryKey ){.    sq
c350: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
c360: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61  arse, .      "ta
c370: 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d  ble \"%s\" has m
c380: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69  ore than one pri
c390: 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d  mary key", pTab-
c3a0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
c3b0: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
c3c0: 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e  it;.  }.  pTab->
c3d0: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48  tabFlags |= TF_H
c3e0: 61 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20  asPrimaryKey;.  
c3f0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
c400: 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
c410: 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70  >nCol - 1;.    p
c420: 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f  Col = &pTab->aCo
c430: 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 6d 61 6b  l[iCol];.    mak
c440: 65 43 6f 6c 75 6d 6e 50 61 72 74 4f 66 50 72 69  eColumnPartOfPri
c450: 6d 61 72 79 4b 65 79 28 70 50 61 72 73 65 2c 20  maryKey(pParse, 
c460: 70 43 6f 6c 29 3b 0a 20 20 20 20 6e 54 65 72 6d  pCol);.    nTerm
c470: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
c480: 20 20 20 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74     nTerm = pList
c490: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72  ->nExpr;.    for
c4a0: 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69  (i=0; i<nTerm; i
c4b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
c4c0: 2a 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65  *pCExpr = sqlite
c4d0: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
c4e0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
c4f0: 70 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  pr);.      asser
c500: 74 28 20 70 43 45 78 70 72 21 3d 30 20 29 3b 0a  t( pCExpr!=0 );.
c510: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
c520: 69 6e 67 54 6f 49 64 28 70 43 45 78 70 72 29 3b  ingToId(pCExpr);
c530: 0a 20 20 20 20 20 20 69 66 28 20 70 43 45 78 70  .      if( pCExp
c540: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a  r->op==TK_ID ){.
c550: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
c560: 61 72 20 2a 7a 43 4e 61 6d 65 20 3d 20 70 43 45  ar *zCName = pCE
c570: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
c580: 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d         for(iCol=
c590: 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  0; iCol<pTab->nC
c5a0: 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
c5b0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
c5c0: 65 33 53 74 72 49 43 6d 70 28 7a 43 4e 61 6d 65  e3StrICmp(zCName
c5d0: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  , pTab->aCol[iCo
c5e0: 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  l].zName)==0 ){.
c5f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
c600: 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   = &pTab->aCol[i
c610: 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Col];.          
c620: 20 20 6d 61 6b 65 43 6f 6c 75 6d 6e 50 61 72 74    makeColumnPart
c630: 4f 66 50 72 69 6d 61 72 79 4b 65 79 28 70 50 61  OfPrimaryKey(pPa
c640: 72 73 65 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20  rse, pCol);.    
c650: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c660: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
c670: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
c680: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54 65   }.  }.  if( nTe
c690: 72 6d 3d 3d 31 0a 20 20 20 26 26 20 70 43 6f 6c  rm==1.   && pCol
c6a0: 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74  .   && sqlite3St
c6b0: 72 49 43 6d 70 28 73 71 6c 69 74 65 33 43 6f 6c  rICmp(sqlite3Col
c6c0: 75 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22 29  umnType(pCol,"")
c6d0: 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a  , "INTEGER")==0.
c6e0: 20 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72 21     && sortOrder!
c6f0: 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 0a  =SQLITE_SO_DESC.
c700: 20 20 29 7b 0a 20 20 20 20 69 66 28 20 49 4e 5f    ){.    if( IN_
c710: 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26 26  RENAME_OBJECT &&
c720: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
c730: 45 78 70 72 20 2a 70 43 45 78 70 72 20 3d 20 73  Expr *pCExpr = s
c740: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
c750: 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 30  llate(pList->a[0
c760: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
c770: 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
c780: 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20  enRemap(pParse, 
c790: 26 70 54 61 62 2d 3e 69 50 4b 65 79 2c 20 70 43  &pTab->iPKey, pC
c7a0: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Expr);.    }.   
c7b0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69   pTab->iPKey = i
c7c0: 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b  Col;.    pTab->k
c7d0: 65 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45  eyConf = (u8)onE
c7e0: 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74  rror;.    assert
c7f0: 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20  ( autoInc==0 || 
c800: 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20  autoInc==1 );.  
c810: 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
c820: 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41   |= autoInc*TF_A
c830: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20  utoincrement;.  
c840: 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 70 50    if( pList ) pP
c850: 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64  arse->iPkSortOrd
c860: 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  er = pList->a[0]
c870: 2e 73 6f 72 74 46 6c 61 67 73 3b 0a 20 20 7d 65  .sortFlags;.  }e
c880: 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20  lse if( autoInc 
c890: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
c8a0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
c8b0: 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33  MENT.    sqlite3
c8c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
c8d0: 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20   "AUTOINCREMENT 
c8e0: 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20  is only allowed 
c8f0: 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22  on an ".       "
c900: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
c910: 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  KEY");.#endif.  
c920: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
c930: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
c940: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70  arse, 0, 0, 0, p
c950: 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30  List, onError, 0
c960: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
c980: 73 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20 53 51  sortOrder, 0, SQ
c990: 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49  LITE_IDXTYPE_PRI
c9a0: 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20 20 70 4c  MARYKEY);.    pL
c9b0: 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72  ist = 0;.  }..pr
c9c0: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a  imary_key_exit:.
c9d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
c9e0: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
c9f0: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65  db, pList);.  re
ca00: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  turn;.}../*.** A
ca10: 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63  dd a new CHECK c
ca20: 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65  onstraint to the
ca30: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
ca40: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
ca50: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
ca60: 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73  ite3AddCheckCons
ca70: 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
ca80: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
ca90: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
caa0: 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b  /.  Expr *pCheck
cab0: 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65  Expr  /* The che
cac0: 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  ck expression */
cad0: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
cae0: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
caf0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50  Table *pTab = pP
cb00: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
cb10: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
cb20: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
cb30: 66 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44  f( pTab && !IN_D
cb40: 45 43 4c 41 52 45 5f 56 54 41 42 0a 20 20 20 26  ECLARE_VTAB.   &
cb50: 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 49  & !sqlite3BtreeI
cb60: 73 52 65 61 64 6f 6e 6c 79 28 64 62 2d 3e 61 44  sReadonly(db->aD
cb70: 62 5b 64 62 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e  b[db->init.iDb].
cb80: 70 42 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 54  pBt).  ){.    pT
cb90: 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c  ab->pCheck = sql
cba0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
cbb0: 6e 64 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  nd(pParse, pTab-
cbc0: 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63 6b 45  >pCheck, pCheckE
cbd0: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50  xpr);.    if( pP
cbe0: 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74  arse->constraint
cbf0: 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20  Name.n ){.      
cc00: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
cc10: 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  etName(pParse, p
cc20: 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50  Tab->pCheck, &pP
cc30: 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74  arse->constraint
cc40: 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Name, 1);.    }.
cc50: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
cc60: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   {.    sqlite3Ex
cc70: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
cc80: 3e 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29  >db, pCheckExpr)
cc90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
cca0: 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  et the collation
ccb0: 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65   function of the
ccc0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70   most recently p
ccd0: 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75  arsed table colu
cce0: 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c  mn.** to the Col
ccf0: 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  lSeq given..*/.v
cd00: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
cd10: 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20  llateType(Parse 
cd20: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
cd30: 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65  pToken){.  Table
cd40: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
cd50: 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20  char *zColl;    
cd60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71            /* Deq
cd70: 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f  uoted name of co
cd80: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
cd90: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
cda0: 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70  b;..  if( (p = p
cdb0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
cdc0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
cdd0: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
cde0: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
cdf0: 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  b;.  zColl = sql
ce00: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
ce10: 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  n(db, pToken);. 
ce20: 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65   if( !zColl ) re
ce30: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c  turn;..  if( sql
ce40: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
ce50: 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  q(pParse, zColl)
ce60: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
ce70: 49 64 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Idx;.    sqlite3
ce80: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
ce90: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20  ol[i].zColl);.  
cea0: 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f    p->aCol[i].zCo
ceb0: 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20  ll = zColl;.  . 
cec0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
ced0: 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20  umn is declared 
cee0: 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41  as "<name> PRIMA
cef0: 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c  RY KEY COLLATE <
cf00: 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74  type>",.    ** t
cf10: 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79  hen an index may
cf20: 20 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74   have been creat
cf30: 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d  ed on this colum
cf40: 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20  n before the.   
cf50: 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79   ** collation ty
cf60: 70 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f  pe was added. Co
cf70: 72 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74  rrect this if it
cf80: 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
cf90: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64    */.    for(pId
cfa0: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
cfb0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
cfc0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
cfd0: 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  rt( pIdx->nKeyCo
cfe0: 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  l==1 );.      if
cff0: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
d000: 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  [0]==i ){.      
d010: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30    pIdx->azColl[0
d020: 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  ] = p->aCol[i].z
d030: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
d040: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
d050: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d060: 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d  b, zColl);.  }.}
d070: 0a 0a 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20  ../* Change the 
d080: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
d090: 72 73 65 64 20 63 6f 6c 75 6d 6e 20 74 6f 20 62  rsed column to b
d0a0: 65 20 61 20 47 45 4e 45 52 41 54 45 44 20 41 4c  e a GENERATED AL
d0b0: 57 41 59 53 20 41 53 0a 2a 2a 20 63 6f 6c 75 6d  WAYS AS.** colum
d0c0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
d0d0: 65 33 41 64 64 47 65 6e 65 72 61 74 65 64 28 50  e3AddGenerated(P
d0e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
d0f0: 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e  pr *pExpr, Token
d100: 20 2a 70 54 79 70 65 29 7b 0a 23 69 66 6e 64 65   *pType){.#ifnde
d110: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 45  f SQLITE_OMIT_GE
d120: 4e 45 52 41 54 45 44 5f 43 4f 4c 55 4d 4e 53 0a  NERATED_COLUMNS.
d130: 20 20 75 38 20 65 54 79 70 65 20 3d 20 43 4f 4c    u8 eType = COL
d140: 46 4c 41 47 5f 56 49 52 54 55 41 4c 3b 0a 20 20  FLAG_VIRTUAL;.  
d150: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50  Table *pTab = pP
d160: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
d170: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
d180: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 54 61  .  if( NEVER(pTa
d190: 62 3d 3d 30 29 20 29 20 67 6f 74 6f 20 67 65 6e  b==0) ) goto gen
d1a0: 65 72 61 74 65 64 5f 64 6f 6e 65 3b 0a 20 20 70  erated_done;.  p
d1b0: 43 6f 6c 20 3d 20 26 28 70 54 61 62 2d 3e 61 43  Col = &(pTab->aC
d1c0: 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d  ol[pTab->nCol-1]
d1d0: 29 3b 0a 20 20 69 66 28 20 49 4e 5f 44 45 43 4c  );.  if( IN_DECL
d1e0: 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  ARE_VTAB ){.    
d1f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d200: 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c  pParse, "virtual
d210: 20 74 61 62 6c 65 73 20 63 61 6e 6e 6f 74 20 75   tables cannot u
d220: 73 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75  se computed colu
d230: 6d 6e 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  mns");.    goto 
d240: 67 65 6e 65 72 61 74 65 64 5f 64 6f 6e 65 3b 0a  generated_done;.
d250: 20 20 7d 0a 20 20 69 66 28 20 70 43 6f 6c 2d 3e    }.  if( pCol->
d260: 70 44 66 6c 74 20 29 20 67 6f 74 6f 20 67 65 6e  pDflt ) goto gen
d270: 65 72 61 74 65 64 5f 65 72 72 6f 72 3b 0a 20 20  erated_error;.  
d280: 69 66 28 20 70 54 79 70 65 20 29 7b 0a 20 20 20  if( pType ){.   
d290: 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d 37   if( pType->n==7
d2a0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
d2b0: 43 6d 70 28 22 76 69 72 74 75 61 6c 22 2c 70 54  Cmp("virtual",pT
d2c0: 79 70 65 2d 3e 7a 2c 37 29 3d 3d 30 20 29 7b 0a  ype->z,7)==0 ){.
d2d0: 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
d2e0: 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  /.    }else if( 
d2f0: 70 54 79 70 65 2d 3e 6e 3d 3d 36 20 26 26 20 73  pType->n==6 && s
d300: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 22  qlite3StrNICmp("
d310: 73 74 6f 72 65 64 22 2c 70 54 79 70 65 2d 3e 7a  stored",pType->z
d320: 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,6)==0 ){.      
d330: 65 54 79 70 65 20 3d 20 43 4f 4c 46 4c 41 47 5f  eType = COLFLAG_
d340: 53 54 4f 52 45 44 3b 0a 20 20 20 20 7d 65 6c 73  STORED;.    }els
d350: 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67 65  e{.      goto ge
d360: 6e 65 72 61 74 65 64 5f 65 72 72 6f 72 3b 0a 20  nerated_error;. 
d370: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65     }.  }.  if( e
d380: 54 79 70 65 3d 3d 43 4f 4c 46 4c 41 47 5f 56 49  Type==COLFLAG_VI
d390: 52 54 55 41 4c 20 29 20 70 54 61 62 2d 3e 6e 4e  RTUAL ) pTab->nN
d3a0: 56 43 6f 6c 2d 2d 3b 0a 20 20 70 43 6f 6c 2d 3e  VCol--;.  pCol->
d3b0: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 65 54 79 70  colFlags |= eTyp
d3c0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 54 46 5f  e;.  assert( TF_
d3d0: 48 61 73 56 69 72 74 75 61 6c 3d 3d 43 4f 4c 46  HasVirtual==COLF
d3e0: 4c 41 47 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  LAG_VIRTUAL );. 
d3f0: 20 61 73 73 65 72 74 28 20 54 46 5f 48 61 73 53   assert( TF_HasS
d400: 74 6f 72 65 64 3d 3d 43 4f 4c 46 4c 41 47 5f 53  tored==COLFLAG_S
d410: 54 4f 52 45 44 20 29 3b 0a 20 20 70 54 61 62 2d  TORED );.  pTab-
d420: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 65 54 79  >tabFlags |= eTy
d430: 70 65 3b 0a 20 20 70 43 6f 6c 2d 3e 70 44 66 6c  pe;.  pCol->pDfl
d440: 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 70 45 78  t = pExpr;.  pEx
d450: 70 72 20 3d 20 30 3b 0a 20 20 67 6f 74 6f 20 67  pr = 0;.  goto g
d460: 65 6e 65 72 61 74 65 64 5f 64 6f 6e 65 3b 0a 0a  enerated_done;..
d470: 67 65 6e 65 72 61 74 65 64 5f 65 72 72 6f 72 3a  generated_error:
d480: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d  .  sqlite3ErrorM
d490: 73 67 28 70 50 61 72 73 65 2c 20 22 65 72 72 6f  sg(pParse, "erro
d4a0: 72 20 69 6e 20 67 65 6e 65 72 61 74 65 64 20 63  r in generated c
d4b0: 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 22 2c 0a 20  olumn \"%s\"",. 
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4d0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 67   pCol->zName);.g
d4e0: 65 6e 65 72 61 74 65 64 5f 64 6f 6e 65 3a 0a 20  enerated_done:. 
d4f0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
d500: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
d510: 45 78 70 72 29 3b 0a 23 65 6c 73 65 0a 20 20 2f  Expr);.#else.  /
d520: 2a 20 54 68 72 6f 77 20 61 6e 64 20 65 72 72 6f  * Throw and erro
d530: 72 20 66 6f 72 20 74 68 65 20 47 45 4e 45 52 41  r for the GENERA
d540: 54 45 44 20 41 4c 57 41 59 53 20 41 53 20 63 6c  TED ALWAYS AS cl
d550: 61 75 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a  ause if the.  **
d560: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 4e   SQLITE_OMIT_GEN
d570: 45 52 41 54 45 44 5f 43 4f 4c 55 4d 4e 53 20 63  ERATED_COLUMNS c
d580: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
d590: 6f 6e 20 69 73 20 75 73 65 64 2e 20 2a 2f 0a 20  on is used. */. 
d5a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
d5b0: 28 70 50 61 72 73 65 2c 20 22 67 65 6e 65 72 61  (pParse, "genera
d5c0: 74 65 64 20 63 6f 6c 75 6d 6e 73 20 6e 6f 74 20  ted columns not 
d5d0: 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 73  supported");.  s
d5e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
d5f0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
d600: 70 72 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  pr);.#endif.}../
d610: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
d620: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63  de that will inc
d630: 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d  rement the schem
d640: 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20  a cookie..**.** 
d650: 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  The schema cooki
d660: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
d670: 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20  ermine when the 
d680: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a  schema for the.*
d690: 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
d6a0: 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  es.  After each 
d6b0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74  schema change, t
d6c0: 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a  he cookie value.
d6d0: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65  ** changes.  Whe
d6e0: 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73  n a process firs
d6f0: 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65  t reads the sche
d700: 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68  ma it records th
d710: 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68  e.** cookie.  Th
d720: 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76  ereafter, whenev
d730: 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63  er it goes to ac
d740: 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
d750: 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20  e,.** it checks 
d760: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61  the cookie to ma
d770: 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65  ke sure the sche
d780: 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  ma has not chang
d790: 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77  ed.** since it w
d7a0: 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a  as last read..**
d7b0: 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73  .** This plan is
d7c0: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
d7d0: 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49  bullet-proof.  I
d7e0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
d7f0: 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20  r.** the schema 
d800: 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70  to change multip
d810: 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72  le times and for
d820: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62   the cookie to b
d830: 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f  e.** set back to
d840: 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42   prior value.  B
d850: 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ut schema change
d860: 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74  s are infrequent
d870: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62  .** and the prob
d880: 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69  ability of hitti
d890: 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b  ng the same cook
d8a0: 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79  ie value is only
d8b0: 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20  .** 1 chance in 
d8c0: 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20  2^32.  So we're 
d8d0: 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2a 0a  safe enough..**.
d8e0: 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
d8f0: 4e 2d 4f 46 3a 20 52 2d 33 34 32 33 30 2d 35 36  N-OF: R-34230-56
d900: 30 34 39 20 53 51 4c 69 74 65 20 61 75 74 6f 6d  049 SQLite autom
d910: 61 74 69 63 61 6c 6c 79 20 69 6e 63 72 65 6d 65  atically increme
d920: 6e 74 73 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  nts.** the schem
d930: 61 2d 76 65 72 73 69 6f 6e 20 77 68 65 6e 65 76  a-version whenev
d940: 65 72 20 74 68 65 20 73 63 68 65 6d 61 20 63 68  er the schema ch
d950: 61 6e 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  anges..*/.void s
d960: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
d970: 69 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ie(Parse *pParse
d980: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
d990: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
d9a0: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
d9b0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
d9c0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
d9d0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
d9e0: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
d9f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
da00: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
da10: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52  Cookie, iDb, BTR
da20: 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f  EE_SCHEMA_VERSIO
da30: 4e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  N, .            
da40: 20 20 20 20 20 20 20 28 69 6e 74 29 28 31 2b 28         (int)(1+(
da50: 75 6e 73 69 67 6e 65 64 29 64 62 2d 3e 61 44 62  unsigned)db->aDb
da60: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73  [iDb].pSchema->s
da70: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 29 29 3b 0a  chema_cookie));.
da80: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65  }../*.** Measure
da90: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
daa0: 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64  haracters needed
dab0: 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67   to output the g
dac0: 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69  iven.** identifi
dad0: 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  er.  The number 
dae0: 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65  returned include
daf0: 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65  s any quotes use
db00: 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f  d.** but does no
db10: 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75  t include the nu
db20: 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a  ll terminator..*
db30: 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74  *.** The estimat
db40: 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76  e is conservativ
db50: 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65 20  e.  It might be 
db60: 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61 74  larger that what
db70: 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65   is.** really ne
db80: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
db90: 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28  int identLength(
dba0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
dbb0: 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e    int n;.  for(n
dbc0: 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b  =0; *z; n++, z++
dbd0: 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27  ){.    if( *z=='
dbe0: 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d  "' ){ n++; }.  }
dbf0: 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b  .  return n + 2;
dc00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  .}../*.** The fi
dc10: 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  rst parameter is
dc20: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
dc30: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20   output buffer. 
dc40: 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70  The second .** p
dc50: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
dc60: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65  inter to an inte
dc70: 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ger that contain
dc80: 73 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 0a  s the offset at.
dc90: 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72 69 74  ** which to writ
dca0: 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
dcb0: 74 20 62 75 66 66 65 72 2e 20 54 68 69 73 20 66  t buffer. This f
dcc0: 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73 20 74  unction copies t
dcd0: 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e  he.** nul-termin
dce0: 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f 69 6e  ated string poin
dcf0: 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 74 68  ted to by the th
dd00: 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c 20 7a  ird parameter, z
dd10: 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20  SignedIdent,.** 
dd20: 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64  to the specified
dd30: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 62   offset in the b
dd40: 75 66 66 65 72 20 61 6e 64 20 75 70 64 61 74 65  uffer and update
dd50: 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66 65 72  s *pIdx to refer
dd60: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
dd70: 20 62 79 74 65 20 61 66 74 65 72 20 74 68 65 20   byte after the 
dd80: 6c 61 73 74 20 62 79 74 65 20 77 72 69 74 74 65  last byte writte
dd90: 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  n before returni
dda0: 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  ng..** .** If th
ddb0: 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e 65 64  e string zSigned
ddc0: 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73 20 65  Ident consists e
ddd0: 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70 68 61  ntirely of alpha
dde0: 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72  -numeric.** char
ddf0: 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74  acters, does not
de00: 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 64 69   begin with a di
de10: 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74 20 61  git and is not a
de20: 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a  n SQL keyword,.*
de30: 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70  * then it is cop
de40: 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ied to the outpu
de50: 74 20 62 75 66 66 65 72 20 65 78 61 63 74 6c 79  t buffer exactly
de60: 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68 65 72   as it is. Other
de70: 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71  wise,.** it is q
de80: 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f 75 62  uoted using doub
de90: 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74  le-quotes..*/.st
dea0: 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50  atic void identP
deb0: 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  ut(char *z, int 
dec0: 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69  *pIdx, char *zSi
ded0: 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e  gnedIdent){.  un
dee0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64  signed char *zId
def0: 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ent = (unsigned 
df00: 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65  char*)zSignedIde
df10: 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  nt;.  int i, j, 
df20: 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d  needQuote;.  i =
df30: 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a   *pIdx;..  for(j
df40: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
df50: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 71  ++){.    if( !sq
df60: 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64  lite3Isalnum(zId
df70: 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e  ent[j]) && zIden
df80: 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61  t[j]!='_' ) brea
df90: 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f  k;.  }.  needQuo
dfa0: 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73 64 69  te = sqlite3Isdi
dfb0: 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20  git(zIdent[0]). 
dfc0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
dfd0: 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65  lite3KeywordCode
dfe0: 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f  (zIdent, j)!=TK_
dff0: 49 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  ID.            |
e000: 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20  | zIdent[j]!=0. 
e010: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3d             || j=
e020: 3d 30 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 51  =0;..  if( needQ
e030: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
e040: 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  '"';.  for(j=0; 
e050: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
e060: 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49  .    z[i++] = zI
e070: 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  dent[j];.    if(
e080: 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20   zIdent[j]=='"' 
e090: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
e0a0: 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75    }.  if( needQu
e0b0: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
e0c0: 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a  "';.  z[i] = 0;.
e0d0: 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a    *pIdx = i;.}..
e0e0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
e0f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
e100: 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69  atement appropri
e110: 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ate for the give
e120: 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d  n.** table.  Mem
e130: 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ory to hold the 
e140: 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61 74  text of the stat
e150: 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65  ement is obtaine
e160: 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  d.** from sqlite
e170: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
e180: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
e190: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
e1a0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  on..*/.static ch
e1b0: 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53  ar *createTableS
e1c0: 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  tmt(sqlite3 *db,
e1d0: 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e   Table *p){.  in
e1e0: 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61  t i, k, n;.  cha
e1f0: 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72  r *zStmt;.  char
e200: 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20   *zSep, *zSep2, 
e210: 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20  *zEnd;.  Column 
e220: 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a  *pCol;.  n = 0;.
e230: 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e    for(pCol = p->
e240: 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e  aCol, i=0; i<p->
e250: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
e260: 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65  +){.    n += ide
e270: 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a  ntLength(pCol->z
e280: 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20  Name) + 5;.  }. 
e290: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
e2a0: 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  h(p->zName);.  i
e2b0: 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20  f( n<50 ){ .    
e2c0: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a  zSep = "";.    z
e2d0: 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20  Sep2 = ",";.    
e2e0: 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65  zEnd = ")";.  }e
e2f0: 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20  lse{.    zSep = 
e300: 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70  "\n  ";.    zSep
e310: 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20  2 = ",\n  ";.   
e320: 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20   zEnd = "\n)";. 
e330: 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36   }.  n += 35 + 6
e340: 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d  *p->nCol;.  zStm
e350: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
e360: 6c 6f 63 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20  locRaw(0, n);.  
e370: 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a  if( zStmt==0 ){.
e380: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
e390: 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 72 65 74  ult(db);.    ret
e3a0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
e3b0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c  ite3_snprintf(n,
e3c0: 20 7a 53 74 6d 74 2c 20 22 43 52 45 41 54 45 20   zStmt, "CREATE 
e3d0: 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20  TABLE ");.  k = 
e3e0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
e3f0: 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50  zStmt);.  identP
e400: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d  ut(zStmt, &k, p-
e410: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74  >zName);.  zStmt
e420: 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66  [k++] = '(';.  f
e430: 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c  or(pCol=p->aCol,
e440: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
e450: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
e460: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
e470: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54  char * const azT
e480: 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ype[] = {.      
e490: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    /* SQLITE_AFF_
e4a0: 42 4c 4f 42 20 20 20 20 2a 2f 20 22 22 2c 0a 20  BLOB    */ "",. 
e4b0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
e4c0: 5f 41 46 46 5f 54 45 58 54 20 20 20 20 2a 2f 20  _AFF_TEXT    */ 
e4d0: 22 20 54 45 58 54 22 2c 0a 20 20 20 20 20 20 20  " TEXT",.       
e4e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   /* SQLITE_AFF_N
e4f0: 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22  UMERIC */ " NUM"
e500: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
e510: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
e520: 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20 20 20 20  */ " INT",.     
e530: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
e540: 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22 20 52 45  _REAL    */ " RE
e550: 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69  AL".    };.    i
e560: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73  nt len;.    cons
e570: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a  t char *zType;..
e580: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
e590: 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74  intf(n-k, &zStmt
e5a0: 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20  [k], zSep);.    
e5b0: 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  k += sqlite3Strl
e5c0: 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b  en30(&zStmt[k]);
e5d0: 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70  .    zSep = zSep
e5e0: 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28  2;.    identPut(
e5f0: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d  zStmt, &k, pCol-
e600: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61 73 73  >zName);.    ass
e610: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
e620: 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ity-SQLITE_AFF_B
e630: 4c 4f 42 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20  LOB >= 0 );.    
e640: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66  assert( pCol->af
e650: 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46  finity-SQLITE_AF
e660: 46 5f 42 4c 4f 42 20 3c 20 41 72 72 61 79 53 69  F_BLOB < ArraySi
e670: 7a 65 28 61 7a 54 79 70 65 29 20 29 3b 0a 20 20  ze(azType) );.  
e680: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
e690: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
e6a0: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20  TE_AFF_BLOB );. 
e6b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
e6c0: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
e6d0: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a  ITE_AFF_TEXT );.
e6e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
e6f0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
e700: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
e710: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
e720: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
e730: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
e740: 45 47 45 52 20 29 3b 0a 20 20 20 20 74 65 73 74  EGER );.    test
e750: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
e760: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
e770: 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20  _REAL );.    .  
e780: 20 20 7a 54 79 70 65 20 3d 20 61 7a 54 79 70 65    zType = azType
e790: 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20  [pCol->affinity 
e7a0: 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  - SQLITE_AFF_BLO
e7b0: 42 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71  B];.    len = sq
e7c0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
e7d0: 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ype);.    assert
e7e0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
e7f0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  ==SQLITE_AFF_BLO
e800: 42 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  B .            |
e810: 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  | pCol->affinity
e820: 3d 3d 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  ==sqlite3Affinit
e830: 79 54 79 70 65 28 7a 54 79 70 65 2c 20 30 29 20  yType(zType, 0) 
e840: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
e850: 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20  Stmt[k], zType, 
e860: 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c  len);.    k += l
e870: 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  en;.    assert( 
e880: 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71  k<=n );.  }.  sq
e890: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
e8a0: 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22  -k, &zStmt[k], "
e8b0: 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65  %s", zEnd);.  re
e8c0: 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f  turn zStmt;.}../
e8d0: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61 6e 20 49  *.** Resize an I
e8e0: 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 68  ndex object to h
e8f0: 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f  old N columns to
e900: 74 61 6c 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  tal.  Return SQL
e910: 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
e920: 63 65 73 73 20 61 6e 64 20 53 51 4c 49 54 45 5f  cess and SQLITE_
e930: 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20  NOMEM on an OOM 
e940: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
e950: 20 69 6e 74 20 72 65 73 69 7a 65 49 6e 64 65 78   int resizeIndex
e960: 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Object(sqlite3 *
e970: 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  db, Index *pIdx,
e980: 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68 61 72 20   int N){.  char 
e990: 2a 7a 45 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e  *zExtra;.  int n
e9a0: 42 79 74 65 3b 0a 20 20 69 66 28 20 70 49 64 78  Byte;.  if( pIdx
e9b0: 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72  ->nColumn>=N ) r
e9c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e9d0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d  .  assert( pIdx-
e9e0: 3e 69 73 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b  >isResized==0 );
e9f0: 0a 20 20 6e 42 79 74 65 20 3d 20 28 73 69 7a 65  .  nByte = (size
ea00: 6f 66 28 63 68 61 72 2a 29 20 2b 20 73 69 7a 65  of(char*) + size
ea10: 6f 66 28 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a  of(i16) + 1)*N;.
ea20: 20 20 7a 45 78 74 72 61 20 3d 20 73 71 6c 69 74    zExtra = sqlit
ea30: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
ea40: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  b, nByte);.  if(
ea50: 20 7a 45 78 74 72 61 3d 3d 30 20 29 20 72 65 74   zExtra==0 ) ret
ea60: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
ea70: 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28  _BKPT;.  memcpy(
ea80: 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a  zExtra, pIdx->az
ea90: 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61  Coll, sizeof(cha
eaa0: 72 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  r*)*pIdx->nColum
eab0: 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f  n);.  pIdx->azCo
eac0: 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ll = (const char
ead0: 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78  **)zExtra;.  zEx
eae0: 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68  tra += sizeof(ch
eaf0: 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79  ar*)*N;.  memcpy
eb00: 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61  (zExtra, pIdx->a
eb10: 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28  iColumn, sizeof(
eb20: 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75  i16)*pIdx->nColu
eb30: 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43  mn);.  pIdx->aiC
eb40: 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45  olumn = (i16*)zE
eb50: 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b  xtra;.  zExtra +
eb60: 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b  = sizeof(i16)*N;
eb70: 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61  .  memcpy(zExtra
eb80: 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  , pIdx->aSortOrd
eb90: 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  er, pIdx->nColum
eba0: 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72  n);.  pIdx->aSor
ebb0: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 7a 45  tOrder = (u8*)zE
ebc0: 78 74 72 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43  xtra;.  pIdx->nC
ebd0: 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64  olumn = N;.  pId
ebe0: 78 2d 3e 69 73 52 65 73 69 7a 65 64 20 3d 20 31  x->isResized = 1
ebf0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
ec00: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  E_OK;.}../*.** E
ec10: 73 74 69 6d 61 74 65 20 74 68 65 20 74 6f 74 61  stimate the tota
ec20: 6c 20 72 6f 77 20 77 69 64 74 68 20 66 6f 72 20  l row width for 
ec30: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  a table..*/.stat
ec40: 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65  ic void estimate
ec50: 54 61 62 6c 65 57 69 64 74 68 28 54 61 62 6c 65  TableWidth(Table
ec60: 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e 73 69 67   *pTab){.  unsig
ec70: 6e 65 64 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a  ned wTable = 0;.
ec80: 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a    const Column *
ec90: 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69  pTabCol;.  int i
eca0: 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e  ;.  for(i=pTab->
ecb0: 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54  nCol, pTabCol=pT
ecc0: 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69  ab->aCol; i>0; i
ecd0: 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a  --, pTabCol++){.
ece0: 20 20 20 20 77 54 61 62 6c 65 20 2b 3d 20 70 54      wTable += pT
ecf0: 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20  abCol->szEst;.  
ed00: 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50  }.  if( pTab->iP
ed10: 4b 65 79 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b  Key<0 ) wTable++
ed20: 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52  ;.  pTab->szTabR
ed30: 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
ed40: 73 74 28 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a  st(wTable*4);.}.
ed50: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
ed60: 74 68 65 20 61 76 65 72 61 67 65 20 73 69 7a 65  the average size
ed70: 20 6f 66 20 61 20 72 6f 77 20 66 6f 72 20 61 6e   of a row for an
ed80: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
ed90: 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65 49  c void estimateI
eda0: 6e 64 65 78 57 69 64 74 68 28 49 6e 64 65 78 20  ndexWidth(Index 
edb0: 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e  *pIdx){.  unsign
edc0: 65 64 20 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ed wIndex = 0;. 
edd0: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
ede0: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70  Column *aCol = p
edf0: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
ee00: 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  l;.  for(i=0; i<
ee10: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
ee20: 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20 78 20 3d  ++){.    i16 x =
ee30: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
ee40: 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
ee50: 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  x<pIdx->pTable->
ee60: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64  nCol );.    wInd
ee70: 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20  ex += x<0 ? 1 : 
ee80: 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c  aCol[pIdx->aiCol
ee90: 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20  umn[i]].szEst;. 
eea0: 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a 49 64 78   }.  pIdx->szIdx
eeb0: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
eec0: 45 73 74 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d  Est(wIndex*4);.}
eed0: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65  ../* Return true
eee0: 20 69 66 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65   if column numbe
eef0: 72 20 78 20 69 73 20 61 6e 79 20 6f 66 20 74 68  r x is any of th
ef00: 65 20 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74  e first nCol ent
ef10: 72 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d 2e  ries of aiCol[].
ef20: 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 64  .** This is used
ef30: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
ef40: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
ef50: 65 72 20 78 20 61 70 70 65 61 72 73 20 69 6e 20  er x appears in 
ef60: 61 6e 79 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  any of the.** fi
ef70: 72 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73  rst nCol entries
ef80: 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f   of an index..*/
ef90: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 43  .static int hasC
efa0: 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20  olumn(const i16 
efb0: 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c  *aiCol, int nCol
efc0: 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c  , int x){.  whil
efd0: 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 7b  e( nCol-- > 0 ){
efe0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 69 43  .    assert( aiC
eff0: 6f 6c 5b 30 5d 3e 3d 30 20 29 3b 0a 20 20 20 20  ol[0]>=0 );.    
f000: 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b  if( x==*(aiCol++
f010: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
f020: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
f030: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
f040: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
f050: 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69  if any of the fi
f060: 72 73 74 20 6e 4b 65 79 20 65 6e 74 72 69 65 73  rst nKey entries
f070: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 20 65   of index pIdx e
f080: 78 61 63 74 6c 79 0a 2a 2a 20 6d 61 74 63 68 20  xactly.** match 
f090: 74 68 65 20 69 43 6f 6c 2d 74 68 20 65 6e 74 72  the iCol-th entr
f0a0: 79 20 6f 66 20 70 50 6b 2e 20 20 70 50 6b 20 69  y of pPk.  pPk i
f0b0: 73 20 61 6c 77 61 79 73 20 61 20 57 49 54 48 4f  s always a WITHO
f0c0: 55 54 20 52 4f 57 49 44 0a 2a 2a 20 50 52 49 4d  UT ROWID.** PRIM
f0d0: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 20  ARY KEY index.  
f0e0: 70 49 64 78 20 69 73 20 61 6e 20 69 6e 64 65 78  pIdx is an index
f0f0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
f100: 6c 65 2e 20 20 70 49 64 78 20 6d 61 79 0a 2a 2a  le.  pIdx may.**
f110: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 74   or may not be t
f120: 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73  he same index as
f130: 20 70 50 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   pPk..**.** The 
f140: 66 69 72 73 74 20 6e 4b 65 79 20 65 6e 74 72 69  first nKey entri
f150: 65 73 20 6f 66 20 70 49 64 78 20 61 72 65 20 67  es of pIdx are g
f160: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
f170: 6f 72 64 69 6e 61 72 79 20 63 6f 6c 75 6d 6e 73  ordinary columns
f180: 2c 0a 2a 2a 20 6e 6f 74 20 61 20 72 6f 77 69 64  ,.** not a rowid
f190: 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a   or expression..
f1a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
f1b0: 6e 65 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  ne differs from 
f1c0: 68 61 73 43 6f 6c 75 6d 6e 28 29 20 69 6e 20 74  hasColumn() in t
f1d0: 68 61 74 20 62 6f 74 68 20 74 68 65 20 63 6f 6c  hat both the col
f1e0: 75 6d 6e 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  umn and the.** c
f1f0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
f200: 65 20 6d 75 73 74 20 6d 61 74 63 68 20 66 6f 72  e must match for
f210: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 62   this routine, b
f220: 75 74 20 66 6f 72 20 68 61 73 43 6f 6c 75 6d 6e  ut for hasColumn
f230: 28 29 20 6f 6e 6c 79 0a 2a 2a 20 74 68 65 20 63  () only.** the c
f240: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6d 75 73 74 20  olumn name must 
f250: 6d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  match..*/.static
f260: 20 69 6e 74 20 69 73 44 75 70 43 6f 6c 75 6d 6e   int isDupColumn
f270: 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e  (Index *pIdx, in
f280: 74 20 6e 4b 65 79 2c 20 49 6e 64 65 78 20 2a 70  t nKey, Index *p
f290: 50 6b 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  Pk, int iCol){. 
f2a0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 73 73   int i, j;.  ass
f2b0: 65 72 74 28 20 6e 4b 65 79 3c 3d 70 49 64 78 2d  ert( nKey<=pIdx-
f2c0: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  >nColumn );.  as
f2d0: 73 65 72 74 28 20 69 43 6f 6c 3c 4d 41 58 28 70  sert( iCol<MAX(p
f2e0: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2c 70 50 6b 2d  Pk->nColumn,pPk-
f2f0: 3e 6e 4b 65 79 43 6f 6c 29 20 29 3b 0a 20 20 61  >nKeyCol) );.  a
f300: 73 73 65 72 74 28 20 70 50 6b 2d 3e 69 64 78 54  ssert( pPk->idxT
f310: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54  ype==SQLITE_IDXT
f320: 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29  YPE_PRIMARYKEY )
f330: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d  ;.  assert( pPk-
f340: 3e 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67  >pTable->tabFlag
f350: 73 20 26 20 54 46 5f 57 69 74 68 6f 75 74 52 6f  s & TF_WithoutRo
f360: 77 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  wid );.  assert(
f370: 20 70 50 6b 2d 3e 70 54 61 62 6c 65 3d 3d 70 49   pPk->pTable==pI
f380: 64 78 2d 3e 70 54 61 62 6c 65 20 29 3b 0a 20 20  dx->pTable );.  
f390: 74 65 73 74 63 61 73 65 28 20 70 50 6b 3d 3d 70  testcase( pPk==p
f3a0: 49 64 78 20 29 3b 0a 20 20 6a 20 3d 20 70 50 6b  Idx );.  j = pPk
f3b0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d  ->aiColumn[iCol]
f3c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 21 3d 58  ;.  assert( j!=X
f3d0: 4e 5f 52 4f 57 49 44 20 26 26 20 6a 21 3d 58 4e  N_ROWID && j!=XN
f3e0: 5f 45 58 50 52 20 29 3b 0a 20 20 66 6f 72 28 69  _EXPR );.  for(i
f3f0: 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29  =0; i<nKey; i++)
f400: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
f410: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e  dx->aiColumn[i]>
f420: 3d 30 20 7c 7c 20 6a 3e 3d 30 20 29 3b 0a 20 20  =0 || j>=0 );.  
f430: 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
f440: 6c 75 6d 6e 5b 69 5d 3d 3d 6a 20 0a 20 20 20 20  lumn[i]==j .    
f450: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
f460: 6d 70 28 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  mp(pIdx->azColl[
f470: 69 5d 2c 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b  i], pPk->azColl[
f480: 69 43 6f 6c 5d 29 3d 3d 30 0a 20 20 20 20 29 7b  iCol])==0.    ){
f490: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
f4a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
f4b0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 63  urn 0;.}../* Rec
f4c0: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 4e 6f  ompute the colNo
f4d0: 74 49 64 78 65 64 20 66 69 65 6c 64 20 6f 66 20  tIdxed field of 
f4e0: 74 68 65 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  the Index..**.**
f4f0: 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 69 73 20   colNotIdxed is 
f500: 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 68  a bitmask that h
f510: 61 73 20 61 20 30 20 62 69 74 20 72 65 70 72 65  as a 0 bit repre
f520: 73 65 6e 74 69 6e 67 20 65 61 63 68 20 69 6e 64  senting each ind
f530: 65 78 65 64 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  exed.** columns 
f540: 74 68 61 74 20 61 72 65 20 77 69 74 68 69 6e 20  that are within 
f550: 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c  the first 63 col
f560: 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c  umns of the tabl
f570: 65 2e 20 20 54 68 65 0a 2a 2a 20 68 69 67 68 2d  e.  The.** high-
f580: 6f 72 64 65 72 20 62 69 74 20 6f 66 20 63 6f 6c  order bit of col
f590: 4e 6f 74 49 64 78 65 64 20 69 73 20 61 6c 77 61  NotIdxed is alwa
f5a0: 79 73 20 31 2e 20 20 41 6c 6c 20 75 6e 69 6e 64  ys 1.  All unind
f5b0: 65 78 65 64 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  exed columns.** 
f5c0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 76  of the table hav
f5d0: 65 20 61 20 31 2e 0a 2a 2a 0a 2a 2a 20 32 30 31  e a 1..**.** 201
f5e0: 39 2d 31 30 2d 32 34 3a 20 20 46 6f 72 20 74 68  9-10-24:  For th
f5f0: 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69  e purpose of thi
f600: 73 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2c 20 76  s computation, v
f610: 69 72 74 75 61 6c 20 63 6f 6c 75 6d 6e 73 20 61  irtual columns a
f620: 72 65 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 73 69 64  re.** not consid
f630: 65 72 65 64 20 74 6f 20 62 65 20 63 6f 76 65 72  ered to be cover
f640: 65 64 20 62 79 20 74 68 65 20 69 6e 64 65 78 2c  ed by the index,
f650: 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 61 72   even if they ar
f660: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6e 64 65  e in the.** inde
f670: 78 2c 20 62 65 63 61 75 73 65 20 77 65 20 64 6f  x, because we do
f680: 20 6e 6f 74 20 74 72 75 73 74 20 74 68 65 20 6c   not trust the l
f690: 6f 67 69 63 20 69 6e 20 77 68 65 72 65 49 6e 64  ogic in whereInd
f6a0: 65 78 45 78 70 72 54 72 61 6e 73 28 29 20 74 6f  exExprTrans() to
f6b0: 20 62 65 0a 2a 2a 20 61 62 6c 65 20 74 6f 20 66   be.** able to f
f6c0: 69 6e 64 20 61 6c 6c 20 69 6e 73 74 61 6e 63 65  ind all instance
f6d0: 73 20 6f 66 20 61 20 72 65 66 65 72 65 6e 63 65  s of a reference
f6e0: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 65 64 20   to the indexed 
f6f0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  table column.** 
f700: 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 68 65 6d  and convert them
f710: 20 69 6e 74 6f 20 72 65 66 65 72 65 6e 63 65 73   into references
f720: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 2e 20 20   to the index.  
f730: 48 65 6e 63 65 20 77 65 20 61 6c 77 61 79 73 20  Hence we always 
f740: 77 61 6e 74 0a 2a 2a 20 74 68 65 20 61 63 74 75  want.** the actu
f750: 61 6c 20 74 61 62 6c 65 20 61 74 20 68 61 6e 64  al table at hand
f760: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 63   in order to rec
f770: 6f 6d 70 75 74 65 20 74 68 65 20 76 69 72 74 75  ompute the virtu
f780: 61 6c 20 63 6f 6c 75 6d 6e 2c 20 69 66 0a 2a 2a  al column, if.**
f790: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
f7a0: 2a 20 54 68 65 20 63 6f 6c 4e 6f 74 49 64 78 65  * The colNotIdxe
f7b0: 64 20 6d 61 73 6b 20 69 73 20 41 4e 44 2d 65 64  d mask is AND-ed
f7c0: 20 77 69 74 68 20 74 68 65 20 53 72 63 4c 69 73   with the SrcLis
f7d0: 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 6d 61  t.a[].colUsed ma
f7e0: 73 6b 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  sk.** to determi
f7f0: 6e 65 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ne if the index 
f800: 69 73 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  is covering inde
f810: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
f820: 64 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d  d recomputeColum
f830: 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28 49 6e 64  nsNotIndexed(Ind
f840: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74  ex *pIdx){.  Bit
f850: 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e  mask m = 0;.  in
f860: 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  t j;.  Table *pT
f870: 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ab = pIdx->pTabl
f880: 65 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d  e;.  for(j=pIdx-
f890: 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30  >nColumn-1; j>=0
f8a0: 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; j--){.    int 
f8b0: 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  x = pIdx->aiColu
f8c0: 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78  mn[j];.    if( x
f8d0: 3e 3d 30 20 26 26 20 28 70 54 61 62 2d 3e 61 43  >=0 && (pTab->aC
f8e0: 6f 6c 5b 78 5d 2e 63 6f 6c 46 6c 61 67 73 20 26  ol[x].colFlags &
f8f0: 20 43 4f 4c 46 4c 41 47 5f 56 49 52 54 55 41 4c   COLFLAG_VIRTUAL
f900: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  )==0 ){.      te
f910: 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31  stcase( x==BMS-1
f920: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
f930: 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a  se( x==BMS-2 );.
f940: 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d        if( x<BMS-
f950: 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54  1 ) m |= MASKBIT
f960: 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (x);.    }.  }. 
f970: 20 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78   pIdx->colNotIdx
f980: 65 64 20 3d 20 7e 6d 3b 0a 20 20 61 73 73 65 72  ed = ~m;.  asser
f990: 74 28 20 28 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74  t( (pIdx->colNot
f9a0: 49 64 78 65 64 3e 3e 36 33 29 3d 3d 31 20 29 3b  Idxed>>63)==1 );
f9b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
f9c0: 6f 75 74 69 6e 65 20 72 75 6e 73 20 61 74 20 74  outine runs at t
f9d0: 68 65 20 65 6e 64 20 6f 66 20 70 61 72 73 69 6e  he end of parsin
f9e0: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
f9f0: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 0a   statement that.
fa00: 2a 2a 20 68 61 73 20 61 20 57 49 54 48 4f 55 54  ** has a WITHOUT
fa10: 20 52 4f 57 49 44 20 63 6c 61 75 73 65 2e 20 20   ROWID clause.  
fa20: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
fa30: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 63 6f  routine is to co
fa40: 6e 76 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e  nvert both.** in
fa50: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 61  ternal schema da
fa60: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61 6e  ta structures an
fa70: 64 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  d the generated 
fa80: 56 44 42 45 20 63 6f 64 65 20 73 6f 20 74 68 61  VDBE code so tha
fa90: 74 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 61 70  t they.** are ap
faa0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 61 20  propriate for a 
fab0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
fac0: 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ble instead of a
fad0: 20 72 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a   rowid table..**
fae0: 20 43 68 61 6e 67 65 73 20 69 6e 63 6c 75 64 65   Changes include
faf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
fb00: 20 53 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73   Set all columns
fb10: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
fb20: 4b 45 59 20 73 63 68 65 6d 61 20 6f 62 6a 65 63  KEY schema objec
fb30: 74 20 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c  t to be NOT NULL
fb40: 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 43 6f  ..**     (2)  Co
fb50: 6e 76 65 72 74 20 50 33 20 70 61 72 61 6d 65 74  nvert P3 paramet
fb60: 65 72 20 6f 66 20 74 68 65 20 4f 50 5f 43 72 65  er of the OP_Cre
fb70: 61 74 65 42 74 72 65 65 20 66 72 6f 6d 20 42 54  ateBtree from BT
fb80: 52 45 45 5f 49 4e 54 4b 45 59 20 0a 2a 2a 20 20  REE_INTKEY .**  
fb90: 20 20 20 20 20 20 20 20 69 6e 74 6f 20 42 54 52          into BTR
fba0: 45 45 5f 42 4c 4f 42 4b 45 59 2e 0a 2a 2a 20 20  EE_BLOBKEY..**  
fbb0: 20 20 20 28 33 29 20 20 42 79 70 61 73 73 20 74     (3)  Bypass t
fbc0: 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74  he creation of t
fbd0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
fbe0: 20 74 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20   table entry.** 
fbf0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 68 65           for the
fc00: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 73 20   PRIMARY KEY as 
fc10: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
fc20: 69 6e 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a 20  index is now.** 
fc30: 20 20 20 20 20 20 20 20 20 69 64 65 6e 74 69 66           identif
fc40: 69 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74  ied by the sqlit
fc50: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65  e_master table e
fc60: 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c  ntry of the tabl
fc70: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20 20  e itself..**    
fc80: 20 28 34 29 20 20 53 65 74 20 74 68 65 20 49 6e   (4)  Set the In
fc90: 64 65 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65 20  dex.tnum of the 
fca0: 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65  PRIMARY KEY Inde
fcb0: 78 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a  x object in the.
fcc0: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 68 65  **          sche
fcd0: 6d 61 20 74 6f 20 74 68 65 20 72 6f 6f 74 70 61  ma to the rootpa
fce0: 67 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ge from the main
fcf0: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 28   table..**     (
fd00: 35 29 20 20 41 64 64 20 61 6c 6c 20 74 61 62 6c  5)  Add all tabl
fd10: 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  e columns to the
fd20: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64   PRIMARY KEY Ind
fd30: 65 78 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20  ex object.**    
fd40: 20 20 20 20 20 20 73 6f 20 74 68 61 74 20 74 68        so that th
fd50: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
fd60: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
fd70: 78 2e 20 20 54 68 65 20 73 75 72 70 6c 75 73 0a  x.  The surplus.
fd80: 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75  **          colu
fd90: 6d 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66 20  mns are part of 
fda0: 4b 65 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c  KeyInfo.nAllFiel
fdb0: 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 75 73  d and are not us
fdc0: 65 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ed for.**       
fdd0: 20 20 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f     sorting or lo
fde0: 6f 6b 75 70 20 6f 72 20 75 6e 69 71 75 65 6e 65  okup or uniquene
fdf0: 73 73 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20  ss checks..**   
fe00: 20 20 28 36 29 20 20 52 65 70 6c 61 63 65 20 74    (6)  Replace t
fe10: 68 65 20 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e  he rowid tail on
fe20: 20 61 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c   all automatical
fe30: 6c 79 20 67 65 6e 65 72 61 74 65 64 20 55 4e 49  ly generated UNI
fe40: 51 55 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  QUE.**          
fe50: 69 6e 64 69 63 65 73 20 77 69 74 68 20 74 68 65  indices with the
fe60: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
fe70: 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  umns..**.** For 
fe80: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2c 20  virtual tables, 
fe90: 6f 6e 6c 79 20 28 31 29 20 69 73 20 70 65 72 66  only (1) is perf
fea0: 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ormed..*/.static
feb0: 20 76 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f 57   void convertToW
fec0: 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65  ithoutRowidTable
fed0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
fee0: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
fef0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 49  Index *pIdx;.  I
ff00: 6e 64 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74  ndex *pPk;.  int
ff10: 20 6e 50 6b 3b 0a 20 20 69 6e 74 20 6e 45 78 74   nPk;.  int nExt
ff20: 72 61 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ra;.  int i, j;.
ff30: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ff40: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
ff50: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
ff60: 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 4d 61 72  pVdbe;..  /* Mar
ff70: 6b 20 65 76 65 72 79 20 50 52 49 4d 41 52 59 20  k every PRIMARY 
ff80: 4b 45 59 20 63 6f 6c 75 6d 6e 20 61 73 20 4e 4f  KEY column as NO
ff90: 54 20 4e 55 4c 4c 20 28 65 78 63 65 70 74 20 66  T NULL (except f
ffa0: 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  or imposter tabl
ffb0: 65 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es).  */.  if( !
ffc0: 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65  db->init.imposte
ffd0: 72 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 6f  rTable ){.    fo
ffe0: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
fff0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
10000 20 69 66 28 20 28 70 54 61 62 2d 3e 61 43 6f 6c   if( (pTab->aCol
10010 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43  [i].colFlags & C
10020 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21  OLFLAG_PRIMKEY)!
10030 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  =0 ){.        pT
10040 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e  ab->aCol[i].notN
10050 75 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ull = OE_Abort;.
10060 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10070 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  }..  /* Convert 
10080 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 6f  the P3 operand o
10090 66 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 42  f the OP_CreateB
100a0 74 72 65 65 20 6f 70 63 6f 64 65 20 66 72 6f 6d  tree opcode from
100b0 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 0a 20 20   BTREE_INTKEY.  
100c0 2a 2a 20 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c  ** into BTREE_BL
100d0 4f 42 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 69 66  OBKEY..  */.  if
100e0 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72  ( pParse->addrCr
100f0 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
10100 74 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c 69  t( v );.    sqli
10110 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
10120 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43  v, pParse->addrC
10130 72 54 61 62 2c 20 42 54 52 45 45 5f 42 4c 4f 42  rTab, BTREE_BLOB
10140 4b 45 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  KEY);.  }..  /* 
10150 4c 6f 63 61 74 65 20 74 68 65 20 50 52 49 4d 41  Locate the PRIMA
10160 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f  RY KEY index.  O
10170 72 2c 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  r, if this table
10180 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a   was originally.
10190 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47 45 52 20    ** an INTEGER 
101a0 50 52 49 4d 41 52 59 20 4b 45 59 20 74 61 62 6c  PRIMARY KEY tabl
101b0 65 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  e, create a new 
101c0 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
101d0 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  x. .  */.  if( p
101e0 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b  Tab->iPKey>=0 ){
101f0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
10200 4c 69 73 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20  List;.    Token 
10210 69 70 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20 73 71  ipkToken;.    sq
10220 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26  lite3TokenInit(&
10230 69 70 6b 54 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e  ipkToken, pTab->
10240 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79  aCol[pTab->iPKey
10250 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c  ].zName);.    pL
10260 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
10270 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
10280 73 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  se, 0, .        
10290 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
102a0 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
102b0 4b 5f 49 44 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c  K_ID, &ipkToken,
102c0 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c   0));.    if( pL
102d0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
102e0 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41  .    if( IN_RENA
102f0 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
10300 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
10310 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73  TokenRemap(pPars
10320 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  e, pList->a[0].p
10330 45 78 70 72 2c 20 26 70 54 61 62 2d 3e 69 50 4b  Expr, &pTab->iPK
10340 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ey);.    }.    p
10350 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 46  List->a[0].sortF
10360 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 69  lags = pParse->i
10370 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  PkSortOrder;.   
10380 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
10390 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61 62  >pNewTable==pTab
103a0 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50   );.    pTab->iP
103b0 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Key = -1;.    sq
103c0 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
103d0 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30  (pParse, 0, 0, 0
103e0 2c 20 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b  , pList, pTab->k
103f0 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c  eyConf, 0, 0, 0,
10400 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
10410 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
10420 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52  E_IDXTYPE_PRIMAR
10430 59 4b 45 59 29 3b 0a 20 20 20 20 69 66 28 20 64  YKEY);.    if( d
10440 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
10450 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
10460 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 50  ) return;.    pP
10470 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
10480 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
10490 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
104a0 6b 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b  k->nKeyCol==1 );
104b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
104c0 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
104d0 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
104e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
104f0 6b 21 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a  k!=0 );..    /*.
10500 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 61 6c      ** Remove al
10510 6c 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75  l redundant colu
10520 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 50 52 49  mns from the PRI
10530 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 20 65  MARY KEY.  For e
10540 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67 65 0a 20  xample, change. 
10550 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b     ** "PRIMARY K
10560 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c 62 2c 63  EY(a,b,a,b,c,b,c
10570 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73 74 20 22  ,d)" into just "
10580 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c  PRIMARY KEY(a,b,
10590 63 2c 64 29 22 2e 20 20 4c 61 74 65 72 0a 20 20  c,d)".  Later.  
105a0 20 20 2a 2a 20 63 6f 64 65 20 61 73 73 75 6d 65    ** code assume
105b0 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  s the PRIMARY KE
105c0 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 65  Y contains no re
105d0 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a  peated columns..
105e0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
105f0 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65  =j=1; i<pPk->nKe
10600 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
10610 20 20 69 66 28 20 69 73 44 75 70 43 6f 6c 75 6d    if( isDupColum
10620 6e 28 70 50 6b 2c 20 6a 2c 20 70 50 6b 2c 20 69  n(pPk, j, pPk, i
10630 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 6b  ) ){.        pPk
10640 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20 20  ->nColumn--;.   
10650 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10660 20 20 74 65 73 74 63 61 73 65 28 20 68 61 73 43    testcase( hasC
10670 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c  olumn(pPk->aiCol
10680 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69 43  umn, j, pPk->aiC
10690 6f 6c 75 6d 6e 5b 69 5d 29 20 29 3b 0a 20 20 20  olumn[i]) );.   
106a0 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c       pPk->azColl
106b0 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c  [j] = pPk->azCol
106c0 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70 50  l[i];.        pP
106d0 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  k->aSortOrder[j]
106e0 20 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64   = pPk->aSortOrd
106f0 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70  er[i];.        p
10700 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b  Pk->aiColumn[j++
10710 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ] = pPk->aiColum
10720 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n[i];.      }.  
10730 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65    }.    pPk->nKe
10740 79 43 6f 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20  yCol = j;.  }.  
10750 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29  assert( pPk!=0 )
10760 3b 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72  ;.  pPk->isCover
10770 69 6e 67 20 3d 20 31 3b 0a 20 20 69 66 28 20 21  ing = 1;.  if( !
10780 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65  db->init.imposte
10790 72 54 61 62 6c 65 20 29 20 70 50 6b 2d 3e 75 6e  rTable ) pPk->un
107a0 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20  iqNotNull = 1;. 
107b0 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 43 6f 6c   nPk = pPk->nCol
107c0 75 6d 6e 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43  umn = pPk->nKeyC
107d0 6f 6c 3b 0a 0a 20 20 2f 2a 20 42 79 70 61 73 73  ol;..  /* Bypass
107e0 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66   the creation of
107f0 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
10800 20 62 74 72 65 65 20 61 6e 64 20 74 68 65 20 73   btree and the s
10810 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a  qlite_master.  *
10820 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 54  * table entry. T
10830 68 69 73 20 69 73 20 6f 6e 6c 79 20 72 65 71 75  his is only requ
10840 69 72 65 64 20 69 66 20 63 75 72 72 65 6e 74 6c  ired if currentl
10850 79 20 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42  y generating VDB
10860 45 0a 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72 20  E.  ** code for 
10870 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 28  a CREATE TABLE (
10880 6e 6f 74 20 77 68 65 6e 20 70 61 72 73 69 6e 67  not when parsing
10890 20 6f 6e 65 20 61 73 20 70 61 72 74 20 6f 66 20   one as part of 
108a0 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61 20 64  reading.  ** a d
108b0 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 29 2e  atabase schema).
108c0 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26 20    */.  if( v && 
108d0 70 50 6b 2d 3e 74 6e 75 6d 3e 30 20 29 7b 0a 20  pPk->tnum>0 ){. 
108e0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
108f0 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20  nit.busy==0 );. 
10900 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
10910 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70 50  angeOpcode(v, pP
10920 6b 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74 6f  k->tnum, OP_Goto
10930 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
10940 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
10950 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
10960 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 20   the table root 
10970 70 61 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74  page */.  pPk->t
10980 6e 75 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  num = pTab->tnum
10990 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
109a0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
109b0 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  resentation of a
109c0 6c 6c 20 55 4e 49 51 55 45 20 69 6e 64 69 63 65  ll UNIQUE indice
109d0 73 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a  s by converting.
109e0 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 72    ** the final r
109f0 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f  owid column into
10a00 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c   one or more col
10a10 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d  umns of the PRIM
10a20 41 52 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20  ARY KEY..  */.  
10a30 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
10a40 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
10a50 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
10a60 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69      int n;.    i
10a70 66 28 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49  f( IsPrimaryKeyI
10a80 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e  ndex(pIdx) ) con
10a90 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69  tinue;.    for(i
10aa0 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b  =n=0; i<nPk; i++
10ab0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  ){.      if( !is
10ac0 44 75 70 43 6f 6c 75 6d 6e 28 70 49 64 78 2c 20  DupColumn(pIdx, 
10ad0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70  pIdx->nKeyCol, p
10ae0 50 6b 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20  Pk, i) ){.      
10af0 20 20 74 65 73 74 63 61 73 65 28 20 68 61 73 43    testcase( hasC
10b00 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f  olumn(pIdx->aiCo
10b10 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  lumn, pIdx->nKey
10b20 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  Col, pPk->aiColu
10b30 6d 6e 5b 69 5d 29 20 29 3b 0a 20 20 20 20 20 20  mn[i]) );.      
10b40 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    n++;.      }. 
10b50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d     }.    if( n==
10b60 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
10b70 69 73 20 69 6e 64 65 78 20 69 73 20 61 20 73 75  is index is a su
10b80 70 65 72 73 65 74 20 6f 66 20 74 68 65 20 70 72  perset of the pr
10b90 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20  imary key */.   
10ba0 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e     pIdx->nColumn
10bb0 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   = pIdx->nKeyCol
10bc0 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
10bd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10be0 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63  resizeIndexObjec
10bf0 74 28 64 62 2c 20 70 49 64 78 2c 20 70 49 64 78  t(db, pIdx, pIdx
10c00 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72  ->nKeyCol+n) ) r
10c10 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69  eturn;.    for(i
10c20 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79  =0, j=pIdx->nKey
10c30 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29  Col; i<nPk; i++)
10c40 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 44  {.      if( !isD
10c50 75 70 43 6f 6c 75 6d 6e 28 70 49 64 78 2c 20 70  upColumn(pIdx, p
10c60 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50  Idx->nKeyCol, pP
10c70 6b 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20  k, i) ){.       
10c80 20 74 65 73 74 63 61 73 65 28 20 68 61 73 43 6f   testcase( hasCo
10c90 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c  lumn(pIdx->aiCol
10ca0 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  umn, pIdx->nKeyC
10cb0 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ol, pPk->aiColum
10cc0 6e 5b 69 5d 29 20 29 3b 0a 20 20 20 20 20 20 20  n[i]) );.       
10cd0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
10ce0 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  j] = pPk->aiColu
10cf0 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70  mn[i];.        p
10d00 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d  Idx->azColl[j] =
10d10 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b   pPk->azColl[i];
10d20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 6b  .        if( pPk
10d30 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
10d40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
10d50 53 65 65 20 74 69 63 6b 65 74 20 68 74 74 70 73  See ticket https
10d60 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72  ://www.sqlite.or
10d70 67 2f 73 72 63 2f 69 6e 66 6f 2f 62 62 61 37 62  g/src/info/bba7b
10d80 36 39 66 39 38 34 39 62 35 62 66 20 2a 2f 0a 20  69f9849b5bf */. 
10d90 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 62           pIdx->b
10da0 41 73 63 4b 65 79 42 75 67 20 3d 20 31 3b 0a 20  AscKeyBug = 1;. 
10db0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10dc0 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   j++;.      }.  
10dd0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
10de0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70  pIdx->nColumn>=p
10df0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29  Idx->nKeyCol+n )
10e00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
10e10 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  dx->nColumn>=j )
10e20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
10e30 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
10e40 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
10e50 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f 0a   KEY index.  */.
10e60 20 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20    nExtra = 0;.  
10e70 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
10e80 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
10e90 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28   if( !hasColumn(
10ea0 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6e  pPk->aiColumn, n
10eb0 50 6b 2c 20 69 29 0a 20 20 20 20 20 26 26 20 28  Pk, i).     && (
10ec0 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f  pTab->aCol[i].co
10ed0 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
10ee0 5f 56 49 52 54 55 41 4c 29 3d 3d 30 20 29 20 6e  _VIRTUAL)==0 ) n
10ef0 45 78 74 72 61 2b 2b 3b 0a 20 20 7d 0a 20 20 69  Extra++;.  }.  i
10f00 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62  f( resizeIndexOb
10f10 6a 65 63 74 28 64 62 2c 20 70 50 6b 2c 20 6e 50  ject(db, pPk, nP
10f20 6b 2b 6e 45 78 74 72 61 29 20 29 20 72 65 74 75  k+nExtra) ) retu
10f30 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6a  rn;.  for(i=0, j
10f40 3d 6e 50 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  =nPk; i<pTab->nC
10f50 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
10f60 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b  ( !hasColumn(pPk
10f70 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69  ->aiColumn, j, i
10f80 29 0a 20 20 20 20 20 26 26 20 28 70 54 61 62 2d  ).     && (pTab-
10f90 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67  >aCol[i].colFlag
10fa0 73 20 26 20 43 4f 4c 46 4c 41 47 5f 56 49 52 54  s & COLFLAG_VIRT
10fb0 55 41 4c 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  UAL)==0.    ){. 
10fc0 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70       assert( j<p
10fd0 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  Pk->nColumn );. 
10fe0 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75       pPk->aiColu
10ff0 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[j] = i;.     
11000 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20   pPk->azColl[j] 
11010 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  = sqlite3StrBINA
11020 52 59 3b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  RY;.      j++;. 
11030 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
11040 74 28 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d  t( pPk->nColumn=
11050 3d 6a 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =j );.  assert( 
11060 70 54 61 62 2d 3e 6e 4e 56 43 6f 6c 3c 3d 6a 20  pTab->nNVCol<=j 
11070 29 3b 0a 20 20 72 65 63 6f 6d 70 75 74 65 43 6f  );.  recomputeCo
11080 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28  lumnsNotIndexed(
11090 70 50 6b 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  pPk);.}..#ifndef
110a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
110b0 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
110c0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 7a  Return true if z
110d0 4e 61 6d 65 20 69 73 20 61 20 73 68 61 64 6f 77  Name is a shadow
110e0 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74   table name in t
110f0 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62  he current datab
11100 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
11110 6e 2e 0a 2a 2a 0a 2a 2a 20 7a 4e 61 6d 65 20 69  n..**.** zName i
11120 73 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 6d 6f  s temporarily mo
11130 64 69 66 69 65 64 20 77 68 69 6c 65 20 74 68 69  dified while thi
11140 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e  s routine is run
11150 6e 69 6e 67 2c 20 62 75 74 20 69 73 0a 2a 2a 20  ning, but is.** 
11160 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
11170 6f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 70  original value p
11180 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
11190 74 69 6e 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  tine returning..
111a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
111b0 53 68 61 64 6f 77 54 61 62 6c 65 4e 61 6d 65 28  ShadowTableName(
111c0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 68 61  sqlite3 *db, cha
111d0 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63 68 61  r *zName){.  cha
111e0 72 20 2a 7a 54 61 69 6c 3b 20 20 20 20 20 20 20  r *zTail;       
111f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
11200 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 61 73  inter to the las
11210 74 20 22 5f 22 20 69 6e 20 7a 4e 61 6d 65 20 2a  t "_" in zName *
11220 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11240 20 20 2f 2a 20 54 61 62 6c 65 20 74 68 61 74 20    /* Table that 
11250 7a 4e 61 6d 65 20 69 73 20 61 20 73 68 61 64 6f  zName is a shado
11260 77 20 6f 66 20 2a 2f 0a 20 20 4d 6f 64 75 6c 65  w of */.  Module
11270 20 2a 70 4d 6f 64 3b 20 20 20 20 20 20 20 20 20   *pMod;         
11280 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 75 6c          /* Modul
11290 65 20 66 6f 72 20 74 68 65 20 76 69 72 74 75 61  e for the virtua
112a0 6c 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 7a 54  l table */..  zT
112b0 61 69 6c 20 3d 20 73 74 72 72 63 68 72 28 7a 4e  ail = strrchr(zN
112c0 61 6d 65 2c 20 27 5f 27 29 3b 0a 20 20 69 66 28  ame, '_');.  if(
112d0 20 7a 54 61 69 6c 3d 3d 30 20 29 20 72 65 74 75   zTail==0 ) retu
112e0 72 6e 20 30 3b 0a 20 20 2a 7a 54 61 69 6c 20 3d  rn 0;.  *zTail =
112f0 20 30 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   0;.  pTab = sql
11300 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
11310 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 2a  , zName, 0);.  *
11320 7a 54 61 69 6c 20 3d 20 27 5f 27 3b 0a 20 20 69  zTail = '_';.  i
11330 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
11340 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 49 73  urn 0;.  if( !Is
11350 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
11360 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4d 6f 64  return 0;.  pMod
11370 20 3d 20 28 4d 6f 64 75 6c 65 2a 29 73 71 6c 69   = (Module*)sqli
11380 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
11390 3e 61 4d 6f 64 75 6c 65 2c 20 70 54 61 62 2d 3e  >aModule, pTab->
113a0 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 29 3b  azModuleArg[0]);
113b0 0a 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20 29  .  if( pMod==0 )
113c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
113d0 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e   pMod->pModule->
113e0 69 56 65 72 73 69 6f 6e 3c 33 20 29 20 72 65 74  iVersion<3 ) ret
113f0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 4d 6f  urn 0;.  if( pMo
11400 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 53 68 61  d->pModule->xSha
11410 64 6f 77 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  dowName==0 ) ret
11420 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
11430 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78  pMod->pModule->x
11440 53 68 61 64 6f 77 4e 61 6d 65 28 7a 54 61 69 6c  ShadowName(zTail
11450 2b 31 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  +1);.}.#else.# d
11460 65 66 69 6e 65 20 69 73 53 68 61 64 6f 77 54 61  efine isShadowTa
11470 62 6c 65 4e 61 6d 65 28 78 2c 79 29 20 30 0a 23  bleName(x,y) 0.#
11480 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20  endif /* ifndef 
11490 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
114a0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
114b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
114c0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70  is called to rep
114d0 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29  ort the final ")
114e0 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65  " that terminate
114f0 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41  s.** a CREATE TA
11500 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
11510 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73  *.** The table s
11520 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f 74  tructure that ot
11530 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  her action routi
11540 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62 75  nes have been bu
11550 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64  ilding.** is add
11560 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e  ed to the intern
11570 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20  al hash tables, 
11580 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f  assuming no erro
11590 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72  rs have.** occur
115a0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e  red..**.** An en
115b0 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c  try for the tabl
115c0 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65  e is made in the
115d0 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e   master table on
115e0 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a   disk, unless.**
115f0 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
11600 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62  rary table or db
11610 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20  ->init.busy==1. 
11620 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62   When db->init.b
11630 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61  usy==1.** it mea
11640 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
11650 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
11660 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73  ter table becaus
11670 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e  e we just.** con
11680 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64 61  nected to the da
11690 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75 73  tabase or becaus
116a0 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
116b0 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a  ter table has.**
116c0 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65   recently change
116d0 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20  d, so the entry 
116e0 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 61  for this table a
116f0 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e  lready exists in
11700 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  .** the sqlite_m
11710 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65  aster table.  We
11720 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20   do not want to 
11730 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e  create it again.
11740 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53  .**.** If the pS
11750 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69  elect argument i
11760 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d  s not NULL, it m
11770 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 72  eans that this r
11780 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61  outine.** was ca
11790 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
117a0 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
117b0 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45   from a .** "CRE
117c0 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53  ATE TABLE ... AS
117d0 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61   SELECT ..." sta
117e0 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c  tement.  The col
117f0 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  umn names of.** 
11800 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69  the new table wi
11810 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65 73  ll match the res
11820 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
11830 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ELECT..*/.void s
11840 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 0a  qlite3EndTable(.
11850 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
11860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
11870 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
11880 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20  Token *pCons,   
11890 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27          /* The '
118a0 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74  ,' token after t
118b0 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64  he last column d
118c0 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  efn. */.  Token 
118d0 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20  *pEnd,          
118e0 20 20 2f 2a 20 54 68 65 20 27 29 27 20 62 65 66    /* The ')' bef
118f0 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69 6e 20 74  ore options in t
11900 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
11910 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70 74 73 2c  */.  u8 tabOpts,
11920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11930 45 78 74 72 61 20 74 61 62 6c 65 20 6f 70 74 69  Extra table opti
11940 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20 30 2e 20  ons. Usually 0. 
11950 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
11960 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20  lect         /* 
11970 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43  Select from a "C
11980 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c  REATE ... AS SEL
11990 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ECT" */.){.  Tab
119a0 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  le *p;          
119b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
119c0 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  w table */.  sql
119d0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
119e0 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61  e->db; /* The da
119f0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
11a00 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  n */.  int iDb; 
11a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e 20   /* Database in 
11a30 77 68 69 63 68 20 74 68 65 20 74 61 62 6c 65 20  which the table 
11a40 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78  lives */.  Index
11a50 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
11a60 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d 70 6c 69       /* An impli
11a70 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ed index of the 
11a80 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20  table */..  if( 
11a90 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65  pEnd==0 && pSele
11aa0 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ct==0 ){.    ret
11ab0 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
11ac0 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
11ad0 69 6c 65 64 20 29 3b 0a 20 20 70 20 3d 20 70 50  iled );.  p = pP
11ae0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
11af0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
11b00 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 53 65  turn;..  if( pSe
11b10 6c 65 63 74 3d 3d 30 20 26 26 20 69 73 53 68 61  lect==0 && isSha
11b20 64 6f 77 54 61 62 6c 65 4e 61 6d 65 28 64 62 2c  dowTableName(db,
11b30 20 70 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20   p->zName) ){.  
11b40 20 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d    p->tabFlags |=
11b50 20 54 46 5f 53 68 61 64 6f 77 3b 0a 20 20 7d 0a   TF_Shadow;.  }.
11b60 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d  .  /* If the db-
11b70 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20  >init.busy is 1 
11b80 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
11b90 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20  reading the SQL 
11ba0 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71  off the.  ** "sq
11bb0 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20  lite_master" or 
11bc0 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73  "sqlite_temp_mas
11bd0 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68  ter" table on th
11be0 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20  e disk..  ** So 
11bf0 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  do not write to 
11c00 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20  the disk again. 
11c10 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f   Extract the roo
11c20 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  t page number.  
11c30 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ** for the table
11c40 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e   from the db->in
11c50 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64  it.newTnum field
11c60 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d  .  (The page num
11c70 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  ber.  ** should 
11c80 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68  have been put th
11c90 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74  ere by the sqlit
11ca0 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e  eOpenCb routine.
11cb0 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ).  **.  ** If t
11cc0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
11cd0 62 65 72 20 69 73 20 31 2c 20 74 68 61 74 20 6d  ber is 1, that m
11ce0 65 61 6e 73 20 74 68 69 73 20 69 73 20 74 68 65  eans this is the
11cf0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20   sqlite_master. 
11d00 20 2a 2a 20 74 61 62 6c 65 20 69 74 73 65 6c 66   ** table itself
11d10 2e 20 20 53 6f 20 6d 61 72 6b 20 69 74 20 72 65  .  So mark it re
11d20 61 64 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ad-only..  */.  
11d30 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
11d40 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 65  y ){.    if( pSe
11d50 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71  lect ){.      sq
11d60 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11d70 61 72 73 65 2c 20 22 22 29 3b 0a 20 20 20 20 20  arse, "");.     
11d80 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
11d90 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d     p->tnum = db-
11da0 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
11db0 20 20 20 69 66 28 20 70 2d 3e 74 6e 75 6d 3d 3d     if( p->tnum==
11dc0 31 20 29 20 70 2d 3e 74 61 62 46 6c 61 67 73 20  1 ) p->tabFlags 
11dd0 7c 3d 20 54 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a  |= TF_Readonly;.
11de0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28    }..  assert( (
11df0 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  p->tabFlags & TF
11e00 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 29 3d  _HasPrimaryKey)=
11e10 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  =0.       || p->
11e20 69 50 4b 65 79 3e 3d 30 20 7c 7c 20 73 71 6c 69  iPKey>=0 || sqli
11e30 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
11e40 65 78 28 70 29 21 3d 30 20 29 3b 0a 20 20 61 73  ex(p)!=0 );.  as
11e50 73 65 72 74 28 20 28 70 2d 3e 74 61 62 46 6c 61  sert( (p->tabFla
11e60 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61  gs & TF_HasPrima
11e70 72 79 4b 65 79 29 21 3d 30 0a 20 20 20 20 20 20  ryKey)!=0.      
11e80 20 7c 7c 20 28 70 2d 3e 69 50 4b 65 79 3c 30 20   || (p->iPKey<0 
11e90 26 26 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72  && sqlite3Primar
11ea0 79 4b 65 79 49 6e 64 65 78 28 70 29 3d 3d 30 29  yKeyIndex(p)==0)
11eb0 20 29 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61   );..  /* Specia
11ec0 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  l processing for
11ed0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 54   WITHOUT ROWID T
11ee0 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 74  ables */.  if( t
11ef0 61 62 4f 70 74 73 20 26 20 54 46 5f 57 69 74 68  abOpts & TF_With
11f00 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  outRowid ){.    
11f10 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73  if( (p->tabFlags
11f20 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
11f30 65 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ent) ){.      sq
11f40 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11f50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
11f60 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6e  "AUTOINCREMENT n
11f70 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 57 49  ot allowed on WI
11f80 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
11f90 65 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  es");.      retu
11fa0 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rn;.    }.    if
11fb0 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26  ( (p->tabFlags &
11fc0 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
11fd0 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  y)==0 ){.      s
11fe0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11ff0 50 61 72 73 65 2c 20 22 50 52 49 4d 41 52 59 20  Parse, "PRIMARY 
12000 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e 20 74  KEY missing on t
12010 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61  able %s", p->zNa
12020 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
12030 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  n;.    }.    p->
12040 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57  tabFlags |= TF_W
12050 69 74 68 6f 75 74 52 6f 77 69 64 20 7c 20 54 46  ithoutRowid | TF
12060 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b  _NoVisibleRowid;
12070 0a 20 20 20 20 63 6f 6e 76 65 72 74 54 6f 57 69  .    convertToWi
12080 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28  thoutRowidTable(
12090 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a  pParse, p);.  }.
120a0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
120b0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
120c0 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23   p->pSchema);..#
120d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
120e0 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65  IT_CHECK.  /* Re
120f0 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61  solve names in a
12100 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ll CHECK constra
12110 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  int expressions.
12120 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
12130 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c  Check ){.    sql
12140 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52  ite3ResolveSelfR
12150 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c  eference(pParse,
12160 20 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20   p, NC_IsCheck, 
12170 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20  0, p->pCheck);. 
12180 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
12190 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
121a0 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 23 69 66 6e  T_CHECK) */.#ifn
121b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
121c0 47 45 4e 45 52 41 54 45 44 5f 43 4f 4c 55 4d 4e  GENERATED_COLUMN
121d0 53 0a 20 20 69 66 28 20 70 2d 3e 74 61 62 46 6c  S.  if( p->tabFl
121e0 61 67 73 20 26 20 54 46 5f 48 61 73 47 65 6e 65  ags & TF_HasGene
121f0 72 61 74 65 64 20 29 7b 0a 20 20 20 20 69 6e 74  rated ){.    int
12200 20 69 69 3b 0a 20 20 20 20 74 65 73 74 63 61 73   ii;.    testcas
12210 65 28 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 26  e( p->tabFlags &
12220 20 54 46 5f 48 61 73 56 69 72 74 75 61 6c 20 29   TF_HasVirtual )
12230 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
12240 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  p->tabFlags & TF
12250 5f 48 61 73 53 74 6f 72 65 64 20 29 3b 0a 20 20  _HasStored );.  
12260 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
12270 2d 3e 6e 43 6f 6c 3b 20 69 69 2b 2b 29 7b 0a 20  ->nCol; ii++){. 
12280 20 20 20 20 20 75 33 32 20 63 6f 6c 46 6c 61 67       u32 colFlag
12290 73 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 69 5d 2e  s = p->aCol[ii].
122a0 63 6f 6c 46 6c 61 67 73 3b 0a 20 20 20 20 20 20  colFlags;.      
122b0 69 66 28 20 28 63 6f 6c 46 6c 61 67 73 20 26 20  if( (colFlags & 
122c0 43 4f 4c 46 4c 41 47 5f 47 45 4e 45 52 41 54 45  COLFLAG_GENERATE
122d0 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  D)!=0 ){.       
122e0 20 74 65 73 74 63 61 73 65 28 20 63 6f 6c 46 6c   testcase( colFl
122f0 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 56 49  ags & COLFLAG_VI
12300 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20  RTUAL );.       
12310 20 74 65 73 74 63 61 73 65 28 20 63 6f 6c 46 6c   testcase( colFl
12320 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 53 54  ags & COLFLAG_ST
12330 4f 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  ORED );.        
12340 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
12350 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72  lfReference(pPar
12360 73 65 2c 20 70 2c 20 4e 43 5f 47 65 6e 43 6f 6c  se, p, NC_GenCol
12370 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
12380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12390 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69         p->aCol[i
123a0 69 5d 2e 70 44 66 6c 74 2c 20 30 29 3b 0a 20 20  i].pDflt, 0);.  
123b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
123c0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 73 74  #endif..  /* Est
123d0 69 6d 61 74 65 20 74 68 65 20 61 76 65 72 61 67  imate the averag
123e0 65 20 72 6f 77 20 73 69 7a 65 20 66 6f 72 20 74  e row size for t
123f0 68 65 20 74 61 62 6c 65 20 61 6e 64 20 66 6f 72  he table and for
12400 20 61 6c 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64   all implied ind
12410 69 63 65 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61  ices */.  estima
12420 74 65 54 61 62 6c 65 57 69 64 74 68 28 70 29 3b  teTableWidth(p);
12430 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70  .  for(pIdx=p->p
12440 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
12450 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
12460 20 20 20 20 65 73 74 69 6d 61 74 65 49 6e 64 65      estimateInde
12470 78 57 69 64 74 68 28 70 49 64 78 29 3b 0a 20 20  xWidth(pIdx);.  
12480 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69  }..  /* If not i
12490 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65  nitializing, the
124a0 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72  n create a recor
124b0 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  d for the new ta
124c0 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ble.  ** in the 
124d0 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
124e0 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ble of the datab
124f0 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ase..  **.  ** I
12500 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
12510 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69  ORARY table, wri
12520 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74  te the entry int
12530 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a  o the auxiliary.
12540 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61    ** file instea
12550 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61  d of into the ma
12560 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
12570 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
12580 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
12590 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64     int n;.    Vd
125a0 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
125b0 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76  *zType;    /* "v
125c0 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20  iew" or "table" 
125d0 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  */.    char *zTy
125e0 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22  pe2;   /* "VIEW"
125f0 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20   or "TABLE" */. 
12600 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20     char *zStmt; 
12610 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68     /* Text of th
12620 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f  e CREATE TABLE o
12630 72 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  r CREATE VIEW st
12640 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20  atement */..    
12650 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
12660 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
12670 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
12680 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73  ) return;..    s
12690 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
126a0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29  (v, OP_Close, 0)
126b0 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a  ;..    /* .    *
126c0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79  * Initialize zTy
126d0 70 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76  pe for the new v
126e0 69 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20  iew or table..  
126f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
12700 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
12710 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72      /* A regular
12720 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
12730 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b  zType = "table";
12740 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20  .      zType2 = 
12750 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66  "TABLE";.#ifndef
12760 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
12770 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  W.    }else{.   
12780 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a     /* A view */.
12790 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76        zType = "v
127a0 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70  iew";.      zTyp
127b0 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e  e2 = "VIEW";.#en
127c0 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
127d0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43  * If this is a C
127e0 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41  REATE TABLE xx A
127f0 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78  S SELECT ..., ex
12800 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54  ecute the SELECT
12810 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
12820 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  t to populate th
12830 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65  e new table. The
12840 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
12850 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  r for the.    **
12860 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e   new table is in
12870 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65   register pParse
12880 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a  ->regRoot..    *
12890 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68  *.    ** Once th
128a0 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65  e SELECT has bee
128b0 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74  n coded by sqlit
128c0 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69  e3Select(), it i
128d0 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75  s in a.    ** su
128e0 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20  itable state to 
128f0 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f  query for the co
12900 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74  lumn names and t
12910 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a  ypes to be used.
12920 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65      ** by the ne
12930 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a  w table..    **.
12940 20 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d      ** A shared-
12950 63 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  cache write-lock
12960 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
12970 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
12980 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20   new table,.    
12990 2a 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c  ** as a schema-l
129a0 6f 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c  ock must have al
129b0 72 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69  ready been obtai
129c0 6e 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74  ned to create it
129d0 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61  . Since.    ** a
129e0 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63   schema-lock exc
129f0 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20  ludes all other 
12a00 64 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20  database users, 
12a10 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  the write-lock w
12a20 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72  ould.    ** be r
12a30 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f  edundant..    */
12a40 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
12a50 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   ){.      Select
12a60 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 2f 2a  Dest dest;    /*
12a70 20 57 68 65 72 65 20 74 68 65 20 53 45 4c 45 43   Where the SELEC
12a80 54 20 73 68 6f 75 6c 64 20 73 74 6f 72 65 20 72  T should store r
12a90 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20  esults */.      
12aa0 69 6e 74 20 72 65 67 59 69 65 6c 64 3b 20 20 20  int regYield;   
12ab0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
12ac0 68 6f 6c 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69  holding co-routi
12ad0 6e 65 20 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a  ne entry-point *
12ae0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
12af0 54 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  Top;        /* T
12b00 6f 70 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75  op of the co-rou
12b10 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tine */.      in
12b20 74 20 72 65 67 52 65 63 3b 20 20 20 20 20 20 20  t regRec;       
12b30 20 20 2f 2a 20 41 20 72 65 63 6f 72 64 20 74 6f    /* A record to
12b40 20 62 65 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   be insert into 
12b50 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f  the new table */
12b60 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 6f  .      int regRo
12b70 77 69 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f  wid;       /* Ro
12b80 77 69 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20  wid of the next 
12b90 72 6f 77 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f  row to insert */
12ba0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49  .      int addrI
12bb0 6e 73 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 6f  nsLoop;    /* To
12bc0 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  p of the loop fo
12bd0 72 20 69 6e 73 65 72 74 69 6e 67 20 72 6f 77 73  r inserting rows
12be0 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
12bf0 2a 70 53 65 6c 54 61 62 3b 20 20 20 20 20 2f 2a  *pSelTab;     /*
12c00 20 41 20 74 61 62 6c 65 20 74 68 61 74 20 64 65   A table that de
12c10 73 63 72 69 62 65 73 20 74 68 65 20 53 45 4c 45  scribes the SELE
12c20 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20  CT results */.. 
12c30 20 20 20 20 20 72 65 67 59 69 65 6c 64 20 3d 20       regYield = 
12c40 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
12c50 20 20 20 20 20 20 72 65 67 52 65 63 20 3d 20 2b        regRec = +
12c60 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
12c70 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20       regRowid = 
12c80 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
12c90 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
12ca0 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20  rse->nTab==1);. 
12cb0 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41       sqlite3MayA
12cc0 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
12cd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12ce0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
12cf0 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65  Write, 1, pParse
12d00 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b  ->regRoot, iDb);
12d10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12d20 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
12d30 46 4c 41 47 5f 50 32 49 53 52 45 47 29 3b 0a 20  FLAG_P2ISREG);. 
12d40 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
12d50 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 61 64 64  b = 2;.      add
12d60 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
12d70 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
12d80 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   + 1;.      sqli
12d90 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
12da0 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
12db0 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20  e, regYield, 0, 
12dc0 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20  addrTop);.      
12dd0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
12de0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
12df0 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
12e00 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
12e10 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
12e20 65 63 74 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  ect, SQLITE_AFF_
12e30 42 4c 4f 42 29 3b 0a 20 20 20 20 20 20 69 66 28  BLOB);.      if(
12e40 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65   pSelTab==0 ) re
12e50 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 73 73 65  turn;.      asse
12e60 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29  rt( p->aCol==0 )
12e70 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20  ;.      p->nCol 
12e80 3d 20 70 2d 3e 6e 4e 56 43 6f 6c 20 3d 20 70 53  = p->nNVCol = pS
12e90 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
12ea0 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65     p->aCol = pSe
12eb0 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
12ec0 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
12ed0 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  = 0;.      pSelT
12ee0 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
12ef0 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
12f00 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54  eTable(db, pSelT
12f10 61 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ab);.      sqlit
12f20 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
12f30 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f  (&dest, SRT_Coro
12f40 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29  utine, regYield)
12f50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
12f60 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
12f70 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20  elect, &dest);. 
12f80 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
12f90 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
12fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12fb0 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c  eEndCoroutine(v,
12fc0 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20   regYield);.    
12fd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
12fe0 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
12ff0 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 61 64 64   - 1);.      add
13000 72 49 6e 73 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  rInsLoop = sqlit
13010 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
13020 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e 69  OP_Yield, dest.i
13030 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 56  SDParm);.      V
13040 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
13050 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13060 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
13070 6b 65 52 65 63 6f 72 64 2c 20 64 65 73 74 2e 69  keRecord, dest.i
13080 53 64 73 74 2c 20 64 65 73 74 2e 6e 53 64 73 74  Sdst, dest.nSdst
13090 2c 20 72 65 67 52 65 63 29 3b 0a 20 20 20 20 20  , regRec);.     
130a0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66   sqlite3TableAff
130b0 69 6e 69 74 79 28 76 2c 20 70 2c 20 30 29 3b 0a  inity(v, p, 0);.
130c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
130d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
130e0 77 52 6f 77 69 64 2c 20 31 2c 20 72 65 67 52 6f  wRowid, 1, regRo
130f0 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
13100 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
13110 20 4f 50 5f 49 6e 73 65 72 74 2c 20 31 2c 20 72   OP_Insert, 1, r
13120 65 67 52 65 63 2c 20 72 65 67 52 6f 77 69 64 29  egRec, regRowid)
13130 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
13140 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 49  dbeGoto(v, addrI
13150 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73  nsLoop);.      s
13160 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
13170 72 65 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f  re(v, addrInsLoo
13180 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
13190 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
131a0 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20  P_Close, 1);.   
131b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75   }..    /* Compu
131c0 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  te the complete 
131d0 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
131e0 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  TE statement */.
131f0 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
13200 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  ){.      zStmt =
13210 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74   createTableStmt
13220 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c  (db, p);.    }el
13230 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20  se{.      Token 
13240 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f 70 74 73  *pEnd2 = tabOpts
13250 20 3f 20 26 70 50 61 72 73 65 2d 3e 73 4c 61 73   ? &pParse->sLas
13260 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20  tToken : pEnd;. 
13270 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70       n = (int)(p
13280 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65  End2->z - pParse
13290 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b  ->sNameToken.z);
132a0 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 64 32  .      if( pEnd2
132b0 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20  ->z[0]!=';' ) n 
132c0 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20  += pEnd2->n;.   
132d0 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
132e0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20  e3MPrintf(db, . 
132f0 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
13300 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65   %s %.*s", zType
13310 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e  2, n, pParse->sN
13320 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20  ameToken.z.     
13330 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   );.    }..    /
13340 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65  * A slot for the
13350 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65   record has alre
13360 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
13370 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a  ed in the .    *
13380 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  * SQLITE_MASTER 
13390 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20  table.  We just 
133a0 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20 74  need to update t
133b0 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c  hat slot with al
133c0 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66  l.    ** the inf
133d0 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63  ormation we've c
133e0 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f  ollected..    */
133f0 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
13400 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
13410 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51        "UPDATE %Q
13420 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22  .%s ".         "
13430 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e  SET type='%s', n
13440 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65  ame=%Q, tbl_name
13450 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25  =%Q, rootpage=#%
13460 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20  d, sql=%Q ".    
13470 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d     "WHERE rowid=
13480 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e  #%d",.      db->
13490 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
134a0 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a  e, MASTER_NAME,.
134b0 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20        zType,.   
134c0 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
134d0 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
134e0 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f     pParse->regRo
134f0 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c  ot,.      zStmt,
13500 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
13510 65 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20  egRowid.    );. 
13520 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
13530 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20  (db, zStmt);.   
13540 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
13550 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
13560 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
13570 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
13580 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65  EMENT.    /* Che
13590 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
135a0 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  need to create a
135b0 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  n sqlite_sequenc
135c0 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20  e table for.    
135d0 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b  ** keeping track
135e0 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   of autoincremen
135f0 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20  t keys..    */. 
13600 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c     if( (p->tabFl
13610 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
13620 72 65 6d 65 6e 74 29 21 3d 30 20 29 7b 0a 20 20  rement)!=0 ){.  
13630 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
13640 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20  b->aDb[iDb];.   
13650 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
13660 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
13670 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
13680 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
13690 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62  pSchema->pSeqTab
136a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
136b0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
136c0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
136d0 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
136e0 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75  E %Q.sqlite_sequ
136f0 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c  ence(name,seq)",
13700 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
13710 7a 44 62 53 4e 61 6d 65 0a 20 20 20 20 20 20 20  zDbSName.       
13720 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
13730 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
13740 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74 68   Reparse everyth
13750 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75  ing to update ou
13760 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20  r internal data 
13770 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20  structures */.  
13780 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13790 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c  ParseSchemaOp(v,
137a0 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
137b0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
137c0 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25  db, "tbl_name='%
137d0 71 27 20 41 4e 44 20 74 79 70 65 21 3d 27 74 72  q' AND type!='tr
137e0 69 67 67 65 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d  igger'", p->zNam
137f0 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  e));.  }...  /* 
13800 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f  Add the table to
13810 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
13820 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
13830 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
13840 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
13850 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54  it.busy ){.    T
13860 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
13870 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
13880 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  = p->pSchema;.  
13890 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
138a0 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
138b0 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
138c0 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
138d0 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53  e3HashInsert(&pS
138e0 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
138f0 70 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a 20 20  p->zName, p);.  
13900 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20    if( pOld ){.  
13910 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
13920 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  Old );  /* Mallo
13930 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
13940 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e  ed inside HashIn
13950 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  sert() */.      
13960 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
13970 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  db);.      retur
13980 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  n;.    }.    pPa
13990 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
139a0 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46   0;.    db->mDbF
139b0 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53  lags |= DBFLAG_S
139c0 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 0a 23 69  chemaChange;..#i
139d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
139e0 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20  T_ALTERTABLE.   
139f0 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74   if( !p->pSelect
13a00 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
13a10 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63  char *zName = (c
13a20 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61 72  onst char *)pPar
13a30 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
13a40 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d  ;.      int nNam
13a50 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
13a60 20 21 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f   !pSelect && pCo
13a70 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20  ns && pEnd );.  
13a80 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a      if( pCons->z
13a90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
13aa0 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20  Cons = pEnd;.   
13ab0 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65     }.      nName
13ac0 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73 74 20   = (int)((const 
13ad0 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20  char *)pCons->z 
13ae0 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  - zName);.      
13af0 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20  p->addColOffset 
13b00 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33 55 74  = 13 + sqlite3Ut
13b10 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c  f8CharLen(zName,
13b20 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23   nName);.    }.#
13b30 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66  endif.  }.}..#if
13b40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13b50 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20  _VIEW./*.** The 
13b60 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
13b70 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64  s routine in ord
13b80 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  er to create a n
13b90 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20  ew VIEW.*/.void 
13ba0 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65  sqlite3CreateVie
13bb0 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
13bc0 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70  se,     /* The p
13bd0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
13be0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69  /.  Token *pBegi
13bf0 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52  n,     /* The CR
13c00 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
13c10 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65  begins the state
13c20 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
13c30 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20  *pName1,     /* 
13c40 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
13c50 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
13c60 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54   the view */.  T
13c70 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
13c80 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74    /* The token t
13c90 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
13ca0 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a  me of the view *
13cb0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43  /.  ExprList *pC
13cc0 4e 61 6d 65 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e  Names, /* Option
13cd0 61 6c 20 6c 69 73 74 20 6f 66 20 76 69 65 77 20  al list of view 
13ce0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
13cf0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
13d00 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54  t,   /* A SELECT
13d10 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
13d20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
13d30 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  new view */.  in
13d40 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20  t isTemp,       
13d50 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54   /* TRUE for a T
13d60 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f  EMPORARY view */
13d70 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20  .  int noErr    
13d80 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73        /* Suppres
13d90 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  s error messages
13da0 20 69 66 20 56 49 45 57 20 61 6c 72 65 61 64 79   if VIEW already
13db0 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
13dc0 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
13dd0 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n;.  const char 
13de0 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64  *z;.  Token sEnd
13df0 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  ;.  DbFixer sFix
13e00 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  ;.  Token *pName
13e10 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b   = 0;.  int iDb;
13e20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
13e30 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
13e40 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  if( pParse->nVar
13e50 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
13e60 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13e70 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20 61 72  , "parameters ar
13e80 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e  e not allowed in
13e90 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20 67 6f   views");.    go
13ea0 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66  to create_view_f
13eb0 61 69 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ail;.  }.  sqlit
13ec0 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50 61  e3StartTable(pPa
13ed0 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
13ee0 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20  me2, isTemp, 1, 
13ef0 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d  0, noErr);.  p =
13f00 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
13f10 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
13f20 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
13f30 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65   goto create_vie
13f40 77 5f 66 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65  w_fail;.  sqlite
13f50 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
13f60 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
13f70 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
13f80 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
13f90 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
13fa0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71  ->pSchema);.  sq
13fb0 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
13fc0 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
13fd0 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 3b   "view", pName);
13fe0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
13ff0 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70  xSelect(&sFix, p
14000 53 65 6c 65 63 74 29 20 29 20 67 6f 74 6f 20 63  Select) ) goto c
14010 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b  reate_view_fail;
14020 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f  ..  /* Make a co
14030 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  py of the entire
14040 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
14050 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
14060 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68  he view..  ** Th
14070 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c  is will force al
14080 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e  l the Expr.token
14090 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  .z values to be 
140a0 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a  dynamically.  **
140b0 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65   allocated rathe
140c0 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20  r than point to 
140d0 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67  the input string
140e0 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74   - which means t
140f0 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69  hat.  ** they wi
14100 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72  ll persist after
14110 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c   the current sql
14120 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c  ite3_exec() call
14130 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20   returns..  */. 
14140 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
14150 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 70 2d 3e  BJECT ){.    p->
14160 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
14170 74 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d  t;.    pSelect =
14180 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
14190 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71   p->pSelect = sq
141a0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
141b0 62 2c 20 70 53 65 6c 65 63 74 2c 20 45 58 50 52  b, pSelect, EXPR
141c0 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 7d  DUP_REDUCE);.  }
141d0 0a 20 20 70 2d 3e 70 43 68 65 63 6b 20 3d 20 73  .  p->pCheck = s
141e0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
141f0 70 28 64 62 2c 20 70 43 4e 61 6d 65 73 2c 20 45  p(db, pCNames, E
14200 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
14210 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
14220 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 63 72  Failed ) goto cr
14230 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a  eate_view_fail;.
14240 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
14250 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
14260 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
14270 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f  t.  Make sEnd po
14280 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  int to.  ** the 
14290 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64  end..  */.  sEnd
142a0 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74   = pParse->sLast
142b0 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28  Token;.  assert(
142c0 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 7c 7c   sEnd.z[0]!=0 ||
142d0 20 73 45 6e 64 2e 6e 3d 3d 30 20 29 3b 0a 20 20   sEnd.n==0 );.  
142e0 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27  if( sEnd.z[0]!='
142f0 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a  ;' ){.    sEnd.z
14300 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a   += sEnd.n;.  }.
14310 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20    sEnd.n = 0;.  
14320 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a  n = (int)(sEnd.z
14330 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20   - pBegin->z);. 
14340 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a   assert( n>0 );.
14350 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b    z = pBegin->z;
14360 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65  .  while( sqlite
14370 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29  3Isspace(z[n-1])
14380 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e   ){ n--; }.  sEn
14390 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20  d.z = &z[n-1];. 
143a0 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20   sEnd.n = 1;..  
143b0 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e  /* Use sqlite3En
143c0 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20  dTable() to add 
143d0 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20  the view to the 
143e0 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
143f0 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
14400 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  EndTable(pParse,
14410 20 30 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30 29   0, &sEnd, 0, 0)
14420 3b 0a 0a 63 72 65 61 74 65 5f 76 69 65 77 5f 66  ;..create_view_f
14430 61 69 6c 3a 0a 20 20 73 71 6c 69 74 65 33 53 65  ail:.  sqlite3Se
14440 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
14450 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 49  Select);.  if( I
14460 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
14470 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
14480 6e 61 6d 65 45 78 70 72 6c 69 73 74 55 6e 6d 61  nameExprlistUnma
14490 70 28 70 50 61 72 73 65 2c 20 70 43 4e 61 6d 65  p(pParse, pCName
144a0 73 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  s);.  }.  sqlite
144b0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
144c0 64 62 2c 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20  db, pCNames);.  
144d0 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66  return;.}.#endif
144e0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
144f0 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65  VIEW */..#if !de
14500 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14510 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
14520 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
14530 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a  VIRTUALTABLE)./*
14540 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
14550 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69  ructure pTable i
14560 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e  s really a VIEW.
14570 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61    Fill in the na
14580 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f  mes of.** the co
14590 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65  lumns of the vie
145a0 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20  w in the pTable 
145b0 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75  structure.  Retu
145c0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  rn the number.**
145d0 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
145e0 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e  an error is seen
145f0 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
14600 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
14610 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69  e->zErrMsg..*/.i
14620 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  nt sqlite3ViewGe
14630 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72  tColumnNames(Par
14640 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
14650 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61  e *pTable){.  Ta
14660 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20  ble *pSelTab;   
14670 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20  /* A fake table 
14680 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65  from which we ge
14690 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  t the result set
146a0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
146b0 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  el;     /* Copy 
146c0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 74 68  of the SELECT th
146d0 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
146e0 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  e view */.  int 
146f0 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a  nErr = 0;     /*
14700 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   Number of error
14710 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f  s encountered */
14720 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
14730 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
14740 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75  ily holds the nu
14750 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
14760 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71  assigned */.  sq
14770 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
14780 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
14790 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
147a0 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  for malloc error
147b0 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  s */.#ifndef SQL
147c0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
147d0 54 41 42 4c 45 0a 20 20 69 6e 74 20 72 63 3b 0a  TABLE.  int rc;.
147e0 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
147f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
14800 52 49 5a 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74  RIZATION.  sqlit
14810 65 33 5f 78 61 75 74 68 20 78 41 75 74 68 3b 20  e3_xauth xAuth; 
14820 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 78        /* Saved x
14830 41 75 74 68 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  Auth pointer */.
14840 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
14850 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66  ( pTable );..#if
14860 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14870 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
14880 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 2b  db->nSchemaLock+
14890 2b 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  +;.  rc = sqlite
148a0 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74  3VtabCallConnect
148b0 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29  (pParse, pTable)
148c0 3b 0a 20 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c  ;.  db->nSchemaL
148d0 6f 63 6b 2d 2d 3b 0a 20 20 69 66 28 20 72 63 20  ock--;.  if( rc 
148e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
148f0 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72  .  }.  if( IsVir
14900 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72  tual(pTable) ) r
14910 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
14920 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14930 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41  OMIT_VIEW.  /* A
14940 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d   positive nCol m
14950 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73  eans the columns
14960 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20   names for this 
14970 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c  view are.  ** al
14980 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a  ready known..  *
14990 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
149a0 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20  nCol>0 ) return 
149b0 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74  0;..  /* A negat
149c0 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70  ive nCol is a sp
149d0 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61  ecial marker mea
149e0 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65  ning that we are
149f0 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20   currently.  ** 
14a00 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74  trying to comput
14a10 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
14a20 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72  es.  If we enter
14a30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
14a40 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69  th.  ** a negati
14a50 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e  ve nCol, it mean
14a60 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69  s two or more vi
14a70 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c  ews form a loop,
14a80 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a   like this:.  **
14a90 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
14aa0 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c   VIEW one AS SEL
14ab0 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a  ECT * FROM two;.
14ac0 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
14ad0 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45  VIEW two AS SELE
14ae0 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20  CT * FROM one;. 
14af0 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
14b00 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61 62 6f  y, the error abo
14b10 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74  ve is now caught
14b20 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69   prior to reachi
14b30 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20  ng this point.. 
14b40 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f 6c 6c   ** But the foll
14b50 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20 73 74  owing test is st
14b60 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61 73  ill important as
14b70 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20 75 70   it does come up
14b80 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c  .  ** in the fol
14b90 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20  lowing:.  ** .  
14ba0 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
14bb0 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b  BLE main.ex1(a);
14bc0 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
14bd0 20 54 45 4d 50 20 56 49 45 57 20 65 78 31 20 41   TEMP VIEW ex1 A
14be0 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20  S SELECT a FROM 
14bf0 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45  ex1;.  **     SE
14c00 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70  LECT * FROM temp
14c10 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28  .ex1;.  */.  if(
14c20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20   pTable->nCol<0 
14c30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
14c40 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
14c50 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63 75  view %s is circu
14c60 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20  larly defined", 
14c70 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
14c80 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
14c90 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  }.  assert( pTab
14ca0 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a  le->nCol>=0 );..
14cb0 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
14cc0 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
14cd0 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d  s we need to com
14ce0 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e  pute the table n
14cf0 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20  ames..  ** Note 
14d00 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f  that the call to
14d10 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
14d20 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c  tOfSelect() will
14d30 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a   expand any.  **
14d40 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e   "*" elements in
14d50 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65 74   the results set
14d60 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e 64   of the view and
14d70 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72   will assign cur
14d80 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  sors.  ** to the
14d90 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
14da0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42   FROM clause.  B
14db0 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e  ut we do not wan
14dc0 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a  t these changes.
14dd0 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61    ** to be perma
14de0 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f  nent.  So the co
14df0 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e  mputation is don
14e00 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74  e on a copy of t
14e10 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73  he SELECT.  ** s
14e20 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
14e30 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
14e40 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
14e50 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
14e60 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74  ;.  pSel = sqlit
14e70 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
14e80 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c  pTable->pSelect,
14e90 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20   0);.  if( pSel 
14ea0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
14eb0 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c  E_OMIT_ALTERTABL
14ec0 45 0a 20 20 20 20 75 38 20 65 50 61 72 73 65 4d  E.    u8 eParseM
14ed0 6f 64 65 20 3d 20 70 50 61 72 73 65 2d 3e 65 50  ode = pParse->eP
14ee0 61 72 73 65 4d 6f 64 65 3b 0a 20 20 20 20 70 50  arseMode;.    pP
14ef0 61 72 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65  arse->eParseMode
14f00 20 3d 20 50 41 52 53 45 5f 4d 4f 44 45 5f 4e 4f   = PARSE_MODE_NO
14f10 52 4d 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  RMAL;.#endif.   
14f20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61   n = pParse->nTa
14f30 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72  b;.    sqlite3Sr
14f40 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
14f50 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  rs(pParse, pSel-
14f60 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62  >pSrc);.    pTab
14f70 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  le->nCol = -1;. 
14f80 20 20 20 44 69 73 61 62 6c 65 4c 6f 6f 6b 61 73     DisableLookas
14f90 69 64 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ide;.#ifndef SQL
14fa0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
14fb0 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68  ZATION.    xAuth
14fc0 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20   = db->xAuth;.  
14fd0 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b    db->xAuth = 0;
14fe0 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73  .    pSelTab = s
14ff0 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
15000 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
15010 70 53 65 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46  pSel, SQLITE_AFF
15020 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 64 62 2d 3e  _NONE);.    db->
15030 78 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23  xAuth = xAuth;.#
15040 65 6c 73 65 0a 20 20 20 20 70 53 65 6c 54 61 62  else.    pSelTab
15050 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
15060 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
15070 73 65 2c 20 70 53 65 6c 2c 20 53 51 4c 49 54 45  se, pSel, SQLITE
15080 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 23 65 6e 64  _AFF_NONE);.#end
15090 69 66 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  if.    pParse->n
150a0 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28  Tab = n;.    if(
150b0 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 20   pTable->pCheck 
150c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 52 45 41  ){.      /* CREA
150d0 54 45 20 56 49 45 57 20 6e 61 6d 65 28 61 72 67  TE VIEW name(arg
150e0 6c 69 73 74 29 20 41 53 20 2e 2e 2e 0a 20 20 20  list) AS ....   
150f0 20 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65 73 20     ** The names 
15100 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69  of the columns i
15110 6e 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  n the table are 
15120 74 61 6b 65 6e 20 66 72 6f 6d 0a 20 20 20 20 20  taken from.     
15130 20 2a 2a 20 61 72 67 6c 69 73 74 20 77 68 69 63   ** arglist whic
15140 68 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  h is stored in p
15150 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 2e 20 20  Table->pCheck.  
15160 54 68 65 20 70 43 68 65 63 6b 20 66 69 65 6c 64  The pCheck field
15170 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c  .      ** normal
15180 6c 79 20 68 6f 6c 64 73 20 43 48 45 43 4b 20 63  ly holds CHECK c
15190 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 61 6e  onstraints on an
151a0 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 2c   ordinary table,
151b0 20 62 75 74 20 66 6f 72 0a 20 20 20 20 20 20 2a   but for.      *
151c0 2a 20 61 20 56 49 45 57 20 69 74 20 68 6f 6c 64  * a VIEW it hold
151d0 73 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f  s the list of co
151e0 6c 75 6d 6e 20 6e 61 6d 65 73 2e 0a 20 20 20 20  lumn names..    
151f0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
15200 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
15210 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 54  rList(pParse, pT
15220 61 62 6c 65 2d 3e 70 43 68 65 63 6b 2c 20 0a 20  able->pCheck, . 
15230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15250 26 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26  &pTable->nCol, &
15260 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20  pTable->aCol);. 
15270 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
15280 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20  locFailed==0 .  
15290 20 20 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e       && pParse->
152a0 6e 45 72 72 3d 3d 30 0a 20 20 20 20 20 20 20 26  nErr==0.       &
152b0 26 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d  & pTable->nCol==
152c0 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSel->pEList->nE
152d0 78 70 72 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  xpr.      ){.   
152e0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
152f0 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
15300 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72  ndCollation(pPar
15310 73 65 2c 20 70 54 61 62 6c 65 2c 20 70 53 65 6c  se, pTable, pSel
15320 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15350 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
15360 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
15370 65 6c 73 65 20 69 66 28 20 70 53 65 6c 54 61 62  else if( pSelTab
15380 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 52 45   ){.      /* CRE
15390 41 54 45 20 56 49 45 57 20 6e 61 6d 65 20 41 53  ATE VIEW name AS
153a0 2e 2e 2e 20 20 77 69 74 68 6f 75 74 20 61 6e 20  ...  without an 
153b0 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 2e 20 20  argument list.  
153c0 43 6f 6e 73 74 72 75 63 74 0a 20 20 20 20 20 20  Construct.      
153d0 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ** the column na
153e0 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 53 45 4c  mes from the SEL
153f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
15400 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
15410 69 65 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  iew..      */.  
15420 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
15430 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20  le->aCol==0 );. 
15440 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f       pTable->nCo
15450 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 6e 4e 56 43  l = pTable->nNVC
15460 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
15470 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65  ol;.      pTable
15480 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
15490 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53  ->aCol;.      pS
154a0 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
154b0 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  .      pSelTab->
154c0 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
154d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
154e0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
154f0 62 2c 20 30 2c 20 70 54 61 62 6c 65 2d 3e 70 53  b, 0, pTable->pS
15500 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 7d 65  chema) );.    }e
15510 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 6c  lse{.      pTabl
15520 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  e->nCol = 0;.   
15530 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d     nErr++;.    }
15540 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
15550 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c  teTable(db, pSel
15560 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Tab);.    sqlite
15570 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
15580 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 45 6e 61  , pSel);.    Ena
15590 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 3b 0a 23 69  bleLookaside;.#i
155a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
155b0 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20  T_ALTERTABLE.   
155c0 20 70 50 61 72 73 65 2d 3e 65 50 61 72 73 65 4d   pParse->eParseM
155d0 6f 64 65 20 3d 20 65 50 61 72 73 65 4d 6f 64 65  ode = eParseMode
155e0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 20 65 6c 73  ;.#endif.  } els
155f0 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  e {.    nErr++;.
15600 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53    }.  pTable->pS
15610 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61  chema->schemaFla
15620 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74  gs |= DB_Unreset
15630 56 69 65 77 73 3b 0a 20 20 69 66 28 20 64 62 2d  Views;.  if( db-
15640 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
15650 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
15660 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62  teColumnNames(db
15670 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  , pTable);.    p
15680 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b  Table->aCol = 0;
15690 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
156a0 6c 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  l = 0;.  }.#endi
156b0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
156c0 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72  _VIEW */.  retur
156d0 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64  n nErr;  .}.#end
156e0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
156f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
15700 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
15710 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
15720 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64  TABLE) */..#ifnd
15730 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
15740 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  IEW./*.** Clear 
15750 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
15760 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57   from every VIEW
15770 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78   in database idx
15780 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15790 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
157a0 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  All(sqlite3 *db,
157b0 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73   int idx){.  Has
157c0 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65  hElem *i;.  asse
157d0 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
157e0 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
157f0 64 78 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20  dx, 0) );.  if( 
15800 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64  !DbHasProperty(d
15810 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73  b, idx, DB_Unres
15820 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72  etViews) ) retur
15830 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  n;.  for(i=sqlit
15840 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
15850 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61  aDb[idx].pSchema
15860 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d  ->tblHash); i;i=
15870 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
15880 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
15890 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
158a0 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28  Data(i);.    if(
158b0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
158c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
158d0 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
158e0 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
158f0 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30    pTab->aCol = 0
15900 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43  ;.      pTab->nC
15910 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ol = 0;.    }.  
15920 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65  }.  DbClearPrope
15930 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
15940 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d  UnresetViews);.}
15950 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
15960 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
15970 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f  ll(A,B).#endif /
15980 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
15990 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  EW */../*.** Thi
159a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
159b0 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45  lled by the VDBE
159c0 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69   to adjust the i
159d0 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
159e0 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65  * used by SQLite
159f0 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20   when the btree 
15a00 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61  layer moves a ta
15a10 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54  ble root page. T
15a20 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20  he.** root-page 
15a30 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
15a40 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20  dex in database 
15a50 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20  iDb has changed 
15a60 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f  from iFrom.** to
15a70 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b   iTo..**.** Tick
15a80 65 74 20 23 31 37 32 38 3a 20 20 54 68 65 20 73  et #1728:  The s
15a90 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68  ymbol table migh
15aa0 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  t still contain 
15ab0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f  information.** o
15ac0 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20  n tables and/or 
15ad0 69 6e 64 69 63 65 73 20 74 68 61 74 20 61 72 65  indices that are
15ae0 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20   the process of 
15af0 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a  being deleted..*
15b00 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c  * If you are unl
15b10 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f  ucky, one of tho
15b20 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  se deleted indic
15b30 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67  es or tables mig
15b40 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73  ht.** have the s
15b50 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d  ame rootpage num
15b60 62 65 72 20 61 73 20 74 68 65 20 72 65 61 6c 20  ber as the real 
15b70 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
15b80 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20  hat is.** being 
15b90 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61  moved.  So we ca
15ba0 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68  nnot stop search
15bb0 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 66 69  ing after the fi
15bc0 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65  rst match .** be
15bd0 63 61 75 73 65 20 74 68 65 20 66 69 72 73 74 20  cause the first 
15be0 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65 20 66  match might be f
15bf0 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65  or one of the de
15c00 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a  leted indices.**
15c10 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e   or tables and n
15c20 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64  ot the table/ind
15c30 65 78 20 74 68 61 74 20 69 73 20 61 63 74 75 61  ex that is actua
15c40 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e  lly being moved.
15c50 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74  .** We must cont
15c60 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74  inue looping unt
15c70 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e  il all tables an
15c80 64 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a  d indices with.*
15c90 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f  * rootpage==iFro
15ca0 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76  m have been conv
15cb0 65 72 74 65 64 20 74 6f 20 68 61 76 65 20 61 20  erted to have a 
15cc0 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a  rootpage of iTo.
15cd0 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ** in order to b
15ce0 65 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 77  e certain that w
15cf0 65 20 67 6f 74 20 74 68 65 20 72 69 67 68 74 20  e got the right 
15d00 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  one..*/.#ifndef 
15d10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
15d20 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69  VACUUM.void sqli
15d30 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64  te3RootPageMoved
15d40 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
15d50 74 20 69 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d  t iDb, int iFrom
15d60 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61  , int iTo){.  Ha
15d70 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20  shElem *pElem;. 
15d80 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20   Hash *pHash;.  
15d90 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65  Db *pDb;..  asse
15da0 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
15db0 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
15dc0 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 44 62 20  Db, 0) );.  pDb 
15dd0 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
15de0 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d  .  pHash = &pDb-
15df0 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
15e00 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  h;.  for(pElem=s
15e10 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
15e20 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
15e30 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
15e40 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
15e50 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
15e60 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
15e70 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  em);.    if( pTa
15e80 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  b->tnum==iFrom )
15e90 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e  {.      pTab->tn
15ea0 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a  um = iTo;.    }.
15eb0 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70    }.  pHash = &p
15ec0 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db->pSchema->idx
15ed0 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65  Hash;.  for(pEle
15ee0 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
15ef0 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  t(pHash); pElem;
15f00 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
15f10 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
15f20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
15f30 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
15f40 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
15f50 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f  pIdx->tnum==iFro
15f60 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  m ){.      pIdx-
15f70 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20  >tnum = iTo;.   
15f80 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
15f90 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64  ./*.** Write cod
15fa0 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74  e to erase the t
15fb0 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
15fc0 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20  age iTable from 
15fd0 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a  database iDb..**
15fe0 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65   Also write code
15ff0 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73   to modify the s
16000 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
16010 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  le and internal 
16020 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72  schema.** if a r
16030 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74  oot-page of anot
16040 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
16050 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d  ed by the btree-
16060 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20  layer whilst.** 
16070 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28  erasing iTable (
16080 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
16090 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
160a0 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
160b0 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  / .static void d
160c0 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50  estroyRootPage(P
160d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
160e0 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44  t iTable, int iD
160f0 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
16100 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
16110 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31  Parse);.  int r1
16120 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
16130 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
16140 69 66 28 20 69 54 61 62 6c 65 3c 32 20 29 20 73  if( iTable<2 ) s
16150 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16160 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74 20  Parse, "corrupt 
16170 73 63 68 65 6d 61 22 29 3b 0a 20 20 73 71 6c 69  schema");.  sqli
16180 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16190 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61   OP_Destroy, iTa
161a0 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20  ble, r1, iDb);. 
161b0 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
161c0 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
161d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
161e0 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50  TOVACUUM.  /* OP
161f0 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20  _Destroy stores 
16200 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31  an in integer r1
16210 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65  . If this intege
16220 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  r.  ** is non-ze
16230 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
16240 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
16250 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d  ber of a table m
16260 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63  oved to.  ** loc
16270 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68  ation iTable. Th
16280 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
16290 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71   modifies the sq
162a0 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
162b0 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63  e to.  ** reflec
162c0 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a  t this..  **.  *
162d0 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20  * The "#NNN" in 
162e0 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65  the SQL is a spe
162f0 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68  cial constant th
16300 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65  at means whateve
16310 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20  r value.  ** is 
16320 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e  in register NNN.
16330 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75    See grammar ru
16340 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  les associated w
16350 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53  ith the TK_REGIS
16360 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66  TER.  ** token f
16370 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
16380 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  formation..  */.
16390 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
163a0 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
163b0 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
163c0 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64   SET rootpage=%d
163d0 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72   WHERE #%d AND r
163e0 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20  ootpage=#%d",.  
163f0 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
16400 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
16410 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 69  , MASTER_NAME, i
16420 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a  Table, r1, r1);.
16430 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
16440 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
16450 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f  Parse, r1);.}../
16460 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20  *.** Write VDBE 
16470 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61  code to erase ta
16480 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c  ble pTab and all
16490 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69   associated indi
164a0 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20  ces on disk..** 
164b0 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74  Code to update t
164c0 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
164d0 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65   tables and inte
164e0 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69  rnal schema defi
164f0 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61  nitions.** in ca
16500 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62  se a root-page b
16510 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74  elonging to anot
16520 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
16530 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
16540 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f  layer.** is also
16550 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e   added (this can
16560 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
16570 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
16580 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  base)..*/.static
16590 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62   void destroyTab
165a0 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
165b0 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  , Table *pTab){.
165c0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
165d0 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f  base may be auto
165e0 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20  -vacuum capable 
165f0 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  (if SQLITE_OMIT_
16600 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20  AUTOVACUUM.  ** 
16610 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c  is not defined),
16620 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f   then it is impo
16630 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50  rtant to call OP
16640 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a  _Destroy on the.
16650 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69    ** table and i
16660 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20  ndex root-pages 
16670 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69  in order, starti
16680 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65  ng with the nume
16690 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61  rically .  ** la
166a0 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
166b0 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61  number. This gua
166c0 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e  rantees that non
166d0 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61  e of the root-pa
166e0 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64  ges.  ** to be d
166f0 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f  estroyed is relo
16700 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c  cated by an earl
16710 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20  ier OP_Destroy. 
16720 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a  i.e. if the.  **
16730 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20   following were 
16740 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  coded:.  **.  **
16750 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a   OP_Destroy 4 0.
16760 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50    ** ....  ** OP
16770 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a  _Destroy 5 0.  *
16780 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20  *.  ** and root 
16790 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20  page 5 happened 
167a0 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73  to be the larges
167b0 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
167c0 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64  er in the.  ** d
167d0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f  atabase, then ro
167e0 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20  ot page 5 would 
167f0 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65  be moved to page
16800 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20   4 by the .  ** 
16810 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22  "OP_Destroy 4 0"
16820 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62   opcode. The sub
16830 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74  sequent "OP_Dest
16840 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68  roy 5 0" would h
16850 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c  it.  ** a free-l
16860 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  ist page..  */. 
16870 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62   int iTab = pTab
16880 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44  ->tnum;.  int iD
16890 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20  estroyed = 0;.. 
168a0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
168b0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
168c0 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d    int iLargest =
168d0 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65   0;..    if( iDe
168e0 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54  stroyed==0 || iT
168f0 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b  ab<iDestroyed ){
16900 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20  .      iLargest 
16910 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20  = iTab;.    }.  
16920 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
16930 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
16940 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
16950 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78  {.      int iIdx
16960 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20   = pIdx->tnum;. 
16970 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
16980 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
16990 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
169a0 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79     if( (iDestroy
169b0 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69  ed==0 || (iIdx<i
169c0 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69  Destroyed)) && i
169d0 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a  Idx>iLargest ){.
169e0 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74          iLargest
169f0 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d   = iIdx;.      }
16a00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
16a10 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20  Largest==0 ){.  
16a20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
16a30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
16a40 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
16a50 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
16a60 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
16a70 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61 73  chema);.      as
16a80 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
16a90 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e  iDb<pParse->db->
16aa0 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65 73  nDb );.      des
16ab0 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
16ac0 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69  rse, iLargest, i
16ad0 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74  Db);.      iDest
16ae0 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74  royed = iLargest
16af0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
16b00 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74 72  *.** Remove entr
16b10 69 65 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  ies from the sql
16b20 69 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73  ite_statN tables
16b30 20 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32 2c   (for N in (1,2,
16b40 33 29 29 0a 2a 2a 20 61 66 74 65 72 20 61 20 44  3)).** after a D
16b50 52 4f 50 20 49 4e 44 45 58 20 6f 72 20 44 52 4f  ROP INDEX or DRO
16b60 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e  P TABLE command.
16b70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16b80 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74  sqlite3ClearStat
16b90 54 61 62 6c 65 73 28 0a 20 20 50 61 72 73 65 20  Tables(.  Parse 
16ba0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
16bb0 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
16bc0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
16bd0 20 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20   iDb,           
16be0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
16bf0 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
16c00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
16c10 65 2c 20 20 20 20 20 2f 2a 20 22 69 64 78 22 20  e,     /* "idx" 
16c20 6f 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63 6f  or "tbl" */.  co
16c30 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
16c40 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
16c50 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 2a  index or table *
16c60 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
16c70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
16c80 61 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ame = pParse->db
16c90 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
16ca0 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  ame;.  for(i=1; 
16cb0 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<=4; i++){.    
16cc0 63 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a 20  char zTab[24];. 
16cd0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
16ce0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62 29  ntf(sizeof(zTab)
16cf0 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73 74  ,zTab,"sqlite_st
16d00 61 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69 66  at%d",i);.    if
16d10 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
16d20 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
16d30 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29 7b  Tab, zDbName) ){
16d40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65  .      sqlite3Ne
16d50 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
16d60 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54  ,.        "DELET
16d70 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
16d80 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20 20  RE %s=%Q",.     
16d90 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62     zDbName, zTab
16da0 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20  , zType, zName. 
16db0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
16dc0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
16dd0 61 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f 70  ate code to drop
16de0 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69   a table..*/.voi
16df0 64 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f  d sqlite3CodeDro
16e00 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
16e10 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
16e20 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
16e30 69 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65 20  isView){.  Vdbe 
16e40 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
16e50 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
16e60 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
16e70 67 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d  ger;.  Db *pDb =
16e80 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
16e90 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
16ea0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
16eb0 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
16ec0 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  .  sqlite3BeginW
16ed0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
16ee0 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a  arse, 1, iDb);..
16ef0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16f00 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
16f10 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
16f20 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
16f30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
16f40 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20  v, OP_VBegin);. 
16f50 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
16f60 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72  Drop all trigger
16f70 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
16f80 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  h the table bein
16f90 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a  g dropped. Code.
16fa0 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65    ** is generate
16fb0 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72  d to remove entr
16fc0 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  ies from sqlite_
16fd0 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20  master and/or.  
16fe0 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  ** sqlite_temp_m
16ff0 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65  aster if require
17000 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67 67  d..  */.  pTrigg
17010 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67  er = sqlite3Trig
17020 67 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  gerList(pParse, 
17030 70 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20  pTab);.  while( 
17040 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
17050 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
17060 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
17070 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20  >pSchema || .   
17080 20 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70       pTrigger->p
17090 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b  Schema==db->aDb[
170a0 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  1].pSchema );.  
170b0 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69    sqlite3DropTri
170c0 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20  ggerPtr(pParse, 
170d0 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 70  pTrigger);.    p
170e0 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67  Trigger = pTrigg
170f0 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a  er->pNext;.  }..
17100 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17110 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
17120 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e  T.  /* Remove an
17130 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65  y entries of the
17140 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
17150 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   table associate
17160 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
17170 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
17180 70 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ped. This is don
17190 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62  e before the tab
171a0 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20  le is dropped.  
171b0 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20  ** at the btree 
171c0 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74  level, in case t
171d0 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
171e0 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74  ce table needs t
171f0 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61  o.  ** move as a
17200 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64   result of the d
17210 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20  rop (can happen 
17220 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
17230 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ode)..  */.  if(
17240 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
17250 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
17260 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nt ){.    sqlite
17270 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
17280 72 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c 45  rse,.      "DELE
17290 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  TE FROM %Q.sqlit
172a0 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45  e_sequence WHERE
172b0 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20   name=%Q",.     
172c0 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20   pDb->zDbSName, 
172d0 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pTab->zName.    
172e0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
172f0 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c   /* Drop all SQL
17300 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
17310 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69   and index entri
17320 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  es that refer to
17330 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e   the.  ** table.
17340 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d   The program nam
17350 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  e loops through 
17360 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
17370 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 2a   and deletes.  *
17380 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74  * every row that
17390 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
173a0 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  le of the same n
173b0 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62  ame as the one b
173c0 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65  eing.  ** droppe
173d0 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20  d. Triggers are 
173e0 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
173f0 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69  ly because a tri
17400 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a  gger can be.  **
17410 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
17420 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68  temp database th
17430 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  at refers to a t
17440 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a  able in another.
17450 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
17460 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73   */.  sqlite3Nes
17470 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
17480 20 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20   .      "DELETE 
17490 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
174a0 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64   tbl_name=%Q and
174b0 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27   type!='trigger'
174c0 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44  ",.      pDb->zD
174d0 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e  bSName, MASTER_N
174e0 41 4d 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  AME, pTab->zName
174f0 29 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65 77  );.  if( !isView
17500 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70   && !IsVirtual(p
17510 54 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73 74  Tab) ){.    dest
17520 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c  royTable(pParse,
17530 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f   pTab);.  }..  /
17540 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62  * Remove the tab
17550 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51  le entry from SQ
17560 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20  Lite's internal 
17570 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66  schema and modif
17580 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d  y.  ** the schem
17590 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20  a cookie..  */. 
175a0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
175b0 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Tab) ){.    sqli
175c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
175d0 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44   OP_VDestroy, iD
175e0 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  b, 0, 0, pTab->z
175f0 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
17600 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
17610 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  arse);.  }.  sql
17620 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
17630 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20  , OP_DropTable, 
17640 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  iDb, 0, 0, pTab-
17650 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71  >zName, 0);.  sq
17660 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
17670 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
17680 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65    sqliteViewRese
17690 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d  tAll(db, iDb);.}
176a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
176b0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
176c0 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
176d0 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74   a DROP TABLE st
176e0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d  atement..** pNam
176f0 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
17700 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
17710 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69   dropped..*/.voi
17720 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62  d sqlite3DropTab
17730 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
17740 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
17750 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e  , int isView, in
17760 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c  t noErr){.  Tabl
17770 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20  e *pTab;.  Vdbe 
17780 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
17790 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
177a0 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66    int iDb;..  if
177b0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
177c0 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
177d0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
177e0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
177f0 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
17800 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
17810 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69  ->nSrc==1 );.  i
17820 66 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63  f( sqlite3ReadSc
17830 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67  hema(pParse) ) g
17840 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
17850 62 6c 65 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72  ble;.  if( noErr
17860 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45   ) db->suppressE
17870 72 72 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20  rr++;.  assert( 
17880 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56  isView==0 || isV
17890 69 65 77 3d 3d 4c 4f 43 41 54 45 5f 56 49 45 57  iew==LOCATE_VIEW
178a0 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   );.  pTab = sql
178b0 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
178c0 74 65 6d 28 70 50 61 72 73 65 2c 20 69 73 56 69  tem(pParse, isVi
178d0 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ew, &pName->a[0]
178e0 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29  );.  if( noErr )
178f0 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72   db->suppressErr
17900 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  --;..  if( pTab=
17910 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f  =0 ){.    if( no
17920 45 72 72 20 29 20 73 71 6c 69 74 65 33 43 6f 64  Err ) sqlite3Cod
17930 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
17940 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  ma(pParse, pName
17950 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
17960 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
17970 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
17980 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
17990 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
179a0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
179b0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
179c0 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
179d0 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54  b );..  /* If pT
179e0 61 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20  ab is a virtual 
179f0 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77  table, call View
17a00 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29  GetColumnNames()
17a10 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20   to ensure.  ** 
17a20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  it is initialize
17a30 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73  d..  */.  if( Is
17a40 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26  Virtual(pTab) &&
17a50 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
17a60 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
17a70 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20  e, pTab) ){.    
17a80 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
17a90 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  able;.  }.#ifnde
17aa0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
17ab0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
17ac0 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
17ad0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
17ae0 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
17af0 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73  E(iDb);.    cons
17b00 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
17b10 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
17b20 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
17b30 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a  har *zArg2 = 0;.
17b40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
17b50 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
17b60 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
17b70 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a  zTab, 0, zDb)){.
17b80 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
17b90 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
17ba0 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
17bb0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f   ){.      if( !O
17bc0 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
17bd0 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
17be0 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
17bf0 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  OP_TEMP_VIEW;.  
17c00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17c10 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
17c20 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20  _DROP_VIEW;.    
17c30 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
17c40 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
17c50 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69  ABLE.    }else i
17c60 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
17c70 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65  b) ){.      code
17c80 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
17c90 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72  TABLE;.      zAr
17ca0 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  g2 = sqlite3GetV
17cb0 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 2d  Table(db, pTab)-
17cc0 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65  >pMod->zName;.#e
17cd0 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
17ce0 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
17cf0 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
17d00 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
17d10 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
17d20 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
17d30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17d40 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
17d50 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  OP_TABLE;.      
17d60 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
17d70 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
17d80 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
17d90 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67  Tab->zName, zArg
17da0 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  2, zDb) ){.     
17db0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
17dc0 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
17dd0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
17de0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
17df0 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61  LITE_DELETE, pTa
17e00 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  b->zName, 0, zDb
17e10 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
17e20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
17e30 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
17e40 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  f.  if( sqlite3S
17e50 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e  trNICmp(pTab->zN
17e60 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
17e70 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20 73 71  7)==0 .    && sq
17e80 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
17e90 61 62 2d 3e 7a 4e 61 6d 65 2b 37 2c 20 22 73 74  ab->zName+7, "st
17ea0 61 74 22 2c 20 34 29 21 3d 30 0a 20 20 20 20 26  at", 4)!=0.    &
17eb0 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
17ec0 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2b 37 2c  p(pTab->zName+7,
17ed0 20 22 70 61 72 61 6d 65 74 65 72 73 22 2c 20 31   "parameters", 1
17ee0 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  0)!=0 ){.    sql
17ef0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17f00 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
17f10 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  ay not be droppe
17f20 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
17f30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
17f40 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
17f50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17f60 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45  OMIT_VIEW.  /* E
17f70 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45  nsure DROP TABLE
17f80 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20   is not used on 
17f90 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50  a view, and DROP
17fa0 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65   VIEW is not use
17fb0 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c  d.  ** on a tabl
17fc0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  e..  */.  if( is
17fd0 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
17fe0 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
17ff0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18000 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
18010 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74  P TABLE to delet
18020 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61  e table %s", pTa
18030 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
18040 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
18050 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ble;.  }.  if( !
18060 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
18070 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
18080 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
18090 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
180a0 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20   VIEW to delete 
180b0 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e  view %s", pTab->
180c0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
180d0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
180e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
180f0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
18100 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
18110 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  able from the ma
18120 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ster table.  ** 
18130 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
18140 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
18150 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
18160 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
18170 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
18180 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
18190 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21   iDb);.    if( !
181a0 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
181b0 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74  sqlite3ClearStat
181c0 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69  Tables(pParse, i
181d0 44 62 2c 20 22 74 62 6c 22 2c 20 70 54 61 62 2d  Db, "tbl", pTab-
181e0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  >zName);.      s
181f0 71 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62 6c  qlite3FkDropTabl
18200 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c  e(pParse, pName,
18210 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20   pTab);.    }.  
18220 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f    sqlite3CodeDro
18230 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  pTable(pParse, p
18240 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77  Tab, iDb, isView
18250 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
18260 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  p_table:.  sqlit
18270 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
18280 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
18290 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
182a0 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
182b0 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65  reate a new fore
182c0 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74  ign key on the t
182d0 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  able.** currentl
182e0 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
182f0 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20  tion.  pFromCol 
18300 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
18310 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
18320 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
18330 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f   point to the fo
18340 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70  reign key.  If p
18350 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a  FromCol==0 then.
18360 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b  ** connect the k
18370 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  ey to the last c
18380 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20  olumn inserted. 
18390 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65   pTo is the name
183a0 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
183b0 20 72 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e   referred to (a.
183c0 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74 22  k.a the "parent"
183d0 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c   table).  pToCol
183e0 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66   is a list.** of
183f0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
18400 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e  arent pTo table.
18410 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
18420 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
18430 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
18440 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
18450 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
18460 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
18470 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
18480 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
18490 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
184a0 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
184b0 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
184c0 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
184d0 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
184e0 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
184f0 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
18500 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
18510 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  field..**.** The
18520 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
18530 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
18540 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
18550 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
18560 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
18570 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
18580 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
18590 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
185a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
185b0 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
185c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
185d0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
185e0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
185f0 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
18600 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
18610 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
18620 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
18630 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
18640 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
18650 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
18660 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
18670 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
18680 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
18690 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
186a0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
186b0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
186c0 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
186d0 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
186e0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
186f0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
18700 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
18710 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
18720 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
18730 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e   = 0;.  FKey *pN
18740 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a  extTo;.  Table *
18750 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
18760 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
18770 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
18780 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
18790 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
187a0 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
187b0 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
187c0 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b  E_VTAB ) goto fk
187d0 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
187e0 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
187f0 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
18800 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  l-1;.    if( NEV
18810 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74  ER(iCol<0) ) got
18820 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
18830 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
18840 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  ol->nExpr!=1 ){.
18850 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
18860 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
18870 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73  oreign key on %s
18880 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f  ".         " sho
18890 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
188a0 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
188b0 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20   table %T",.    
188c0 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f       p->aCol[iCo
188d0 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a  l].zName, pTo);.
188e0 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
188f0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
18900 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
18910 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
18920 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f  Col->nExpr!=pFro
18930 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  mCol->nExpr ){. 
18940 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
18950 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
18960 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
18970 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
18980 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
18990 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
189a0 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
189b0 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
189c0 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
189d0 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
189e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
189f0 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
18a00 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  Expr;.  }.  nByt
18a10 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
18a20 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69  y) + (nCol-1)*si
18a30 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
18a40 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
18a50 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
18a60 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
18a70 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b  i<pToCol->nExpr;
18a80 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
18a90 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
18aa0 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
18ab0 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
18ac0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
18ad0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
18ae0 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
18af0 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
18b00 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  =0 ){.    goto f
18b10 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b  k_end;.  }.  pFK
18b20 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
18b30 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
18b40 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
18b50 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
18b60 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20  y->aCol[nCol];. 
18b70 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
18b80 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45  .  if( IN_RENAME
18b90 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73  _OBJECT ){.    s
18ba0 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
18bb0 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f  nMap(pParse, (vo
18bc0 69 64 2a 29 7a 2c 20 70 54 6f 29 3b 0a 20 20 7d  id*)z, pTo);.  }
18bd0 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
18be0 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
18bf0 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
18c00 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
18c10 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e  z);.  z += pTo->
18c20 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  n+1;.  pFKey->nC
18c30 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
18c40 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
18c50 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
18c60 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
18c70 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
18c80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
18c90 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
18ca0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
18cb0 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
18cc0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
18cd0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
18ce0 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
18cf0 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
18d00 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
18d10 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
18d20 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
18d30 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
18d40 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
18d50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18d60 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
18d70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
18d80 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
18d90 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
18da0 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
18db0 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
18dc0 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
18dd0 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
18de0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
18df0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
18e00 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
18e10 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
18e20 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20  OBJECT ){.      
18e30 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54    sqlite3RenameT
18e40 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65  okenRemap(pParse
18e50 2c 20 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69  , &pFKey->aCol[i
18e60 5d 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69  ], pFromCol->a[i
18e70 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
18e80 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
18e90 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
18ea0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
18eb0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
18ec0 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
18ed0 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  en30(pToCol->a[i
18ee0 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
18ef0 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  pFKey->aCol[i].z
18f00 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 69  Col = z;.      i
18f10 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
18f20 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ECT ){.        s
18f30 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
18f40 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20 7a  nRemap(pParse, z
18f50 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  , pToCol->a[i].z
18f60 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
18f70 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70       memcpy(z, p
18f80 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
18f90 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e  e, n);.      z[n
18fa0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b  ] = 0;.      z +
18fb0 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  = n+1;.    }.  }
18fc0 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
18fd0 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65  rred = 0;.  pFKe
18fe0 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d 20  y->aAction[0] = 
18ff0 28 75 38 29 28 66 6c 61 67 73 20 26 20 30 78 66  (u8)(flags & 0xf
19000 66 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  f);            /
19010 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61 63 74 69  * ON DELETE acti
19020 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 61  on */.  pFKey->a
19030 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38 29  Action[1] = (u8)
19040 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26  ((flags >> 8 ) &
19050 20 30 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f 4e   0xff);    /* ON
19060 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e 20 2a   UPDATE action *
19070 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
19080 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
19090 65 6c 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70 53  eld(db, 0, p->pS
190a0 63 68 65 6d 61 29 20 29 3b 0a 20 20 70 4e 65 78  chema) );.  pNex
190b0 74 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73 71  tTo = (FKey *)sq
190c0 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
190d0 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65  &p->pSchema->fke
190e0 79 48 61 73 68 2c 20 0a 20 20 20 20 20 20 70 46  yHash, .      pF
190f0 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64 20  Key->zTo, (void 
19100 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20 69  *)pFKey.  );.  i
19110 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b 65  f( pNextTo==pFKe
19120 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
19130 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
19140 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
19150 20 7d 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f   }.  if( pNextTo
19160 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19170 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f  pNextTo->pPrevTo
19180 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b 65 79  ==0 );.    pFKey
19190 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78  ->pNextTo = pNex
191a0 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f  tTo;.    pNextTo
191b0 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70 46 4b 65  ->pPrevTo = pFKe
191c0 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e  y;.  }..  /* Lin
191d0 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  k the foreign ke
191e0 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61  y to the table a
191f0 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e  s the last step.
19200 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79  .  */.  p->pFKey
19210 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65   = pFKey;.  pFKe
19220 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a  y = 0;..fk_end:.
19230 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
19240 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64  db, pFKey);.#end
19250 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
19260 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
19270 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c  GN_KEY) */.  sql
19280 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
19290 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29  te(db, pFromCol)
192a0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
192b0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
192c0 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oCol);.}../*.** 
192d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
192e0 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49  called when an I
192f0 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
19300 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  TE or INITIALLY 
19310 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75  DEFERRED.** clau
19320 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61  se is seen as pa
19330 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20  rt of a foreign 
19340 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20  key definition. 
19350 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a   The isDeferred.
19360 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
19370 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  1 for INITIALLY 
19380 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66  DEFERRED and 0 f
19390 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  or INITIALLY IMM
193a0 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62  EDIATE..** The b
193b0 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d  ehavior of the m
193c0 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65  ost recently cre
193d0 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  ated foreign key
193e0 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20   is adjusted.** 
193f0 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
19400 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 65  void sqlite3Defe
19410 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73  rForeignKey(Pars
19420 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
19430 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e  sDeferred){.#ifn
19440 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19450 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61  FOREIGN_KEY.  Ta
19460 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65  ble *pTab;.  FKe
19470 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20  y *pFKey;.  if( 
19480 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  (pTab = pParse->
19490 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c  pNewTable)==0 ||
194a0 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e   (pFKey = pTab->
194b0 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75  pFKey)==0 ) retu
194c0 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  rn;.  assert( is
194d0 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69  Deferred==0 || i
194e0 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29 3b 20  sDeferred==1 ); 
194f0 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32 33 2d 32  /* EV: R-30323-2
19500 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d  1917 */.  pFKey-
19510 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 28 75  >isDeferred = (u
19520 38 29 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65  8)isDeferred;.#e
19530 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ndif.}../*.** Ge
19540 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
19550 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20   will erase and 
19560 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49  refill index *pI
19570 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  dx.  This is.** 
19580 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69  used to initiali
19590 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74  ze a newly creat
195a0 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72  ed index or to r
195b0 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20  ecompute the.** 
195c0 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e  content of an in
195d0 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20  dex in response 
195e0 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d  to a REINDEX com
195f0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d  mand..**.** if m
19600 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f  emRootPage is no
19610 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d  t negative, it m
19620 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e  eans that the in
19630 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20  dex is newly.** 
19640 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 72 65  created.  The re
19650 67 69 73 74 65 72 20 73 70 65 63 69 66 69 65 64  gister specified
19660 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   by memRootPage 
19670 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20  contains the.** 
19680 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
19690 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
196a0 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  If memRootPage i
196b0 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
196c0 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c  .** the index al
196d0 72 65 61 64 79 20 65 78 69 73 74 73 20 61 6e 64  ready exists and
196e0 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65 64   must be cleared
196f0 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65   before being re
19700 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68  filled and.** th
19710 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
19720 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  er of the index 
19730 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49  is taken from pI
19740 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73  ndex->tnum..*/.s
19750 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
19760 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61  e3RefillIndex(Pa
19770 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
19780 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20  ex *pIndex, int 
19790 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20  memRootPage){.  
197a0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
197b0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f  ndex->pTable;  /
197c0 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74  * The table that
197d0 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   is indexed */. 
197e0 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
197f0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
19800 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20  /* Btree cursor 
19810 75 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f  used for pTab */
19820 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50  .  int iIdx = pP
19830 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
19840 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
19850 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65  r used for pInde
19860 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74  x */.  int iSort
19870 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
19880 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
19890 6f 70 65 6e 65 64 20 62 79 20 4f 70 65 6e 53 6f  opened by OpenSo
198a0 72 74 65 72 20 28 69 66 20 69 6e 20 75 73 65 29  rter (if in use)
198b0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b   */.  int addr1;
198c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198d0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
198e0 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a  of top of loop *
198f0 2f 0a 20 20 69 6e 74 20 61 64 64 72 32 3b 20 20  /.  int addr2;  
19900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19910 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 74 6f     /* Address to
19920 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 6e 65 78   jump to for nex
19930 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  t iteration */. 
19940 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20   int tnum;      
19950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19960 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
19970 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
19980 50 61 72 74 49 64 78 4c 61 62 65 6c 3b 20 20 20  PartIdxLabel;   
19990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
199a0 70 20 74 6f 20 74 68 69 73 20 6c 61 62 65 6c 20  p to this label 
199b0 74 6f 20 73 6b 69 70 20 61 20 72 6f 77 20 2a 2f  to skip a row */
199c0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
199d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
199f0 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72  de into this vir
19a00 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a  tual machine */.
19a10 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b    KeyInfo *pKey;
19a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a30 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20   /* KeyInfo for 
19a40 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72  index */.  int r
19a50 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20  egRecord;       
19a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
19a70 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73  ister holding as
19a80 73 65 6d 62 6c 65 64 20 69 6e 64 65 78 20 72 65  sembled index re
19a90 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cord */.  sqlite
19aa0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
19ab0 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  db;      /* The 
19ac0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
19ad0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ion */.  int iDb
19ae0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
19af0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  ToIndex(db, pInd
19b00 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23  ex->pSchema);..#
19b10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19b20 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
19b30 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
19b40 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
19b50 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20  SQLITE_REINDEX, 
19b60 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
19b70 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
19b80 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 29 20  iDb].zDbSName ) 
19b90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
19ba0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
19bb0 52 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Require a write-
19bc0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
19bd0 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69  e to perform thi
19be0 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  s operation */. 
19bf0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
19c00 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
19c10 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54  Tab->tnum, 1, pT
19c20 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76  ab->zName);..  v
19c30 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
19c40 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
19c50 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
19c60 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
19c70 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d  e>=0 ){.    tnum
19c80 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a   = memRootPage;.
19c90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75    }else{.    tnu
19ca0 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  m = pIndex->tnum
19cb0 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73  ;.  }.  pKey = s
19cc0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
19cd0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
19ce0 64 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  dex);.  assert( 
19cf0 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  pKey!=0 || db->m
19d00 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
19d10 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 0a  Parse->nErr );..
19d20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 6f    /* Open the so
19d30 72 74 65 72 20 63 75 72 73 6f 72 20 69 66 20 77  rter cursor if w
19d40 65 20 61 72 65 20 74 6f 20 75 73 65 20 6f 6e 65  e are to use one
19d50 2e 20 2a 2f 0a 20 20 69 53 6f 72 74 65 72 20 3d  . */.  iSorter =
19d60 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
19d70 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
19d80 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp4(v, OP_Sorte
19d90 72 4f 70 65 6e 2c 20 69 53 6f 72 74 65 72 2c 20  rOpen, iSorter, 
19da0 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  0, pIndex->nKeyC
19db0 6f 6c 2c 20 28 63 68 61 72 2a 29 0a 20 20 20 20  ol, (char*).    
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dd0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
19de0 66 28 70 4b 65 79 29 2c 20 50 34 5f 4b 45 59 49  f(pKey), P4_KEYI
19df0 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  NFO);..  /* Open
19e00 20 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f 70   the table. Loop
19e10 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77   through all row
19e20 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c 20  s of the table, 
19e30 69 6e 73 65 72 74 69 6e 67 20 69 6e 64 65 78 0a  inserting index.
19e40 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e 74    ** records int
19e50 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f  o the sorter. */
19e60 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61  .  sqlite3OpenTa
19e70 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ble(pParse, iTab
19e80 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
19e90 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64  OpenRead);.  add
19ea0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
19eb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
19ec0 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 20 56  ind, iTab, 0); V
19ed0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19ee0 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
19ef0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
19f00 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
19f10 65 33 4d 75 6c 74 69 57 72 69 74 65 28 70 50 61  e3MultiWrite(pPa
19f20 72 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  rse);..  sqlite3
19f30 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
19f40 28 70 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69  (pParse,pIndex,i
19f50 54 61 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c  Tab,regRecord,0,
19f60 26 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30  &iPartIdxLabel,0
19f70 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ,0);.  sqlite3Vd
19f80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
19f90 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f  orterInsert, iSo
19fa0 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29  rter, regRecord)
19fb0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
19fc0 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70  vePartIdxLabel(p
19fd0 50 61 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c  Parse, iPartIdxL
19fe0 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  abel);.  sqlite3
19ff0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a000 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
1a010 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  r1+1); VdbeCover
1a020 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
1a030 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1a040 20 61 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d   addr1);.  if( m
1a050 65 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73  emRootPage<0 ) s
1a060 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a070 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e  (v, OP_Clear, tn
1a080 75 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  um, iDb);.  sqli
1a090 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1a0a0 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69   OP_OpenWrite, i
1a0b0 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20  Idx, tnum, iDb, 
1a0c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a0d0 20 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65       (char *)pKe
1a0e0 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  y, P4_KEYINFO);.
1a0f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1a100 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
1a110 42 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f  BULKCSR|((memRoo
1a120 74 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47  tPage>=0)?OPFLAG
1a130 5f 50 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20  _P2ISREG:0));.. 
1a140 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
1a150 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a160 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f  _SorterSort, iSo
1a170 72 74 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f  rter, 0); VdbeCo
1a180 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28  verage(v);.  if(
1a190 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
1a1a0 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69 6e  Index) ){.    in
1a1b0 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t j2 = sqlite3Vd
1a1c0 62 65 47 6f 74 6f 28 76 2c 20 31 29 3b 0a 20 20  beGoto(v, 1);.  
1a1d0 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
1a1e0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1a1f0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1a200 56 64 62 65 56 65 72 69 66 79 41 62 6f 72 74 61  VdbeVerifyAborta
1a210 62 6c 65 28 76 2c 20 4f 45 5f 41 62 6f 72 74 29  ble(v, OE_Abort)
1a220 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a230 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
1a240 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20  _SorterCompare, 
1a250 69 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67  iSorter, j2, reg
1a260 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20  Record,.        
1a270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a280 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c   pIndex->nKeyCol
1a290 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1a2a0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 55  v);.    sqlite3U
1a2b0 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28  niqueConstraint(
1a2c0 70 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74  pParse, OE_Abort
1a2d0 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73  , pIndex);.    s
1a2e0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1a2f0 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 7d 65 6c  re(v, j2);.  }el
1a300 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 6f 73 74 20  se{.    /* Most 
1a310 43 52 45 41 54 45 20 49 4e 44 45 58 20 61 6e 64  CREATE INDEX and
1a320 20 52 45 49 4e 44 45 58 20 73 74 61 74 65 6d 65   REINDEX stateme
1a330 6e 74 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  nts that are not
1a340 20 55 4e 49 51 55 45 20 63 61 6e 20 6e 6f 74 0a   UNIQUE can not.
1a350 20 20 20 20 2a 2a 20 61 62 6f 72 74 2e 20 54 68      ** abort. Th
1a360 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
1a370 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64  f one of the ind
1a380 65 78 65 64 20 65 78 70 72 65 73 73 69 6f 6e 73  exed expressions
1a390 20 63 6f 6e 74 61 69 6e 73 20 61 0a 20 20 20 20   contains a.    
1a3a0 2a 2a 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  ** user function
1a3b0 20 74 68 61 74 20 74 68 72 6f 77 73 20 61 6e 20   that throws an 
1a3c0 65 78 63 65 70 74 69 6f 6e 20 77 68 65 6e 20 69  exception when i
1a3d0 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e 20  t is evaluated. 
1a3e0 42 75 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f  But the.    ** o
1a3f0 76 65 72 68 65 61 64 20 6f 66 20 61 64 64 69 6e  verhead of addin
1a400 67 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  g a statement jo
1a410 75 72 6e 61 6c 20 74 6f 20 61 20 43 52 45 41 54  urnal to a CREAT
1a420 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
1a430 74 20 69 73 0a 20 20 20 20 2a 2a 20 76 65 72 79  t is.    ** very
1a440 20 73 6d 61 6c 6c 20 28 73 69 6e 63 65 20 6d 6f   small (since mo
1a450 73 74 20 6f 66 20 74 68 65 20 70 61 67 65 73 20  st of the pages 
1a460 77 72 69 74 74 65 6e 20 64 6f 20 6e 6f 74 20 63  written do not c
1a470 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 20 74  ontain content t
1a480 68 61 74 0a 20 20 20 20 2a 2a 20 6e 65 65 64 73  hat.    ** needs
1a490 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 20   to be restored 
1a4a0 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
1a4b0 20 61 62 6f 72 74 73 29 2c 20 73 6f 20 77 65 20   aborts), so we 
1a4c0 63 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 73 71 6c  call .    ** sql
1a4d0 69 74 65 33 4d 61 79 41 62 6f 72 74 28 29 20 66  ite3MayAbort() f
1a4e0 6f 72 20 61 6c 6c 20 43 52 45 41 54 45 20 49 4e  or all CREATE IN
1a4f0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  DEX statements. 
1a500 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4d   */.    sqlite3M
1a510 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
1a520 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
1a530 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1a540 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71  ddr(v);.  }.  sq
1a550 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1a560 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61  v, OP_SorterData
1a570 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65  , iSorter, regRe
1a580 63 6f 72 64 2c 20 69 49 64 78 29 3b 0a 20 20 69  cord, iIdx);.  i
1a590 66 28 20 21 70 49 6e 64 65 78 2d 3e 62 41 73 63  f( !pIndex->bAsc
1a5a0 4b 65 79 42 75 67 20 29 7b 0a 20 20 20 20 2f 2a  KeyBug ){.    /*
1a5b0 20 54 68 69 73 20 4f 50 5f 53 65 65 6b 45 6e 64   This OP_SeekEnd
1a5c0 20 6f 70 63 6f 64 65 20 6d 61 6b 65 73 20 69 6e   opcode makes in
1a5d0 64 65 78 20 69 6e 73 65 72 74 20 66 6f 72 20 61  dex insert for a
1a5e0 20 52 45 49 4e 44 45 58 20 67 6f 20 6d 75 63 68   REINDEX go much
1a5f0 0a 20 20 20 20 2a 2a 20 66 61 73 74 65 72 20 62  .    ** faster b
1a600 79 20 61 76 6f 69 64 69 6e 67 20 75 6e 6e 65 63  y avoiding unnec
1a610 65 73 73 61 72 79 20 73 65 65 6b 73 2e 20 20 42  essary seeks.  B
1a620 75 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  ut the optimizat
1a630 69 6f 6e 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20  ion does.    ** 
1a640 6e 6f 74 20 77 6f 72 6b 20 66 6f 72 20 55 4e 49  not work for UNI
1a650 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  QUE constraint i
1a660 6e 64 65 78 65 73 20 6f 6e 20 57 49 54 48 4f 55  ndexes on WITHOU
1a670 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 0a 20  T ROWID tables. 
1a680 20 20 20 2a 2a 20 77 69 74 68 20 44 45 53 43 20     ** with DESC 
1a690 70 72 69 6d 61 72 79 20 6b 65 79 73 2c 20 73 69  primary keys, si
1a6a0 6e 63 65 20 74 68 6f 73 65 20 69 6e 64 65 78 65  nce those indexe
1a6b0 73 20 68 61 76 65 20 74 68 65 72 65 20 6b 65 79  s have there key
1a6c0 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61 20 64 69  s in.    ** a di
1a6d0 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 66 72  fferent order fr
1a6e0 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  om the main tabl
1a6f0 65 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 69  e..    ** See ti
1a700 63 6b 65 74 3a 20 68 74 74 70 73 3a 2f 2f 77 77  cket: https://ww
1a710 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63  w.sqlite.org/src
1a720 2f 69 6e 66 6f 2f 62 62 61 37 62 36 39 66 39 38  /info/bba7b69f98
1a730 34 39 62 35 62 66 0a 20 20 20 20 2a 2f 0a 20 20  49b5bf.    */.  
1a740 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a750 4f 70 31 28 76 2c 20 4f 50 5f 53 65 65 6b 45 6e  Op1(v, OP_SeekEn
1a760 64 2c 20 69 49 64 78 29 3b 0a 20 20 7d 0a 20 20  d, iIdx);.  }.  
1a770 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a780 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
1a790 74 2c 20 69 49 64 78 2c 20 72 65 67 52 65 63 6f  t, iIdx, regReco
1a7a0 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
1a7b0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
1a7c0 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
1a7d0 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  LT);.  sqlite3Re
1a7e0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1a7f0 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
1a800 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1a810 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
1a820 72 4e 65 78 74 2c 20 69 53 6f 72 74 65 72 2c 20  rNext, iSorter, 
1a830 61 64 64 72 32 29 3b 20 56 64 62 65 43 6f 76 65  addr2); VdbeCove
1a840 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
1a850 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1a860 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c  , addr1);..  sql
1a870 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1a880 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62  , OP_Close, iTab
1a890 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1a8a0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
1a8b0 73 65 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c  se, iIdx);.  sql
1a8c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1a8d0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72  , OP_Close, iSor
1a8e0 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ter);.}../*.** A
1a8f0 6c 6c 6f 63 61 74 65 20 68 65 61 70 20 73 70 61  llocate heap spa
1a900 63 65 20 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e  ce to hold an In
1a910 64 65 78 20 6f 62 6a 65 63 74 20 77 69 74 68 20  dex object with 
1a920 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a  nCol columns..**
1a930 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65  .** Increase the
1a940 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65   allocation size
1a950 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 65   to provide an e
1a960 78 74 72 61 20 6e 45 78 74 72 61 20 62 79 74 65  xtra nExtra byte
1a970 73 0a 2a 2a 20 6f 66 20 38 2d 62 79 74 65 20 61  s.** of 8-byte a
1a980 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 66 74  ligned space aft
1a990 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  er the Index obj
1a9a0 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ect and return a
1a9b0 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  .** pointer to t
1a9c0 68 69 73 20 65 78 74 72 61 20 73 70 61 63 65 20  his extra space 
1a9d0 69 6e 20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a  in *ppExtra..*/.
1a9e0 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 41 6c  Index *sqlite3Al
1a9f0 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63  locateIndexObjec
1aa00 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
1aa10 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ,         /* Dat
1aa20 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1aa30 20 2a 2f 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20   */.  i16 nCol, 
1aa40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
1aa50 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  tal number of co
1aa60 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64  lumns in the ind
1aa70 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  ex */.  int nExt
1aa80 72 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ra,          /* 
1aa90 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1aaa0 6f 66 20 65 78 74 72 61 20 73 70 61 63 65 20 74  of extra space t
1aab0 6f 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61  o alloc */.  cha
1aac0 72 20 2a 2a 70 70 45 78 74 72 61 20 20 20 20 20  r **ppExtra     
1aad0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1aae0 74 68 65 20 22 65 78 74 72 61 22 20 73 70 61 63  the "extra" spac
1aaf0 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  e */.){.  Index 
1ab00 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p;            /
1ab10 2a 20 41 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65  * Allocated inde
1ab20 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  x object */.  in
1ab30 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
1ab40 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
1ab50 70 61 63 65 20 66 6f 72 20 49 6e 64 65 78 20 6f  pace for Index o
1ab60 62 6a 65 63 74 20 2b 20 61 72 72 61 79 73 20 2a  bject + arrays *
1ab70 2f 0a 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  /..  nByte = ROU
1ab80 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78  ND8(sizeof(Index
1ab90 29 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  )) +            
1aba0 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63    /* Index struc
1abb0 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 20  ture  */.       
1abc0 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
1abd0 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20  (char*)*nCol) + 
1abe0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1abf0 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20  .azColl     */. 
1ac00 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28           ROUND8(
1ac10 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28  sizeof(LogEst)*(
1ac20 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 2f 2a  nCol+1) +     /*
1ac30 20 49 6e 64 65 78 2e 61 69 52 6f 77 4c 6f 67 45   Index.aiRowLogE
1ac40 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  st   */.        
1ac50 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
1ac60 69 31 36 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20  i16)*nCol +     
1ac70 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
1ac80 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20  aiColumn   */.  
1ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1aca0 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 29 3b  izeof(u8)*nCol);
1acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1acc0 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72  Index.aSortOrder
1acd0 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   */.  p = sqlite
1ace0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
1acf0 2c 20 6e 42 79 74 65 20 2b 20 6e 45 78 74 72 61  , nByte + nExtra
1ad00 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
1ad10 20 20 63 68 61 72 20 2a 70 45 78 74 72 61 20 3d    char *pExtra =
1ad20 20 28 28 63 68 61 72 2a 29 70 29 2b 52 4f 55 4e   ((char*)p)+ROUN
1ad30 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29  D8(sizeof(Index)
1ad40 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c  );.    p->azColl
1ad50 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a   = (const char**
1ad60 29 70 45 78 74 72 61 3b 20 70 45 78 74 72 61 20  )pExtra; pExtra 
1ad70 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  += ROUND8(sizeof
1ad80 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20  (char*)*nCol);. 
1ad90 20 20 20 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73     p->aiRowLogEs
1ada0 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 45 78  t = (LogEst*)pEx
1adb0 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 73  tra; pExtra += s
1adc0 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e  izeof(LogEst)*(n
1add0 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 61  Col+1);.    p->a
1ade0 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29  iColumn = (i16*)
1adf0 70 45 78 74 72 61 3b 20 20 20 20 20 20 20 70 45  pExtra;       pE
1ae00 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69  xtra += sizeof(i
1ae10 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d  16)*nCol;.    p-
1ae20 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
1ae30 38 2a 29 70 45 78 74 72 61 3b 0a 20 20 20 20 70  8*)pExtra;.    p
1ae40 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c  ->nColumn = nCol
1ae50 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c  ;.    p->nKeyCol
1ae60 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20   = nCol - 1;.   
1ae70 20 2a 70 70 45 78 74 72 61 20 3d 20 28 28 63 68   *ppExtra = ((ch
1ae80 61 72 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a  ar*)p) + nByte;.
1ae90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
1aea0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72  }../*.** If expr
1aeb0 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73  ession list pLis
1aec0 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 78  t contains an ex
1aed0 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 61  pression that wa
1aee0 73 20 70 61 72 73 65 64 20 77 69 74 68 0a 2a 2a  s parsed with.**
1aef0 20 61 6e 20 65 78 70 6c 69 63 69 74 20 22 4e 55   an explicit "NU
1af00 4c 4c 53 20 46 49 52 53 54 22 20 6f 72 20 22 4e  LLS FIRST" or "N
1af10 55 4c 4c 53 20 4c 41 53 54 22 20 63 6c 61 75 73  ULLS LAST" claus
1af20 65 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  e, leave an erro
1af30 72 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 20 61  r in.** pParse a
1af40 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  nd return non-ze
1af50 72 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  ro. Otherwise, r
1af60 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 69  eturn zero..*/.i
1af70 6e 74 20 73 71 6c 69 74 65 33 48 61 73 45 78 70  nt sqlite3HasExp
1af80 6c 69 63 69 74 4e 75 6c 6c 73 28 50 61 72 73 65  licitNulls(Parse
1af90 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
1afa0 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66  st *pList){.  if
1afb0 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 69  ( pList ){.    i
1afc0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
1afd0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
1afe0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
1aff0 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 62  f( pList->a[i].b
1b000 4e 75 6c 6c 73 20 29 7b 0a 20 20 20 20 20 20 20  Nulls ){.       
1b010 20 75 38 20 73 66 20 3d 20 70 4c 69 73 74 2d 3e   u8 sf = pList->
1b020 61 5b 69 5d 2e 73 6f 72 74 46 6c 61 67 73 3b 0a  a[i].sortFlags;.
1b030 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1b040 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1b050 22 75 6e 73 75 70 70 6f 72 74 65 64 20 75 73 65  "unsupported use
1b060 20 6f 66 20 4e 55 4c 4c 53 20 25 73 22 2c 20 0a   of NULLS %s", .
1b070 20 20 20 20 20 20 20 20 20 20 20 20 28 73 66 3d              (sf=
1b080 3d 30 20 7c 7c 20 73 66 3d 3d 33 29 20 3f 20 22  =0 || sf==3) ? "
1b090 46 49 52 53 54 22 20 3a 20 22 4c 41 53 54 22 0a  FIRST" : "LAST".
1b0a0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1b0b0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1b0c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1b0d0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1b0e0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1b0f0 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51   index for an SQ
1b100 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31  L table.  pName1
1b110 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e  .pName2 is the n
1b120 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
1b130 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73   .** and pTblLis
1b140 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
1b150 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
1b160 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
1b170 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a  .  Both will .**
1b180 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70   be NULL for a p
1b190 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e  rimary key or an
1b1a0 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63   index that is c
1b1b0 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66  reated to satisf
1b1c0 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f  y a.** UNIQUE co
1b1d0 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54  nstraint.  If pT
1b1e0 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20  able and pIndex 
1b1f0 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50  are NULL, use pP
1b200 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a  arse->pNewTable.
1b210 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20  ** as the table 
1b220 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
1b230 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
1b240 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61  e is a table tha
1b250 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  t is.** currentl
1b260 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
1b270 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20  ted by a CREATE 
1b280 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
1b290 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20  .**.** pList is 
1b2a0 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  a list of column
1b2b0 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
1b2c0 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20    pList will be 
1b2d0 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20  NULL if this.** 
1b2e0 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  is a primary key
1b2f0 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74   or unique-const
1b300 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73  raint on the mos
1b310 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20  t recent column 
1b320 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  added.** to the 
1b330 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
1b340 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1b350 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  on.  .*/.void sq
1b360 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
1b370 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1b380 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e  e,     /* All in
1b390 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
1b3a0 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20  this parse */.  
1b3b0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
1b3c0 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
1b3d0 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20   of index name. 
1b3e0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
1b3f0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
1b400 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61      /* Second pa
1b410 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
1b420 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
1b430 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c  .  SrcList *pTbl
1b440 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74  Name, /* Table t
1b450 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61  o index. Use pPa
1b460 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
1b470 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  f 0 */.  ExprLis
1b480 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41  t *pList,   /* A
1b490 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
1b4a0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
1b4b0 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
1b4c0 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f         /* OE_Abo
1b4d0 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f  rt, OE_Ignore, O
1b4e0 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45  E_Replace, or OE
1b4f0 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  _None */.  Token
1b500 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a   *pStart,     /*
1b510 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
1b520 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
1b530 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  is statement */.
1b540 20 20 45 78 70 72 20 2a 70 50 49 57 68 65 72 65    Expr *pPIWhere
1b550 2c 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c  ,    /* WHERE cl
1b560 61 75 73 65 20 66 6f 72 20 70 61 72 74 69 61 6c  ause for partial
1b570 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
1b580 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20  t sortOrder,    
1b590 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f   /* Sort order o
1b5a0 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68  f primary key wh
1b5b0 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a  en pList==NULL *
1b5c0 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69  /.  int ifNotExi
1b5d0 73 74 2c 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65  st,    /* Omit e
1b5e0 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c  rror if index al
1b5f0 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
1b600 20 20 75 38 20 69 64 78 54 79 70 65 20 20 20 20    u8 idxType    
1b610 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
1b620 78 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 54  x type */.){.  T
1b630 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
1b640 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
1b650 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
1b660 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
1b670 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  0;   /* The inde
1b680 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  x to be created 
1b690 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
1b6a0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d   = 0;     /* Nam
1b6b0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a  e of the index *
1b6c0 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
1b6d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b6e0 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
1b6f0 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69   in zName */.  i
1b700 6e 74 20 69 2c 20 6a 3b 0a 20 20 44 62 46 69 78  nt i, j;.  DbFix
1b710 65 72 20 73 46 69 78 3b 20 20 20 20 20 20 20 20  er sFix;        
1b720 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67  /* For assigning
1b730 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20   database names 
1b740 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69  to pTable */.  i
1b750 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b  nt sortOrderMask
1b760 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f  ;   /* 1 to hono
1b770 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e  r DESC in index.
1b780 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a    0 to ignore. *
1b790 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
1b7a0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1b7b0 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
1b7c0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63       /* The spec
1b7d0 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61  ific table conta
1b7e0 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65  ining the indexe
1b7f0 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  d database */.  
1b800 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
1b810 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1b820 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
1b830 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  at is being writ
1b840 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ten */.  Token *
1b850 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a  pName = 0;    /*
1b860 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
1b870 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74  e of the index t
1b880 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74  o create */.  st
1b890 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1b8a0 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f  em *pListItem; /
1b8b0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
1b8c0 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  er pList */.  in
1b8d0 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20 20 20  t nExtra = 0;   
1b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b8f0 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  * Space allocate
1b900 64 20 66 6f 72 20 7a 45 78 74 72 61 5b 5d 20 2a  d for zExtra[] *
1b910 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 43 6f  /.  int nExtraCo
1b920 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1b930 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b940 66 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  f extra columns 
1b950 6e 65 65 64 65 64 20 2a 2f 0a 20 20 63 68 61 72  needed */.  char
1b960 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b 20 20 20   *zExtra = 0;   
1b970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b980 45 78 74 72 61 20 73 70 61 63 65 20 61 66 74 65  Extra space afte
1b990 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  r the Index obje
1b9a0 63 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ct */.  Index *p
1b9b0 50 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  Pk = 0;      /* 
1b9c0 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
1b9d0 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  x for WITHOUT RO
1b9e0 57 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a 0a 20  WID tables */.. 
1b9f0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1ba00 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
1ba10 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 67  >nErr>0 ){.    g
1ba20 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1ba30 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
1ba40 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42   IN_DECLARE_VTAB
1ba50 20 26 26 20 69 64 78 54 79 70 65 21 3d 53 51 4c   && idxType!=SQL
1ba60 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d  ITE_IDXTYPE_PRIM
1ba70 41 52 59 4b 45 59 20 29 7b 0a 20 20 20 20 67 6f  ARYKEY ){.    go
1ba80 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1ba90 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
1baa0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
1bab0 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
1bac0 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  rse) ){.    goto
1bad0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1bae0 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  ex;.  }.  if( sq
1baf0 6c 69 74 65 33 48 61 73 45 78 70 6c 69 63 69 74  lite3HasExplicit
1bb00 4e 75 6c 6c 73 28 70 50 61 72 73 65 2c 20 70 4c  Nulls(pParse, pL
1bb10 69 73 74 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ist) ){.    goto
1bb20 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1bb30 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ex;.  }..  /*.  
1bb40 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c  ** Find the tabl
1bb50 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
1bb60 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e  indexed.  Return
1bb70 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f   early if not fo
1bb80 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  und..  */.  if( 
1bb90 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a  pTblName!=0 ){..
1bba0 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74      /* Use the t
1bbb0 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61  wo-part index na
1bbc0 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  me to determine 
1bbd0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
1bbe0 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66    ** to search f
1bbf0 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46  or the table. 'F
1bc00 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ix' the table na
1bc10 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20  me to this db.  
1bc20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b    ** before look
1bc30 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c 65  ing up the table
1bc40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1bc50 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70  ert( pName1 && p
1bc60 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62  Name2 );.    iDb
1bc70 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
1bc80 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
1bc90 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
1bca0 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69  Name);.    if( i
1bcb0 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74  Db<0 ) goto exit
1bcc0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1bcd0 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
1bce0 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a   && pName->z );.
1bcf0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bd00 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20  OMIT_TEMPDB.    
1bd10 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  /* If the index 
1bd20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69  name was unquali
1bd30 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74  fied, check if t
1bd40 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  he table.    ** 
1bd50 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e  is a temp table.
1bd60 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20   If so, set the 
1bd70 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20 44  database to 1. D
1bd80 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20 20  o not do this.  
1bd90 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c 69    ** if initiali
1bda0 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  sing a database 
1bdb0 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20  schema..    */. 
1bdc0 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
1bdd0 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 70  .busy ){.      p
1bde0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Tab = sqlite3Src
1bdf0 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73  ListLookup(pPars
1be00 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  e, pTblName);.  
1be10 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e      if( pName2->
1be20 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20  n==0 && pTab && 
1be30 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  pTab->pSchema==d
1be40 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
1be50 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44 62  a ){.        iDb
1be60 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1be70 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1be80 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
1be90 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
1bea0 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d  b, "index", pNam
1beb0 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  e);.    if( sqli
1bec0 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73  te3FixSrcList(&s
1bed0 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 20 29  Fix, pTblName) )
1bee0 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75  {.      /* Becau
1bef0 73 65 20 74 68 65 20 70 61 72 73 65 72 20 63 6f  se the parser co
1bf00 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d  nstructs pTblNam
1bf10 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  e from a single 
1bf20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20  identifier,.    
1bf30 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53    ** sqlite3FixS
1bf40 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72  rcList can never
1bf50 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20   fail. */.      
1bf60 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d  assert(0);.    }
1bf70 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
1bf80 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74  te3LocateTableIt
1bf90 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 26 70  em(pParse, 0, &p
1bfa0 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a  TblName->a[0]);.
1bfb0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
1bfc0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
1bfd0 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  || pTab==0 );.  
1bfe0 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
1bff0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1c000 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
1c010 69 44 62 3d 3d 31 20 26 26 20 64 62 2d 3e 61 44  iDb==1 && db->aD
1c020 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 21 3d  b[iDb].pSchema!=
1c030 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
1c040 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1c050 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
1c060 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e             "cann
1c070 6f 74 20 63 72 65 61 74 65 20 61 20 54 45 4d 50  ot create a TEMP
1c080 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54 45   index on non-TE
1c090 4d 50 20 74 61 62 6c 65 20 5c 22 25 73 5c 22 22  MP table \"%s\""
1c0a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
1c0b0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
1c0c0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1c0d0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
1c0e0 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
1c0f0 28 70 54 61 62 29 20 29 20 70 50 6b 20 3d 20 73  (pTab) ) pPk = s
1c100 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
1c110 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d  Index(pTab);.  }
1c120 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
1c130 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20  ( pName==0 );.  
1c140 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74    assert( pStart
1c150 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20  ==0 );.    pTab 
1c160 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
1c170 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54  ble;.    if( !pT
1c180 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ab ) goto exit_c
1c190 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1c1a0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
1c1b0 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
1c1c0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
1c1d0 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d    }.  pDb = &db-
1c1e0 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73  >aDb[iDb];..  as
1c1f0 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
1c200 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1c210 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20  e->nErr==0 );.  
1c220 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
1c230 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Cmp(pTab->zName,
1c240 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d   "sqlite_", 7)==
1c250 30 20 0a 20 20 20 20 20 20 20 26 26 20 64 62 2d  0 .       && db-
1c260 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 0a 20 20  >init.busy==0.  
1c270 20 20 20 20 20 26 26 20 70 54 62 6c 4e 61 6d 65       && pTblName
1c280 21 3d 30 0a 23 69 66 20 53 51 4c 49 54 45 5f 55  !=0.#if SQLITE_U
1c290 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
1c2a0 4f 4e 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  ON.       && sql
1c2b0 69 74 65 33 55 73 65 72 41 75 74 68 54 61 62 6c  ite3UserAuthTabl
1c2c0 65 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d  e(pTab->zName)==
1c2d0 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  0.#endif.#ifdef 
1c2e0 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 53 51 4c  SQLITE_ALLOW_SQL
1c2f0 49 54 45 5f 4d 41 53 54 45 52 5f 49 4e 44 45 58  ITE_MASTER_INDEX
1c300 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
1c310 65 33 53 74 72 49 43 6d 70 28 26 70 54 61 62 2d  e3StrICmp(&pTab-
1c320 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 6d 61 73 74 65  >zName[7],"maste
1c330 72 22 29 21 3d 30 0a 23 65 6e 64 69 66 0a 20 29  r")!=0.#endif. )
1c340 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1c350 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
1c360 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20  able %s may not 
1c370 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61  be indexed", pTa
1c380 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
1c390 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1c3a0 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64  index;.  }.#ifnd
1c3b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1c3c0 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  IEW.  if( pTab->
1c3d0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
1c3e0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1c3f0 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61  Parse, "views ma
1c400 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
1c410 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ");.    goto exi
1c420 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1c430 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
1c440 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1c450 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
1c460 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
1c470 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
1c480 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1c490 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73   "virtual tables
1c4a0 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
1c4b0 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  xed");.    goto 
1c4c0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1c4d0 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  x;.  }.#endif.. 
1c4e0 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
1c4f0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
1c500 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  dex.  Make sure 
1c510 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72  there is not alr
1c520 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a  eady another.  *
1c530 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
1c540 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
1c550 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ame.  .  **.  **
1c560 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20   Exception:  If 
1c570 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
1c580 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d  he names of perm
1c590 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72  anent indices fr
1c5a0 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  om the.  ** sqli
1c5b0 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
1c5c0 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74  (because some ot
1c5d0 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e  her process chan
1c5e0 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20  ged the schema) 
1c5f0 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20  and.  ** one of 
1c600 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  the index names 
1c610 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68  collides with th
1c620 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70  e name of a temp
1c630 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20  orary table or. 
1c640 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20   ** index, then 
1c650 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
1c660 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73   to process this
1c670 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
1c680 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74  * If pName==0 it
1c690 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61   means that we a
1c6a0 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20  re.  ** dealing 
1c6b0 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b  with a primary k
1c6c0 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ey or UNIQUE con
1c6d0 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76  straint.  We hav
1c6e0 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a  e to invent our.
1c6f0 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20    ** own name.. 
1c700 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
1c710 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
1c720 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1c730 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
1c740 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
1c750 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
1c760 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61  ate_index;.    a
1c770 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 7a 21  ssert( pName->z!
1c780 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51  =0 );.    if( SQ
1c790 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
1c7a0 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
1c7b0 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 22 69  pParse, zName,"i
1c7c0 6e 64 65 78 22 2c 70 54 61 62 2d 3e 7a 4e 61 6d  ndex",pTab->zNam
1c7d0 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
1c7e0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1c7f0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
1c800 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  ( !IN_RENAME_OBJ
1c810 45 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ECT ){.      if(
1c820 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
1c830 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
1c840 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
1c850 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30  db, zName, 0)!=0
1c860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
1c870 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1c880 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
1c890 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20  already a table 
1c8a0 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
1c8b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
1c8c0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1c8d0 64 65 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  dex;.        }. 
1c8e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c8f0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
1c900 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62  x(db, zName, pDb
1c910 2d 3e 7a 44 62 53 4e 61 6d 65 29 21 3d 30 20 29  ->zDbSName)!=0 )
1c920 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69  {.        if( !i
1c930 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20  fNotExist ){.   
1c940 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1c950 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1c960 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79  index %s already
1c970 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29   exists", zName)
1c980 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1c990 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1c9a0 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
1c9b0 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  y );.          s
1c9c0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1c9d0 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
1c9e0 44 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Db);.        }. 
1c9f0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
1ca00 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1ca10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1ca20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  else{.    int n;
1ca30 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f  .    Index *pLoo
1ca40 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  p;.    for(pLoop
1ca50 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e  =pTab->pIndex, n
1ca60 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =1; pLoop; pLoop
1ca70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e  =pLoop->pNext, n
1ca80 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20  ++){}.    zName 
1ca90 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1caa0 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 75 74  (db, "sqlite_aut
1cab0 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20 70  oindex_%s_%d", p
1cac0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a  Tab->zName, n);.
1cad0 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
1cae0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
1caf0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1cb00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1cb10 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  Automatic index 
1cb20 6e 61 6d 65 73 20 67 65 6e 65 72 61 74 65 64 20  names generated 
1cb30 66 72 6f 6d 20 77 69 74 68 69 6e 20 73 71 6c 69  from within sqli
1cb40 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
1cb50 28 29 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 68  ().    ** must h
1cb60 61 76 65 20 6e 61 6d 65 73 20 74 68 61 74 20 61  ave names that a
1cb70 72 65 20 64 69 73 74 69 6e 63 74 20 66 72 6f 6d  re distinct from
1cb80 20 6e 6f 72 6d 61 6c 20 61 75 74 6f 6d 61 74 69   normal automati
1cb90 63 20 69 6e 64 65 78 20 6e 61 6d 65 73 2e 0a 20  c index names.. 
1cba0 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
1cbb0 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  ing statement co
1cbc0 6e 76 65 72 74 73 20 22 73 71 6c 69 74 65 33 5f  nverts "sqlite3_
1cbd0 61 75 74 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e  autoindex..." in
1cbe0 74 6f 0a 20 20 20 20 2a 2a 20 22 73 71 6c 69 74  to.    ** "sqlit
1cbf0 65 33 5f 62 75 74 6f 69 6e 64 65 78 2e 2e 2e 22  e3_butoindex..."
1cc00 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
1cc10 65 20 74 68 65 20 6e 61 6d 65 73 20 64 69 73 74  e the names dist
1cc20 69 6e 63 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65  inct..    ** The
1cc30 20 22 76 74 61 62 5f 65 72 72 2e 74 65 73 74 22   "vtab_err.test"
1cc40 20 74 65 73 74 20 64 65 6d 6f 6e 73 74 72 61 74   test demonstrat
1cc50 65 73 20 74 68 65 20 6e 65 65 64 20 6f 66 20 74  es the need of t
1cc60 68 69 73 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a  his statement. *
1cc70 2f 0a 20 20 20 20 69 66 28 20 49 4e 5f 53 50 45  /.    if( IN_SPE
1cc80 43 49 41 4c 5f 50 41 52 53 45 20 29 20 7a 4e 61  CIAL_PARSE ) zNa
1cc90 6d 65 5b 37 5d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  me[7]++;.  }..  
1cca0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74  /* Check for aut
1ccb0 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72  horization to cr
1ccc0 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20  eate an index.. 
1ccd0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1cce0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
1ccf0 41 54 49 4f 4e 0a 20 20 69 66 28 20 21 49 4e 5f  ATION.  if( !IN_
1cd00 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
1cd10 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1cd20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 44 62 53  *zDb = pDb->zDbS
1cd30 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
1cd40 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1cd50 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
1cd60 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
1cd70 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29  LE(iDb), 0, zDb)
1cd80 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
1cd90 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1cda0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  ;.    }.    i = 
1cdb0 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
1cdc0 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d  DEX;.    if( !OM
1cdd0 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
1cde0 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45  ==1 ) i = SQLITE
1cdf0 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
1ce00 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
1ce10 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1ce20 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70  rse, i, zName, p
1ce30 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
1ce40 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
1ce50 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1ce60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1ce70 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73  if..  /* If pLis
1ce80 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74  t==0, it means t
1ce90 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
1cea0 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61  called to make a
1ceb0 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65   primary.  ** ke
1cec0 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73  y out of the las
1ced0 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74  t column added t
1cee0 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  o the table unde
1cef0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
1cf00 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61    ** So create a
1cf10 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69   fake list to si
1cf20 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a  mulate this..  *
1cf30 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  /.  if( pList==0
1cf40 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 70 72   ){.    Token pr
1cf50 65 76 43 6f 6c 3b 0a 20 20 20 20 43 6f 6c 75 6d  evCol;.    Colum
1cf60 6e 20 2a 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d  n *pCol = &pTab-
1cf70 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c  >aCol[pTab->nCol
1cf80 2d 31 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63  -1];.    pCol->c
1cf90 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
1cfa0 41 47 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 73  AG_UNIQUE;.    s
1cfb0 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28  qlite3TokenInit(
1cfc0 26 70 72 65 76 43 6f 6c 2c 20 70 43 6f 6c 2d 3e  &prevCol, pCol->
1cfd0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73  zName);.    pLis
1cfe0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
1cff0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1d000 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1d010 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c     sqlite3ExprAl
1d020 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26  loc(db, TK_ID, &
1d030 70 72 65 76 43 6f 6c 2c 20 30 29 29 3b 0a 20 20  prevCol, 0));.  
1d040 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1d050 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1d060 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73  e_index;.    ass
1d070 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
1d080 72 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69  r==1 );.    sqli
1d090 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f  te3ExprListSetSo
1d0a0 72 74 4f 72 64 65 72 28 70 4c 69 73 74 2c 20 73  rtOrder(pList, s
1d0b0 6f 72 74 4f 72 64 65 72 2c 20 53 51 4c 49 54 45  ortOrder, SQLITE
1d0c0 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 29 3b 0a  _SO_UNDEFINED);.
1d0d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1d0e0 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63  ite3ExprListChec
1d0f0 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c 20  kLength(pParse, 
1d100 70 4c 69 73 74 2c 20 22 69 6e 64 65 78 22 29 3b  pList, "index");
1d110 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
1d120 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69  >nErr ) goto exi
1d130 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1d140 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
1d150 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79   out how many by
1d160 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 72 65  tes of space are
1d170 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
1d180 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20  re explicitly.  
1d190 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c  ** specified col
1d1a0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1d1b0 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  names..  */.  fo
1d1c0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1d1d0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1d1e0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
1d1f0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1d200 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
1d210 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  xpr!=0 );.    if
1d220 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1d230 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20  COLLATE ){.     
1d240 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20   nExtra += (1 + 
1d250 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1d260 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1d270 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1d280 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74  /* .  ** Allocat
1d290 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  e the index stru
1d2a0 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e  cture. .  */.  n
1d2b0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
1d2c0 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
1d2d0 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70 50 6b   nExtraCol = pPk
1d2e0 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20   ? pPk->nKeyCol 
1d2f0 3a 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  : 1;.  assert( p
1d300 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e 45  List->nExpr + nE
1d310 78 74 72 61 43 6f 6c 20 3c 3d 20 33 32 37 36 37  xtraCol <= 32767
1d320 20 2f 2a 20 46 69 74 73 20 69 6e 20 69 31 36 20   /* Fits in i16 
1d330 2a 2f 20 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d  */ );.  pIndex =
1d340 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65   sqlite3Allocate
1d350 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20  IndexObject(db, 
1d360 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e  pList->nExpr + n
1d370 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20  ExtraCol,.      
1d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3a0 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b  nName + nExtra +
1d3b0 20 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20 20   1, &zExtra);.  
1d3c0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1d3d0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
1d3e0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1d3f0 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ex;.  }.  assert
1d400 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
1d410 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61  GNMENT(pIndex->a
1d420 69 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b 0a 20  iRowLogEst) );. 
1d430 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
1d440 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49  YTE_ALIGNMENT(pI
1d450 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b  ndex->azColl) );
1d460 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
1d470 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78   = zExtra;.  zEx
1d480 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31  tra += nName + 1
1d490 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65  ;.  memcpy(pInde
1d4a0 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  x->zName, zName,
1d4b0 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e   nName+1);.  pIn
1d4c0 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
1d4d0 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e  ab;.  pIndex->on
1d4e0 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72  Error = (u8)onEr
1d4f0 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75  ror;.  pIndex->u
1d500 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45  niqNotNull = onE
1d510 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20  rror!=OE_None;. 
1d520 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65   pIndex->idxType
1d530 20 3d 20 69 64 78 54 79 70 65 3b 0a 20 20 70 49   = idxType;.  pI
1d540 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20  ndex->pSchema = 
1d550 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
1d560 68 65 6d 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  hema;.  pIndex->
1d570 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d  nKeyCol = pList-
1d580 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 70 50  >nExpr;.  if( pP
1d590 49 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71  IWhere ){.    sq
1d5a0 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66  lite3ResolveSelf
1d5b0 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65  Reference(pParse
1d5c0 2c 20 70 54 61 62 2c 20 4e 43 5f 50 61 72 74 49  , pTab, NC_PartI
1d5d0 64 78 2c 20 70 50 49 57 68 65 72 65 2c 20 30 29  dx, pPIWhere, 0)
1d5e0 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 50  ;.    pIndex->pP
1d5f0 61 72 74 49 64 78 57 68 65 72 65 20 3d 20 70 50  artIdxWhere = pP
1d600 49 57 68 65 72 65 3b 0a 20 20 20 20 70 50 49 57  IWhere;.    pPIW
1d610 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  here = 0;.  }.  
1d620 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
1d630 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
1d640 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20  b, iDb, 0) );.. 
1d650 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
1d660 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f   if we should ho
1d670 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74  nor DESC request
1d680 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d  s on index colum
1d690 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
1d6a0 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  b->pSchema->file
1d6b0 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20  _format>=4 ){.  
1d6c0 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20    sortOrderMask 
1d6d0 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72  = -1;   /* Honor
1d6e0 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65   DESC */.  }else
1d6f0 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
1d700 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  ask = 0;    /* I
1d710 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20  gnore DESC */.  
1d720 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  }..  /* Analyze 
1d730 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
1d740 65 73 73 69 6f 6e 73 20 74 68 61 74 20 66 6f 72  essions that for
1d750 6d 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  m the terms of t
1d760 68 65 20 69 6e 64 65 78 20 61 6e 64 0a 20 20 2a  he index and.  *
1d770 2a 20 72 65 70 6f 72 74 20 61 6e 79 20 65 72 72  * report any err
1d780 6f 72 73 2e 20 20 49 6e 20 74 68 65 20 63 6f 6d  ors.  In the com
1d790 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
1d7a0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
1d7b0 20 65 78 61 63 74 6c 79 0a 20 20 2a 2a 20 61 20   exactly.  ** a 
1d7c0 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73 74  table column, st
1d7d0 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  ore that column 
1d7e0 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20  in aiColumn[].  
1d7f0 46 6f 72 20 67 65 6e 65 72 61 6c 20 65 78 70 72  For general expr
1d800 65 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f  essions,.  ** po
1d810 70 75 6c 61 74 65 20 70 49 6e 64 65 78 2d 3e 61  pulate pIndex->a
1d820 43 6f 6c 45 78 70 72 20 61 6e 64 20 73 74 6f 72  ColExpr and stor
1d830 65 20 58 4e 5f 45 58 50 52 20 28 2d 32 29 20 69  e XN_EXPR (-2) i
1d840 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20  n aiColumn[]..  
1d850 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73  **.  ** TODO: Is
1d860 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66  sue a warning if
1d870 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c   two or more col
1d880 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
1d890 78 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  x are identical.
1d8a0 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75  .  ** TODO: Issu
1d8b0 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74  e a warning if t
1d8c0 68 65 20 74 61 62 6c 65 20 70 72 69 6d 61 72 79  he table primary
1d8d0 20 6b 65 79 20 69 73 20 75 73 65 64 20 61 73 20   key is used as 
1d8e0 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  part of the.  **
1d8f0 20 69 6e 64 65 78 20 6b 65 79 2e 0a 20 20 2a 2f   index key..  */
1d900 0a 20 20 70 4c 69 73 74 49 74 65 6d 20 3d 20 70  .  pListItem = p
1d910 4c 69 73 74 2d 3e 61 3b 0a 20 20 69 66 28 20 49  List->a;.  if( I
1d920 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
1d930 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  ){.    pIndex->a
1d940 43 6f 6c 45 78 70 72 20 3d 20 70 4c 69 73 74 3b  ColExpr = pList;
1d950 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a  .    pList = 0;.
1d960 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1d970 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c  <pIndex->nKeyCol
1d980 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d  ; i++, pListItem
1d990 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1d9a0 43 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  CExpr;          
1d9b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1d9c0 2d 74 68 20 69 6e 64 65 78 20 65 78 70 72 65 73  -th index expres
1d9d0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sion */.    int 
1d9e0 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
1d9f0 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 53  er;        /* AS
1da00 43 20 6f 72 20 44 45 53 43 20 6f 6e 20 74 68 65  C or DESC on the
1da10 20 69 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e   i-th expression
1da20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
1da30 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20  ar *zColl;      
1da40 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
1da50 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
1da60 65 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65  e */..    sqlite
1da70 33 53 74 72 69 6e 67 54 6f 49 64 28 70 4c 69 73  3StringToId(pLis
1da80 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  tItem->pExpr);. 
1da90 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
1daa0 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70  eSelfReference(p
1dab0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f  Parse, pTab, NC_
1dac0 49 64 78 45 78 70 72 2c 20 70 4c 69 73 74 49 74  IdxExpr, pListIt
1dad0 65 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20  em->pExpr, 0);. 
1dae0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
1daf0 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Err ) goto exit_
1db00 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1db10 20 20 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74    pCExpr = sqlit
1db20 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
1db30 65 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  e(pListItem->pEx
1db40 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 45  pr);.    if( pCE
1db50 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
1db60 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  MN ){.      if( 
1db70 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e  pTab==pParse->pN
1db80 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  ewTable ){.     
1db90 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1dba0 73 67 28 70 50 61 72 73 65 2c 20 22 65 78 70 72  sg(pParse, "expr
1dbb0 65 73 73 69 6f 6e 73 20 70 72 6f 68 69 62 69 74  essions prohibit
1dbc0 65 64 20 69 6e 20 50 52 49 4d 41 52 59 20 4b 45  ed in PRIMARY KE
1dbd0 59 20 61 6e 64 20 22 0a 20 20 20 20 20 20 20 20  Y and ".        
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbf0 20 20 20 20 20 20 20 20 22 55 4e 49 51 55 45 20          "UNIQUE 
1dc00 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20  constraints");. 
1dc10 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
1dc20 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1dc30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1dc40 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70   pIndex->aColExp
1dc50 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
1dc60 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72  pIndex->aColExpr
1dc70 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   = pList;.      
1dc80 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20    pList = 0;.   
1dc90 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20 58     }.      j = X
1dca0 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49  N_EXPR;.      pI
1dcb0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
1dcc0 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20  ] = XN_EXPR;.   
1dcd0 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e     pIndex->uniqN
1dce0 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  otNull = 0;.    
1dcf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 20 3d  }else{.      j =
1dd00 20 70 43 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e   pCExpr->iColumn
1dd10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1dd20 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a 20 20 20  j<=0x7fff );.   
1dd30 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20     if( j<0 ){.  
1dd40 20 20 20 20 20 20 6a 20 3d 20 70 54 61 62 2d 3e        j = pTab->
1dd50 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c  iPKey;.      }el
1dd60 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
1dd70 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f  pTab->aCol[j].no
1dd80 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  tNull==0 ){.    
1dd90 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e        pIndex->un
1dda0 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20  iqNotNull = 0;. 
1ddb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ddc0 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b   if( pTab->aCol[
1ddd0 6a 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f  j].colFlags & CO
1dde0 4c 46 4c 41 47 5f 56 49 52 54 55 41 4c 20 29 7b  LFLAG_VIRTUAL ){
1ddf0 0a 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65  .          pInde
1de00 78 2d 3e 62 48 61 73 56 43 6f 6c 20 3d 20 31 3b  x->bHasVCol = 1;
1de10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1de20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d   }.      pIndex-
1de30 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28  >aiColumn[i] = (
1de40 69 31 36 29 6a 3b 0a 20 20 20 20 7d 0a 20 20 20  i16)j;.    }.   
1de50 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20   zColl = 0;.    
1de60 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  if( pListItem->p
1de70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
1de80 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 6e  LATE ){.      in
1de90 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a  t nColl;.      z
1dea0 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d  Coll = pListItem
1deb0 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ->pExpr->u.zToke
1dec0 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d  n;.      nColl =
1ded0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1dee0 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20  (zColl) + 1;.   
1def0 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72     assert( nExtr
1df00 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  a>=nColl );.    
1df10 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c    memcpy(zExtra,
1df20 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a   zColl, nColl);.
1df30 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45        zColl = zE
1df40 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78 74  xtra;.      zExt
1df50 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20  ra += nColl;.   
1df60 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f     nExtra -= nCo
1df70 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ll;.    }else if
1df80 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( j>=0 ){.      
1df90 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43  zColl = pTab->aC
1dfa0 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[j].zColl;.   
1dfb0 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c   }.    if( !zCol
1dfc0 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  l ) zColl = sqli
1dfd0 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20  te3StrBINARY;.  
1dfe0 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
1dff0 62 75 73 79 20 26 26 20 21 73 71 6c 69 74 65 33  busy && !sqlite3
1e000 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
1e010 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  arse, zColl) ){.
1e020 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1e030 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1e040 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
1e050 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c  azColl[i] = zCol
1e060 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65 64  l;.    requested
1e070 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73  SortOrder = pLis
1e080 74 49 74 65 6d 2d 3e 73 6f 72 74 46 6c 61 67 73  tItem->sortFlags
1e090 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b   & sortOrderMask
1e0a0 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53  ;.    pIndex->aS
1e0b0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75  ortOrder[i] = (u
1e0c0 38 29 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  8)requestedSortO
1e0d0 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rder;.  }..  /* 
1e0e0 41 70 70 65 6e 64 20 74 68 65 20 74 61 62 6c 65  Append the table
1e0f0 20 6b 65 79 20 74 6f 20 74 68 65 20 65 6e 64 20   key to the end 
1e100 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 46  of the index.  F
1e110 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
1e120 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 28 77 68  .  ** tables (wh
1e130 65 6e 20 70 50 6b 21 3d 30 29 20 74 68 69 73 20  en pPk!=0) this 
1e140 77 69 6c 6c 20 62 65 20 74 68 65 20 64 65 63 6c  will be the decl
1e150 61 72 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59  ared PRIMARY KEY
1e160 2e 20 20 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d  .  For.  ** norm
1e170 61 6c 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20  al tables (when 
1e180 70 50 6b 3d 3d 30 29 20 74 68 69 73 20 77 69 6c  pPk==0) this wil
1e190 6c 20 62 65 20 74 68 65 20 72 6f 77 69 64 2e 0a  l be the rowid..
1e1a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 6b 20 29    */.  if( pPk )
1e1b0 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
1e1c0 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  <pPk->nKeyCol; j
1e1d0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  ++){.      int x
1e1e0 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
1e1f0 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  [j];.      asser
1e200 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20  t( x>=0 );.     
1e210 20 69 66 28 20 69 73 44 75 70 43 6f 6c 75 6d 6e   if( isDupColumn
1e220 28 70 49 6e 64 65 78 2c 20 70 49 6e 64 65 78 2d  (pIndex, pIndex-
1e230 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2c 20 6a  >nKeyCol, pPk, j
1e240 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  ) ){.        pIn
1e250 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20  dex->nColumn--; 
1e260 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e270 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e280 68 61 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78  hasColumn(pIndex
1e290 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 70 49 6e 64 65  ->aiColumn,pInde
1e2a0 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 78 29 20 29 3b  x->nKeyCol,x) );
1e2b0 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1e2c0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78  >aiColumn[i] = x
1e2d0 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ;.        pIndex
1e2e0 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50  ->azColl[i] = pP
1e2f0 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  k->azColl[j];.  
1e300 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53        pIndex->aS
1e310 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 50  ortOrder[i] = pP
1e320 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  k->aSortOrder[j]
1e330 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20  ;.        i++;. 
1e340 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1e350 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 6e 64   assert( i==pInd
1e360 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  ex->nColumn );. 
1e370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64   }else{.    pInd
1e380 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
1e390 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20  = XN_ROWID;.    
1e3a0 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
1e3b0 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49  ] = sqlite3StrBI
1e3c0 4e 41 52 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  NARY;.  }.  sqli
1e3d0 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
1e3e0 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28 20  (pIndex);.  if( 
1e3f0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
1e400 65 3d 3d 30 20 29 20 65 73 74 69 6d 61 74 65 49  e==0 ) estimateI
1e410 6e 64 65 78 57 69 64 74 68 28 70 49 6e 64 65 78  ndexWidth(pIndex
1e420 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1e430 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73 20   index contains 
1e440 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  every column of 
1e450 69 74 73 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  its table, then 
1e460 6d 61 72 6b 0a 20 20 2a 2a 20 69 74 20 61 73 20  mark.  ** it as 
1e470 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
1e480 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 48 61   */.  assert( Ha
1e490 73 52 6f 77 69 64 28 70 54 61 62 29 20 0a 20 20  sRowid(pTab) .  
1e4a0 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 69 50 4b      || pTab->iPK
1e4b0 65 79 3c 30 20 7c 7c 20 73 71 6c 69 74 65 33 54  ey<0 || sqlite3T
1e4c0 61 62 6c 65 43 6f 6c 75 6d 6e 54 6f 49 6e 64 65  ableColumnToInde
1e4d0 78 28 70 49 6e 64 65 78 2c 20 70 54 61 62 2d 3e  x(pIndex, pTab->
1e4e0 69 50 4b 65 79 29 3e 3d 30 20 29 3b 0a 20 20 72  iPKey)>=0 );.  r
1e4f0 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e  ecomputeColumnsN
1e500 6f 74 49 6e 64 65 78 65 64 28 70 49 6e 64 65 78  otIndexed(pIndex
1e510 29 3b 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  );.  if( pTblNam
1e520 65 21 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e  e!=0 && pIndex->
1e530 6e 43 6f 6c 75 6d 6e 3e 3d 70 54 61 62 2d 3e 6e  nColumn>=pTab->n
1e540 43 6f 6c 20 29 7b 0a 20 20 20 20 70 49 6e 64 65  Col ){.    pInde
1e550 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20  x->isCovering = 
1e560 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  1;.    for(j=0; 
1e570 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
1e580 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 3d  +){.      if( j=
1e590 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 20 63  =pTab->iPKey ) c
1e5a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
1e5b0 66 28 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43  f( sqlite3TableC
1e5c0 6f 6c 75 6d 6e 54 6f 49 6e 64 65 78 28 70 49 6e  olumnToIndex(pIn
1e5d0 64 65 78 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e 74  dex,j)>=0 ) cont
1e5e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 49 6e 64  inue;.      pInd
1e5f0 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d  ex->isCovering =
1e600 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
1e610 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1e620 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e  ( pTab==pParse->
1e630 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20  pNewTable ){.   
1e640 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
1e650 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
1e660 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75   to create an au
1e670 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73  tomatic index as
1e680 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74   a.    ** result
1e690 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45   of a PRIMARY KE
1e6a0 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
1e6b0 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64  se on a column d
1e6c0 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20  efinition, or.  
1e6d0 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b    ** a PRIMARY K
1e6e0 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
1e6f0 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  use following th
1e700 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  e column definit
1e710 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65  ions..    ** i.e
1e720 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a  . one of:.    **
1e730 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
1e740 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59  ABLE t(x PRIMARY
1e750 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a   KEY, y);.    **
1e760 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
1e770 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20  x, y, UNIQUE(x, 
1e780 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  y));.    **.    
1e790 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63  ** Either way, c
1e7a0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
1e7b0 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
1e7c0 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64   has such an ind
1e7d0 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f  ex. If.    ** so
1e7e0 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63  , don't bother c
1e7f0 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65  reating this one
1e800 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c  . This only appl
1e810 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75  ies to.    ** au
1e820 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61  tomatically crea
1e830 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65  ted indices. Use
1e840 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65  rs can do as the
1e850 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20  y wish with.    
1e860 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69  ** explicit indi
1e870 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ces..    **.    
1e880 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f 72  ** Two UNIQUE or
1e890 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
1e8a0 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 6e  straints are con
1e8b0 73 69 64 65 72 65 64 20 65 71 75 69 76 61 6c 65  sidered equivale
1e8c0 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20 74  nt.    ** (and t
1e8d0 68 75 73 20 73 75 70 70 72 65 73 73 69 6e 67 20  hus suppressing 
1e8e0 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20  the second one) 
1e8f0 65 76 65 6e 20 69 66 20 74 68 65 79 20 68 61 76  even if they hav
1e900 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20  e different.    
1e910 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a  ** sort orders..
1e920 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
1e930 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65   there are diffe
1e940 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  rent collating s
1e950 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20 74  equences or if t
1e960 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  he columns of.  
1e970 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72 61    ** the constra
1e980 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69 66  int occur in dif
1e990 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20 74  ferent orders, t
1e9a0 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69  hen the constrai
1e9b0 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 63  nts are.    ** c
1e9c0 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74 69 6e  onsidered distin
1e9d0 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73 75  ct and both resu
1e9e0 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65 20 69  lt in separate i
1e9f0 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  ndices..    */. 
1ea00 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
1ea10 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
1ea20 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
1ea30 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
1ea40 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b  t){.      int k;
1ea50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49  .      assert( I
1ea60 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
1ea70 78 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  x) );.      asse
1ea80 72 74 28 20 70 49 64 78 2d 3e 69 64 78 54 79 70  rt( pIdx->idxTyp
1ea90 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e!=SQLITE_IDXTYP
1eaa0 45 5f 41 50 50 44 45 46 20 29 3b 0a 20 20 20 20  E_APPDEF );.    
1eab0 20 20 61 73 73 65 72 74 28 20 49 73 55 6e 69 71    assert( IsUniq
1eac0 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20  ueIndex(pIndex) 
1ead0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49  );..      if( pI
1eae0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e  dx->nKeyCol!=pIn
1eaf0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63  dex->nKeyCol ) c
1eb00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
1eb10 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e  or(k=0; k<pIdx->
1eb20 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20  nKeyCol; k++){. 
1eb30 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
1eb40 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20 63  r *z1;.        c
1eb50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20  onst char *z2;. 
1eb60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1eb70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  Idx->aiColumn[k]
1eb80 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
1eb90 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
1eba0 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69  n[k]!=pIndex->ai
1ebb0 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61  Column[k] ) brea
1ebc0 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20  k;.        z1 = 
1ebd0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b  pIdx->azColl[k];
1ebe0 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 49  .        z2 = pI
1ebf0 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b  ndex->azColl[k];
1ec00 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1ec10 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20  ite3StrICmp(z1, 
1ec20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  z2) ) break;.   
1ec30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b     }.      if( k
1ec40 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  ==pIdx->nKeyCol 
1ec50 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1ec60 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49  Idx->onError!=pI
1ec70 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b  ndex->onError ){
1ec80 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
1ec90 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72  is constraint cr
1eca0 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69  eates the same i
1ecb0 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f  ndex as a previo
1ecc0 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  us.          ** 
1ecd0 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69  constraint speci
1ece0 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69  fied somewhere i
1ecf0 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
1ed00 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  LE statement..  
1ed10 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76          ** Howev
1ed20 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49  er the ON CONFLI
1ed30 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64  CT clauses are d
1ed40 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74  ifferent. If bot
1ed50 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  h this .        
1ed60 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
1ed70 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73  and the previous
1ed80 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73   equivalent cons
1ed90 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c  traint have expl
1eda0 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a  icit.          *
1edb0 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  * ON CONFLICT cl
1edc0 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e  auses this is an
1edd0 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73   error. Otherwis
1ede0 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  e, use the.     
1edf0 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74       ** explicit
1ee00 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68  ly specified beh
1ee10 61 76 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e  avior for the in
1ee20 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
1ee30 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
1ee40 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  !(pIdx->onError=
1ee50 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70  =OE_Default || p
1ee60 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
1ee70 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20  OE_Default) ){. 
1ee80 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1ee90 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1eea0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
1eeb0 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67      "conflicting
1eec0 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
1eed0 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c  uses specified",
1eee0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
1eef0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1ef00 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
1ef10 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  _Default ){.    
1ef20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e          pIdx->on
1ef30 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e  Error = pIndex->
1ef40 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  onError;.       
1ef50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1ef60 20 20 20 20 20 20 20 69 66 28 20 69 64 78 54 79         if( idxTy
1ef70 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe==SQLITE_IDXTY
1ef80 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 20  PE_PRIMARYKEY ) 
1ef90 70 49 64 78 2d 3e 69 64 78 54 79 70 65 20 3d 20  pIdx->idxType = 
1efa0 69 64 78 54 79 70 65 3b 0a 20 20 20 20 20 20 20  idxType;.       
1efb0 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
1efc0 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20  BJECT ){.       
1efd0 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
1efe0 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49   = pParse->pNewI
1eff0 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20  ndex;.          
1f000 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65  pParse->pNewInde
1f010 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  x = pIndex;.    
1f020 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30        pIndex = 0
1f030 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f040 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1f050 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1f060 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1f070 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f   if( !IN_RENAME_
1f080 4f 42 4a 45 43 54 20 29 7b 0a 0a 20 20 20 20 2f  OBJECT ){..    /
1f090 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49  * Link the new I
1f0a0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74  ndex structure t
1f0b0 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20  o its table and 
1f0c0 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 20  to the other.   
1f0d0 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   ** in-memory da
1f0e0 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
1f0f0 73 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  s. .    */.    a
1f100 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1f110 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  Err==0 );.    if
1f120 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
1f130 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  ){.      Index *
1f140 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
1f150 20 21 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52   !IN_SPECIAL_PAR
1f160 53 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  SE );.      asse
1f170 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
1f180 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
1f190 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
1f1a0 61 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  a) );.      if( 
1f1b0 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  pTblName!=0 ){. 
1f1c0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74         pIndex->t
1f1d0 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
1f1e0 65 77 54 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20  ewTnum;.        
1f1f0 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
1f200 48 61 73 44 75 70 6c 69 63 61 74 65 52 6f 6f 74  HasDuplicateRoot
1f210 50 61 67 65 28 70 49 6e 64 65 78 29 20 29 7b 0a  Page(pIndex) ){.
1f220 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1f230 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1f240 2c 20 22 69 6e 76 61 6c 69 64 20 72 6f 6f 74 70  , "invalid rootp
1f250 61 67 65 22 29 3b 0a 20 20 20 20 20 20 20 20 20  age");.         
1f260 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
1f270 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1f280 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
1f290 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1f2a0 64 65 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  dex;.        }. 
1f2b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 20 3d       }.      p =
1f2c0 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
1f2d0 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt(&pIndex->pSch
1f2e0 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20  ema->idxHash, . 
1f2f0 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d           pIndex-
1f300 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 29 3b  >zName, pIndex);
1f310 0a 20 20 20 20 20 20 69 66 28 20 70 20 29 7b 0a  .      if( p ){.
1f320 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1f330 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a  p==pIndex );  /*
1f340 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
1f350 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  e failed */.    
1f360 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
1f370 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ult(db);.       
1f380 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1f390 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
1f3a0 0a 20 20 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c  .      db->mDbFl
1f3b0 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63  ags |= DBFLAG_Sc
1f3c0 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 20 20  hemaChange;.    
1f3d0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
1f3e0 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
1f3f0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
1f400 61 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45 41  atement (or CREA
1f410 54 45 20 54 41 42 4c 45 20 69 66 20 74 68 65 0a  TE TABLE if the.
1f420 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20      ** index is 
1f430 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78  an implied index
1f440 20 66 6f 72 20 61 20 55 4e 49 51 55 45 20 6f 72   for a UNIQUE or
1f450 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
1f460 73 74 72 61 69 6e 74 29 20 74 68 65 6e 0a 20 20  straint) then.  
1f470 20 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20 74    ** emit code t
1f480 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  o allocate the i
1f490 6e 64 65 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e  ndex rootpage on
1f4a0 20 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61   disk and make a
1f4b0 6e 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20 20  n entry for.    
1f4c0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  ** the index in 
1f4d0 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
1f4e0 72 20 74 61 62 6c 65 20 61 6e 64 20 70 6f 70 75  r table and popu
1f4f0 6c 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 77  late the index w
1f500 69 74 68 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65  ith.    ** conte
1f510 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74  nt.  But, do not
1f520 20 64 6f 20 74 68 69 73 20 69 66 20 77 65 20 61   do this if we a
1f530 72 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69 6e  re simply readin
1f540 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
1f550 74 65 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ter.    ** table
1f560 20 74 6f 20 70 61 72 73 65 20 74 68 65 20 73 63   to parse the sc
1f570 68 65 6d 61 2c 20 6f 72 20 69 66 20 74 68 69 73  hema, or if this
1f580 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 50 52   index is the PR
1f590 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a  IMARY KEY index.
1f5a0 20 20 20 20 2a 2a 20 6f 66 20 61 20 57 49 54 48      ** of a WITH
1f5b0 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e  OUT ROWID table.
1f5c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1f5d0 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74  f pTblName==0 it
1f5e0 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65   means this inde
1f5f0 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  x is generated a
1f600 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52 49  s an implied PRI
1f610 4d 41 52 59 20 4b 45 59 0a 20 20 20 20 2a 2a 20  MARY KEY.    ** 
1f620 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20  or UNIQUE index 
1f630 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
1f640 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69  E statement.  Si
1f650 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  nce the table.  
1f660 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65    ** has just be
1f670 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63  en created, it c
1f680 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20  ontains no data 
1f690 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e  and the index in
1f6a0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20  itialization.   
1f6b0 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20   ** step can be 
1f6c0 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a  skipped..    */.
1f6d0 20 20 20 20 65 6c 73 65 20 69 66 28 20 48 61 73      else if( Has
1f6e0 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 70  Rowid(pTab) || p
1f6f0 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  TblName!=0 ){.  
1f700 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
1f710 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a     char *zStmt;.
1f720 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d        int iMem =
1f730 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1f740 0a 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69  ..      v = sqli
1f750 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1f760 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76 3d  e);.      if( v=
1f770 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
1f780 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20  reate_index;..  
1f790 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
1f7a0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
1f7b0 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
1f7c0 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  .      /* Create
1f7d0 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f   the rootpage fo
1f7e0 72 20 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e  r the index usin
1f7f0 67 20 43 72 65 61 74 65 49 6e 64 65 78 2e 20 42  g CreateIndex. B
1f800 75 74 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20  ut before.      
1f810 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f 64  ** doing so, cod
1f820 65 20 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75 63  e a Noop instruc
1f830 74 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 69  tion and store i
1f840 74 73 20 61 64 64 72 65 73 73 20 69 6e 20 0a 20  ts address in . 
1f850 20 20 20 20 20 2a 2a 20 49 6e 64 65 78 2e 74 6e       ** Index.tn
1f860 75 6d 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  um. This is requ
1f870 69 72 65 64 20 69 6e 20 63 61 73 65 20 74 68 69  ired in case thi
1f880 73 20 69 6e 64 65 78 20 69 73 20 61 63 74 75 61  s index is actua
1f890 6c 6c 79 20 61 20 0a 20 20 20 20 20 20 2a 2a 20  lly a .      ** 
1f8a0 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20  PRIMARY KEY and 
1f8b0 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 63 74  the table is act
1f8c0 75 61 6c 6c 79 20 61 20 57 49 54 48 4f 55 54 20  ually a WITHOUT 
1f8d0 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 49 6e 20  ROWID table. In 
1f8e0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63  .      ** that c
1f8f0 61 73 65 20 74 68 65 20 63 6f 6e 76 65 72 74 54  ase the convertT
1f900 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62  oWithoutRowidTab
1f910 6c 65 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  le() routine wil
1f920 6c 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20  l replace.      
1f930 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69 74 68  ** the Noop with
1f940 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20   a Goto to jump 
1f950 6f 76 65 72 20 74 68 65 20 56 44 42 45 20 63 6f  over the VDBE co
1f960 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 65 6c  de generated bel
1f970 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 6e  ow. */.      pIn
1f980 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69  dex->tnum = sqli
1f990 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
1f9a0 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 20   OP_Noop);.     
1f9b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f9c0 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 42  p3(v, OP_CreateB
1f9d0 74 72 65 65 2c 20 69 44 62 2c 20 69 4d 65 6d 2c  tree, iDb, iMem,
1f9e0 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b   BTREE_BLOBKEY);
1f9f0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 61 74 68 65  ..      /* Gathe
1fa00 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  r the complete t
1fa10 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
1fa20 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
1fa30 74 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20  t into.      ** 
1fa40 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62  the zStmt variab
1fa50 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  le.      */.    
1fa60 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 21    assert( pName!
1fa70 3d 30 20 7c 7c 20 70 53 74 61 72 74 3d 3d 30 20  =0 || pStart==0 
1fa80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 74  );.      if( pSt
1fa90 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  art ){.        i
1faa0 6e 74 20 6e 20 3d 20 28 69 6e 74 29 28 70 50 61  nt n = (int)(pPa
1fab0 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e  rse->sLastToken.
1fac0 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20  z - pName->z) + 
1fad0 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
1fae0 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 20 20 69 66  en.n;.        if
1faf0 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d  ( pName->z[n-1]=
1fb00 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20  =';' ) n--;.    
1fb10 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69      /* A named i
1fb20 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70  ndex with an exp
1fb30 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44  licit CREATE IND
1fb40 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EX statement */.
1fb50 20 20 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20          zStmt = 
1fb60 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
1fb70 62 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e 44  b, "CREATE%s IND
1fb80 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20  EX %.*s",.      
1fb90 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f        onError==O
1fba0 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20  E_None ? "" : " 
1fbb0 55 4e 49 51 55 45 22 2c 20 6e 2c 20 70 4e 61 6d  UNIQUE", n, pNam
1fbc0 65 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  e->z);.      }el
1fbd0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  se{.        /* A
1fbe0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
1fbf0 78 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50  x created by a P
1fc00 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
1fc10 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
1fc20 2a 2f 0a 20 20 20 20 20 20 20 20 2f 2a 20 7a 53  */.        /* zS
1fc30 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
1fc40 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20  intf(""); */.   
1fc50 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a       zStmt = 0;.
1fc60 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1fc70 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69  * Add an entry i
1fc80 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  n sqlite_master 
1fc90 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20  for this index. 
1fca0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
1fcb0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
1fcc0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
1fcd0 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
1fce0 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69   %Q.%s VALUES('i
1fcf0 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c  ndex',%Q,%Q,#%d,
1fd00 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 20  %Q);",.         
1fd10 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
1fd20 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e  bSName, MASTER_N
1fd30 41 4d 45 2c 0a 20 20 20 20 20 20 20 20 20 20 70  AME,.          p
1fd40 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  Index->zName,.  
1fd50 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
1fd60 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 69  ame,.          i
1fd70 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 7a  Mem,.          z
1fd80 53 74 6d 74 0a 20 20 20 20 20 20 20 20 20 20 29  Stmt.          )
1fd90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
1fda0 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29  bFree(db, zStmt)
1fdb0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c  ;..      /* Fill
1fdc0 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
1fdd0 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65  data and reparse
1fde0 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64   the schema. Cod
1fdf0 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20  e an OP_Expire. 
1fe00 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c       ** to inval
1fe10 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f  idate all pre-co
1fe20 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
1fe30 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
1fe40 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29    if( pTblName )
1fe50 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1fe60 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
1fe70 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65  rse, pIndex, iMe
1fe80 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
1fe90 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
1fea0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
1feb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1fec0 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f  eAddParseSchemaO
1fed0 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20  p(v, iDb,.      
1fee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
1fef0 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27  intf(db, "name='
1ff00 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e  %q' AND type='in
1ff10 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a  dex'", pIndex->z
1ff20 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
1ff30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ff40 32 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20  2(v, OP_Expire, 
1ff50 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  0, 1);.      }..
1ff60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ff70 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
1ff80 64 65 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20  dex->tnum);.    
1ff90 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  }.  }..  /* When
1ffa0 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78   adding an index
1ffb0 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
1ffc0 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61  indices for a ta
1ffd0 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  ble, make.  ** s
1ffe0 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ure all indices 
1fff0 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61  labeled OE_Repla
20000 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c  ce come after al
20010 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a  l those labeled.
20020 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20    ** OE_Ignore. 
20030 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
20040 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ry for the corre
20050 63 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68  ct constraint ch
20060 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  eck.  ** process
20070 69 6e 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47  ing (in sqlite3G
20080 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e  enerateConstrain
20090 74 43 68 65 63 6b 73 28 29 29 20 61 73 20 70 61  tChecks()) as pa
200a0 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54  rt of.  ** UPDAT
200b0 45 20 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61  E and INSERT sta
200c0 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a  tements.  .  */.
200d0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
200e0 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d  usy || pTblName=
200f0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e  =0 ){.    if( on
20100 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
20110 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
20120 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  x==0.         ||
20130 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
20140 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
20150 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  ce){.      pInde
20160 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
20170 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70  >pIndex;.      p
20180 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  Tab->pIndex = pI
20190 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ndex;.    }else{
201a0 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  .      Index *pO
201b0 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
201c0 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  dex;.      while
201d0 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20  ( pOther->pNext 
201e0 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  && pOther->pNext
201f0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ->onError!=OE_Re
20200 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  place ){.       
20210 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
20220 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
20230 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
20240 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
20250 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68  Next;.      pOth
20260 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64  er->pNext = pInd
20270 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
20280 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ndex = 0;.  }.  
20290 65 6c 73 65 20 69 66 28 20 49 4e 5f 52 45 4e 41  else if( IN_RENA
202a0 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
202b0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
202c0 3e 70 4e 65 77 49 6e 64 65 78 3d 3d 30 20 29 3b  >pNewIndex==0 );
202d0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  .    pParse->pNe
202e0 77 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b  wIndex = pIndex;
202f0 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b  .    pIndex = 0;
20300 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
20310 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69   up before exiti
20320 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74  ng */.exit_creat
20330 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70  e_index:.  if( p
20340 49 6e 64 65 78 20 29 20 73 71 6c 69 74 65 33 46  Index ) sqlite3F
20350 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  reeIndex(db, pIn
20360 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  dex);.  sqlite3E
20370 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 50  xprDelete(db, pP
20380 49 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  IWhere);.  sqlit
20390 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
203a0 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73  (db, pList);.  s
203b0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
203c0 65 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65  ete(db, pTblName
203d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
203e0 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d  ee(db, zName);.}
203f0 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65  ../*.** Fill the
20400 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b   Index.aiRowEst[
20410 5d 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66  ] array with def
20420 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ault information
20430 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a   - information.*
20440 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65  * to be used whe
20450 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75  n we have not ru
20460 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f  n the ANALYZE co
20470 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52  mmand..**.** aiR
20480 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70  owEst[0] is supp
20490 6f 73 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  osed to contain 
204a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
204b0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  ements in the in
204c0 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65  dex..** Since we
204d0 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75   do not know, gu
204e0 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20  ess 1 million.  
204f0 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61  aiRowEst[1] is a
20500 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
20510 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
20520 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
20530 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
20540 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65  particular value
20550 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   of the.** first
20560 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
20570 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b  ndex.  aiRowEst[
20580 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  2] is an estimat
20590 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a  e of the number.
205a0 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  ** of rows that 
205b0 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
205c0 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ular combination
205d0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20   of the first 2 
205e0 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68  columns.** of th
205f0 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f  e index.  And so
20600 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74   forth.  It must
20610 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63   always be the c
20620 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20  ase that.*.**   
20630 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
20640 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d  [N]<=aiRowEst[N-
20650 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  1].**           
20660 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a  aiRowEst[N]>=1.*
20670 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20  *.** Apart from 
20680 74 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69  that, we have li
20690 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65  ttle to go on be
206a0 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20  sides intuition 
206b0 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52  as to.** how aiR
206c0 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62  owEst[] should b
206d0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  e initialized.  
206e0 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65  The numbers gene
206f0 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72  rated here.** ar
20700 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63  e based on typic
20710 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20  al values found 
20720 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65  in actual indice
20730 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
20740 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28  e3DefaultRowEst(
20750 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
20760 2f 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /*              
20770 20 20 31 30 2c 20 20 39 2c 20 20 38 2c 20 20 37    10,  9,  8,  7
20780 2c 20 20 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  ,  6 */.  LogEst
20790 20 61 56 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20   aVal[] = { 33, 
207a0 33 32 2c 20 33 30 2c 20 32 38 2c 20 32 36 20 7d  32, 30, 28, 26 }
207b0 3b 0a 20 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20  ;.  LogEst *a = 
207c0 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  pIdx->aiRowLogEs
207d0 74 3b 0a 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d  t;.  int nCopy =
207e0 20 4d 49 4e 28 41 72 72 61 79 53 69 7a 65 28 61   MIN(ArraySize(a
207f0 56 61 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  Val), pIdx->nKey
20800 43 6f 6c 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Col);.  int i;..
20810 20 20 2f 2a 20 49 6e 64 65 78 65 73 20 77 69 74    /* Indexes wit
20820 68 20 64 65 66 61 75 6c 74 20 72 6f 77 20 65 73  h default row es
20830 74 69 6d 61 74 65 73 20 73 68 6f 75 6c 64 20 6e  timates should n
20840 6f 74 20 68 61 76 65 20 73 74 61 74 31 20 64 61  ot have stat1 da
20850 74 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ta */.  assert( 
20860 21 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20  !pIdx->hasStat1 
20870 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
20880 20 66 69 72 73 74 20 65 6e 74 72 79 20 28 6e 75   first entry (nu
20890 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
208a0 74 68 65 20 69 6e 64 65 78 29 20 74 6f 20 74 68  the index) to th
208b0 65 20 65 73 74 69 6d 61 74 65 64 20 0a 20 20 2a  e estimated .  *
208c0 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
208d0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 6f   in the table, o
208e0 72 20 68 61 6c 66 20 74 68 65 20 6e 75 6d 62 65  r half the numbe
208f0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
20900 20 74 61 62 6c 65 0a 20 20 2a 2a 20 66 6f 72 20   table.  ** for 
20910 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e  a partial index.
20920 20 20 20 42 75 74 20 64 6f 20 6e 6f 74 20 6c 65     But do not le
20930 74 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 64  t the estimate d
20940 72 6f 70 20 62 65 6c 6f 77 20 31 30 2e 20 2a 2f  rop below 10. */
20950 0a 20 20 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e  .  a[0] = pIdx->
20960 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45  pTable->nRowLogE
20970 73 74 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e  st;.  if( pIdx->
20980 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30  pPartIdxWhere!=0
20990 20 29 20 61 5b 30 5d 20 2d 3d 20 31 30 3b 20 20   ) a[0] -= 10;  
209a0 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69  assert( 10==sqli
209b0 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a  te3LogEst(2) );.
209c0 20 20 69 66 28 20 61 5b 30 5d 3c 33 33 20 29 20    if( a[0]<33 ) 
209d0 61 5b 30 5d 20 3d 20 33 33 3b 20 20 20 20 20 20  a[0] = 33;      
209e0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
209f0 72 74 28 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c  rt( 33==sqlite3L
20a00 6f 67 45 73 74 28 31 30 29 20 29 3b 0a 0a 20 20  ogEst(10) );..  
20a10 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 61 74  /* Estimate that
20a20 20 61 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b 32   a[1] is 10, a[2
20a30 5d 20 69 73 20 39 2c 20 61 5b 33 5d 20 69 73 20  ] is 9, a[3] is 
20a40 38 2c 20 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b  8, a[4] is 7, a[
20a50 35 5d 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64  5] is.  ** 6 and
20a60 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
20a70 20 76 61 6c 75 65 20 28 69 66 20 61 6e 79 29 20   value (if any) 
20a80 69 73 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63  is 5.  */.  memc
20a90 70 79 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20  py(&a[1], aVal, 
20aa0 6e 43 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67  nCopy*sizeof(Log
20ab0 45 73 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e  Est));.  for(i=n
20ac0 43 6f 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d  Copy+1; i<=pIdx-
20ad0 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nKeyCol; i++){.
20ae0 20 20 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20      a[i] = 23;  
20af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b00 20 20 61 73 73 65 72 74 28 20 32 33 3d 3d 73 71    assert( 23==sq
20b10 6c 69 74 65 33 4c 6f 67 45 73 74 28 35 29 20 29  lite3LogEst(5) )
20b20 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
20b30 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73   0==sqlite3LogEs
20b40 74 28 31 29 20 29 3b 0a 20 20 69 66 28 20 49 73  t(1) );.  if( Is
20b50 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
20b60 29 20 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79  ) ) a[pIdx->nKey
20b70 43 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Col] = 0;.}../*.
20b80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20b90 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69  will drop an exi
20ba0 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65  sting named inde
20bb0 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  x.  This routine
20bc0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  .** implements t
20bd0 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74  he DROP INDEX st
20be0 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
20bf0 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65   sqlite3DropInde
20c00 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
20c10 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
20c20 20 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a   int ifExists){.
20c30 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
20c40 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
20c50 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
20c60 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
20c70 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  b;..  assert( pP
20c80 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
20c90 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c     /* Never call
20ca0 65 64 20 77 69 74 68 20 70 72 69 6f 72 20 65 72  ed with prior er
20cb0 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62  rors */.  if( db
20cc0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
20cd0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
20ce0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
20cf0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
20d00 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66  >nSrc==1 );.  if
20d10 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
20d20 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
20d30 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
20d40 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
20d50 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  ex;.  }.  pIndex
20d60 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
20d70 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61  dex(db, pName->a
20d80 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [0].zName, pName
20d90 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
20da0 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d  );.  if( pIndex=
20db0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69  =0 ){.    if( !i
20dc0 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20  fExists ){.     
20dd0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
20de0 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
20df0 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e  h index: %S", pN
20e00 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ame, 0);.    }el
20e10 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
20e20 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64  3CodeVerifyNamed
20e30 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70  Schema(pParse, p
20e40 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
20e50 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  base);.    }.   
20e60 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
20e70 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f  hema = 1;.    go
20e80 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
20e90 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  ex;.  }.  if( pI
20ea0 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53  ndex->idxType!=S
20eb0 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50  QLITE_IDXTYPE_AP
20ec0 50 44 45 46 20 29 7b 0a 20 20 20 20 73 71 6c 69  PDEF ){.    sqli
20ed0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
20ee0 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63  se, "index assoc
20ef0 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55  iated with UNIQU
20f00 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52  E ".      "or PR
20f10 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
20f20 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64  aint cannot be d
20f30 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20  ropped", 0);.   
20f40 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
20f50 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62  index;.  }.  iDb
20f60 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
20f70 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  ToIndex(db, pInd
20f80 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69  ex->pSchema);.#i
20f90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20fa0 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
20fb0 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
20fc0 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49   = SQLITE_DROP_I
20fd0 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20  NDEX;.    Table 
20fe0 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
20ff0 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  pTable;.    cons
21000 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
21010 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
21020 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
21030 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
21040 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
21050 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
21060 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
21070 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
21080 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Tab, 0, zDb) ){.
21090 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
210a0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
210b0 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  }.    if( !OMIT_
210c0 54 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20  TEMPDB && iDb ) 
210d0 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
210e0 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  OP_TEMP_INDEX;. 
210f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
21100 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
21110 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  code, pIndex->zN
21120 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
21130 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
21140 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
21150 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
21160 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
21170 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
21180 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
21190 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
211a0 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
211b0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
211c0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
211d0 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
211e0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
211f0 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
21200 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
21210 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
21220 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45  se,.       "DELE
21230 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
21240 45 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20  ERE name=%Q AND 
21250 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20  type='index'",. 
21260 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
21270 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53  b].zDbSName, MAS
21280 54 45 52 5f 4e 41 4d 45 2c 20 70 49 6e 64 65 78  TER_NAME, pIndex
21290 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
212a0 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53     sqlite3ClearS
212b0 74 61 74 54 61 62 6c 65 73 28 70 50 61 72 73 65  tatTables(pParse
212c0 2c 20 69 44 62 2c 20 22 69 64 78 22 2c 20 70 49  , iDb, "idx", pI
212d0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  ndex->zName);.  
212e0 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
212f0 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
21300 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  b);.    destroyR
21310 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
21320 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44  pIndex->tnum, iD
21330 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
21340 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
21350 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20  DropIndex, iDb, 
21360 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  0, 0, pIndex->zN
21370 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78  ame, 0);.  }..ex
21380 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20  it_drop_index:. 
21390 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
213a0 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29  elete(db, pName)
213b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61  ;.}../*.** pArra
213c0 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
213d0 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62  o an array of ob
213e0 6a 65 63 74 73 2e 20 45 61 63 68 20 6f 62 6a 65  jects. Each obje
213f0 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72  ct in the.** arr
21400 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79  ay is szEntry by
21410 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 69  tes in size. Thi
21420 73 20 72 6f 75 74 69 6e 65 20 75 73 65 73 20 73  s routine uses s
21430 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
21440 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20 74  ).** to extend t
21450 68 65 20 61 72 72 61 79 20 73 6f 20 74 68 61 74  he array so that
21460 20 74 68 65 72 65 20 69 73 20 73 70 61 63 65 20   there is space 
21470 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a 65 63 74  for a new object
21480 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a   at the end..**.
21490 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
214a0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
214b0 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69   *pnEntry contai
214c0 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ns the current s
214d0 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72  ize of.** the ar
214e0 72 61 79 20 28 69 6e 20 65 6e 74 72 69 65 73 20  ray (in entries 
214f0 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  - so the allocat
21500 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74 72  ion is ((*pnEntr
21510 79 29 20 2a 20 73 7a 45 6e 74 72 79 29 20 62 79  y) * szEntry) by
21520 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29  tes.** in total)
21530 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
21540 65 61 6c 6c 6f 63 28 29 20 69 73 20 73 75 63 63  ealloc() is succ
21550 65 73 73 66 75 6c 20 28 69 2e 65 2e 20 69 66 20  essful (i.e. if 
21560 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  no OOM condition
21570 20 6f 63 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a   occurs), the.**
21580 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
21590 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6f 62 6a   for the new obj
215a0 65 63 74 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a  ect is zeroed, *
215b0 70 6e 45 6e 74 72 79 20 75 70 64 61 74 65 64 20  pnEntry updated 
215c0 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  to.** reflect th
215d0 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68  e new size of th
215e0 65 20 61 72 72 61 79 20 61 6e 64 20 61 20 70 6f  e array and a po
215f0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
21600 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72   allocation.** r
21610 65 74 75 72 6e 65 64 2e 20 2a 70 49 64 78 20 69  eturned. *pIdx i
21620 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  s set to the ind
21630 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20 61 72  ex of the new ar
21640 72 61 79 20 65 6e 74 72 79 20 69 6e 20 74 68 69  ray entry in thi
21650 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74  s case..**.** Ot
21660 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
21670 72 65 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c  realloc() fails,
21680 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f   *pIdx is set to
21690 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65   -1, *pnEntry re
216a0 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67  mains.** unchang
216b0 65 64 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  ed and a copy of
216c0 20 70 41 72 72 61 79 20 72 65 74 75 72 6e 65 64   pArray returned
216d0 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
216e0 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
216f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
21700 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
21710 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20  on to notify of 
21720 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20  malloc failures 
21730 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61  */.  void *pArra
21740 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  y,     /* Array 
21750 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67  of objects.  Mig
21760 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65  ht be reallocate
21770 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74  d */.  int szEnt
21780 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  ry,      /* Size
21790 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20   of each object 
217a0 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a  in the array */.
217b0 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20    int *pnEntry, 
217c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
217d0 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74   objects current
217e0 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69  ly in use */.  i
217f0 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  nt *pIdx        
21800 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e   /* Write the in
21810 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f  dex of a new slo
21820 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63  t here */.){.  c
21830 68 61 72 20 2a 7a 3b 0a 20 20 73 71 6c 69 74 65  har *z;.  sqlite
21840 33 5f 69 6e 74 36 34 20 6e 20 3d 20 2a 70 49 64  3_int64 n = *pId
21850 78 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20  x = *pnEntry;.  
21860 69 66 28 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d  if( (n & (n-1))=
21870 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
21880 33 5f 69 6e 74 36 34 20 73 7a 20 3d 20 28 6e 3d  3_int64 sz = (n=
21890 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20  =0) ? 1 : 2*n;. 
218a0 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20     void *pNew = 
218b0 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
218c0 28 64 62 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a  (db, pArray, sz*
218d0 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66  szEntry);.    if
218e0 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
218f0 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20     *pIdx = -1;. 
21900 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72       return pArr
21910 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41  ay;.    }.    pA
21920 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  rray = pNew;.  }
21930 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41  .  z = (char*)pA
21940 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26  rray;.  memset(&
21950 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20  z[n * szEntry], 
21960 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2b  0, szEntry);.  +
21970 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74  +*pnEntry;.  ret
21980 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f  urn pArray;.}../
21990 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
219a0 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
219b0 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20   given IdList.  
219c0 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c  Create a new IdL
219d0 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
219e0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49  e..**.** A new I
219f0 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  dList is returne
21a00 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
21a10 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
21a20 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
21a30 49 64 4c 69 73 74 41 70 70 65 6e 64 28 50 61 72  IdListAppend(Par
21a40 73 65 20 2a 70 50 61 72 73 65 2c 20 49 64 4c 69  se *pParse, IdLi
21a50 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
21a60 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 73 71 6c   *pToken){.  sql
21a70 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
21a80 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
21a90 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
21aa0 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
21ab0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
21ac0 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c  o(db, sizeof(IdL
21ad0 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
21ae0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
21af0 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
21b00 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72  ->a = sqlite3Arr
21b10 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
21b20 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73    db,.      pLis
21b30 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65  t->a,.      size
21b40 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c  of(pList->a[0]),
21b50 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e  .      &pList->n
21b60 49 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29  Id,.      &i.  )
21b70 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20  ;.  if( i<0 ){. 
21b80 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
21b90 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
21ba0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
21bb0 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b  .  }.  pList->a[
21bc0 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
21bd0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
21be0 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69  db, pToken);.  i
21bf0 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
21c00 45 43 54 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b  ECT && pList->a[
21c10 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
21c20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
21c30 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76  enMap(pParse, (v
21c40 6f 69 64 2a 29 70 4c 69 73 74 2d 3e 61 5b 69 5d  oid*)pList->a[i]
21c50 2e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b  .zName, pToken);
21c60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c  .  }.  return pL
21c70 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ist;.}../*.** De
21c80 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a  lete an IdList..
21c90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49  */.void sqlite3I
21ca0 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  dListDelete(sqli
21cb0 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
21cc0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
21cd0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
21ce0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
21cf0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
21d00 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
21d10 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
21d20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
21d30 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
21d40 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
21d50 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
21d60 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69  DbFreeNN(db, pLi
21d70 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
21d80 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
21d90 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69  n pList of the i
21da0 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20  dentifier named 
21db0 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  zId.  Return -1.
21dc0 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ** if not found.
21dd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
21de0 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73  dListIndex(IdLis
21df0 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20  t *pList, const 
21e00 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
21e10 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
21e20 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d  st==0 ) return -
21e30 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
21e40 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
21e50 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
21e60 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
21e70 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  a[i].zName, zNam
21e80 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  e)==0 ) return i
21e90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
21ea0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69  1;.}../*.** Maxi
21eb0 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 20 53 72  mum size of a Sr
21ec0 63 4c 69 73 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a  cList object..**
21ed0 20 54 68 65 20 53 72 63 4c 69 73 74 20 6f 62 6a   The SrcList obj
21ee0 65 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 72  ect is used to r
21ef0 65 70 72 65 73 65 6e 74 20 74 68 65 20 46 52 4f  epresent the FRO
21f00 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 0a 2a 2a  M clause of a.**
21f10 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
21f20 74 2c 20 61 6e 64 20 74 68 65 20 71 75 65 72 79  t, and the query
21f30 20 70 6c 61 6e 6e 65 72 20 63 61 6e 6e 6f 74 20   planner cannot 
21f40 64 65 61 6c 20 77 69 74 68 20 6d 6f 72 65 0a 2a  deal with more.*
21f50 2a 20 74 68 61 6e 20 36 34 20 74 61 62 6c 65 73  * than 64 tables
21f60 20 69 6e 20 61 20 6a 6f 69 6e 2e 20 20 53 6f 20   in a join.  So 
21f70 61 6e 79 20 76 61 6c 75 65 20 6c 61 72 67 65 72  any value larger
21f80 20 74 68 61 6e 20 36 34 20 68 65 72 65 0a 2a 2a   than 64 here.**
21f90 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 66   is sufficient f
21fa0 6f 72 20 6d 6f 73 74 20 75 73 65 73 2e 20 20 53  or most uses.  S
21fb0 6d 61 6c 6c 65 72 20 76 61 6c 75 65 73 2c 20 6c  maller values, l
21fc0 69 6b 65 20 73 61 79 20 31 30 2c 20 61 72 65 0a  ike say 10, are.
21fd0 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ** appropriate f
21fe0 6f 72 20 73 6d 61 6c 6c 20 61 6e 64 20 6d 65 6d  or small and mem
21ff0 6f 72 79 2d 6c 69 6d 69 74 65 64 20 61 70 70 6c  ory-limited appl
22000 69 63 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66  ications..*/.#if
22010 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ndef SQLITE_MAX_
22020 53 52 43 4c 49 53 54 0a 23 20 64 65 66 69 6e 65  SRCLIST.# define
22030 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c   SQLITE_MAX_SRCL
22040 49 53 54 20 32 30 30 0a 23 65 6e 64 69 66 0a 0a  IST 200.#endif..
22050 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65  /*.** Expand the
22060 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
22070 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
22080 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79  rcList object by
22090 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78  .** creating nEx
220a0 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65  tra new slots be
220b0 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72  ginning at iStar
220c0 74 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65  t.  iStart is ze
220d0 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77  ro based..** New
220e0 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65   slots are zeroe
220f0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  d..**.** For exa
22100 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20  mple, suppose a 
22110 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c  SrcList initiall
22120 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65  y contains two e
22130 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20  ntries: A,B..** 
22140 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20  To append 3 new 
22150 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65  entries onto the
22160 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a   end, do this:.*
22170 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53  *.**    sqlite3S
22180 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
22190 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32  , pSrclist, 3, 2
221a0 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  );.**.** After t
221b0 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74  he call above it
221c0 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20   would contain: 
221d0 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c   A, B, nil, nil,
221e0 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20   nil..** If the 
221f0 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20  iStart argument 
22200 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65  had been 1 inste
22210 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68  ad of 2, then th
22220 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c  e result.** woul
22230 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c  d have been:  A,
22240 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20   nil, nil, nil, 
22250 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74  B.  To prepend t
22260 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a  he new slots,.**
22270 20 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75   the iStart valu
22280 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54  e would be 0.  T
22290 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77  he result then w
222a0 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c  ould.** be: nil,
222b0 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e   nil, nil, A, B.
222c0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
222d0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
222e0 69 6c 73 20 6f 72 20 74 68 65 20 53 72 63 4c 69  ils or the SrcLi
222f0 73 74 20 62 65 63 6f 6d 65 73 20 74 6f 6f 20 6c  st becomes too l
22300 61 72 67 65 2c 20 6c 65 61 76 65 0a 2a 2a 20 74  arge, leave.** t
22310 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 72 63 4c  he original SrcL
22320 69 73 74 20 75 6e 63 68 61 6e 67 65 64 2c 20 72  ist unchanged, r
22330 65 74 75 72 6e 20 4e 55 4c 4c 2c 20 61 6e 64 20  eturn NULL, and 
22340 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
22350 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61  essage.** in pPa
22360 72 73 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  rse..*/.SrcList 
22370 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45  *sqlite3SrcListE
22380 6e 6c 61 72 67 65 28 0a 20 20 50 61 72 73 65 20  nlarge(.  Parse 
22390 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
223a0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
223b0 69 6e 74 6f 20 77 68 69 63 68 20 65 72 72 6f 72  into which error
223c0 73 20 61 72 65 20 72 65 70 6f 72 74 65 64 20 2a  s are reported *
223d0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
223e0 63 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 53 72  c,     /* The Sr
223f0 63 4c 69 73 74 20 74 6f 20 62 65 20 65 6e 6c 61  cList to be enla
22400 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  rged */.  int nE
22410 78 74 72 61 2c 20 20 20 20 20 20 20 20 2f 2a 20  xtra,        /* 
22420 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 73 6c  Number of new sl
22430 6f 74 73 20 74 6f 20 61 64 64 20 74 6f 20 70 53  ots to add to pS
22440 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74  rc->a[] */.  int
22450 20 69 53 74 61 72 74 20 20 20 20 20 20 20 20 20   iStart         
22460 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 53 72 63  /* Index in pSrc
22470 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e  ->a[] of first n
22480 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20  ew slot */.){.  
22490 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e  int i;..  /* San
224a0 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
224b0 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74 65  calling paramete
224c0 72 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  rs */.  assert( 
224d0 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61  iStart>=0 );.  a
224e0 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 31  ssert( nExtra>=1
224f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
22500 72 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  rc!=0 );.  asser
22510 74 28 20 69 53 74 61 72 74 3c 3d 70 53 72 63 2d  t( iStart<=pSrc-
22520 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41  >nSrc );..  /* A
22530 6c 6c 6f 63 61 74 65 20 61 64 64 69 74 69 6f 6e  llocate addition
22540 61 6c 20 73 70 61 63 65 20 69 66 20 6e 65 65 64  al space if need
22550 65 64 20 2a 2f 0a 20 20 69 66 28 20 28 75 33 32  ed */.  if( (u32
22560 29 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74  )pSrc->nSrc+nExt
22570 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20  ra>pSrc->nAlloc 
22580 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  ){.    SrcList *
22590 70 4e 65 77 3b 0a 20 20 20 20 73 71 6c 69 74 65  pNew;.    sqlite
225a0 33 5f 69 6e 74 36 34 20 6e 41 6c 6c 6f 63 20 3d  3_int64 nAlloc =
225b0 20 32 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   2*(sqlite3_int6
225c0 34 29 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78  4)pSrc->nSrc+nEx
225d0 74 72 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tra;.    sqlite3
225e0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
225f0 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  b;..    if( pSrc
22600 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e 3d 53  ->nSrc+nExtra>=S
22610 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53  QLITE_MAX_SRCLIS
22620 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T ){.      sqlit
22630 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
22640 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 46 52 4f  e, "too many FRO
22650 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2c 20  M clause terms, 
22660 6d 61 78 3a 20 25 64 22 2c 0a 20 20 20 20 20 20  max: %d",.      
22670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22680 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49  SQLITE_MAX_SRCLI
22690 53 54 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ST);.      retur
226a0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
226b0 66 28 20 6e 41 6c 6c 6f 63 3e 53 51 4c 49 54 45  f( nAlloc>SQLITE
226c0 5f 4d 41 58 5f 53 52 43 4c 49 53 54 20 29 20 6e  _MAX_SRCLIST ) n
226d0 41 6c 6c 6f 63 20 3d 20 53 51 4c 49 54 45 5f 4d  Alloc = SQLITE_M
226e0 41 58 5f 53 52 43 4c 49 53 54 3b 0a 20 20 20 20  AX_SRCLIST;.    
226f0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
22700 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63  Realloc(db, pSrc
22710 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22720 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b   sizeof(*pSrc) +
22730 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65   (nAlloc-1)*size
22740 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29  of(pSrc->a[0]) )
22750 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
22760 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
22770 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
22780 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
22790 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
227a0 20 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20   pSrc = pNew;.  
227b0 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d    pSrc->nAlloc =
227c0 20 6e 41 6c 6c 6f 63 3b 0a 20 20 7d 0a 0a 20 20   nAlloc;.  }..  
227d0 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67  /* Move existing
227e0 20 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65   slots that come
227f0 20 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79   after the newly
22800 20 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a   inserted slots.
22810 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20    ** out of the 
22820 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70  way */.  for(i=p
22830 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d  Src->nSrc-1; i>=
22840 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20  iStart; i--){.  
22850 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74    pSrc->a[i+nExt
22860 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  ra] = pSrc->a[i]
22870 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53  ;.  }.  pSrc->nS
22880 72 63 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a 20  rc += nExtra;.. 
22890 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77   /* Zero the new
228a0 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f  ly allocated slo
228b0 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ts */.  memset(&
228c0 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c  pSrc->a[iStart],
228d0 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d   0, sizeof(pSrc-
228e0 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a  >a[0])*nExtra);.
228f0 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20    for(i=iStart; 
22900 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b  i<iStart+nExtra;
22910 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d   i++){.    pSrc-
22920 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20  >a[i].iCursor = 
22930 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  -1;.  }..  /* Re
22940 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
22950 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53  o the enlarged S
22960 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75  rcList */.  retu
22970 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn pSrc;.}.../*.
22980 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
22990 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
229a0 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e  e given SrcList.
229b0 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
229c0 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  rcList if.** nee
229d0 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74  d be.  A new ent
229e0 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  ry is created in
229f0 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65   the SrcList eve
22a00 6e 20 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e  n if pTable is N
22a10 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63  ULL..**.** A Src
22a20 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
22a30 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65  , or NULL if the
22a40 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72  re is an OOM err
22a50 6f 72 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20  or or if the.** 
22a60 53 72 63 4c 69 73 74 20 67 72 6f 77 73 20 74 6f  SrcList grows to
22a70 20 6c 61 72 67 65 2e 20 20 54 68 65 20 72 65 74   large.  The ret
22a80 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74  urned.** SrcList
22a90 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61   might be the sa
22aa0 6d 65 20 61 73 20 74 68 65 20 53 72 63 4c 69 73  me as the SrcLis
22ab0 74 20 74 68 61 74 20 77 61 73 20 69 6e 70 75 74  t that was input
22ac0 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a   or it might be.
22ad0 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49  ** a new one.  I
22ae0 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64  f an OOM error d
22af0 6f 65 73 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  oes occurs, then
22b00 20 74 68 65 20 70 72 69 6f 72 20 76 61 6c 75 65   the prior value
22b10 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61   of pList.** tha
22b20 74 20 69 73 20 69 6e 70 75 74 20 74 6f 20 74 68  t is input to th
22b30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 75  is routine is au
22b40 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72 65 65  tomatically free
22b50 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74  d..**.** If pDat
22b60 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c  abase is not nul
22b70 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
22b80 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
22b90 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61  n optional.** da
22ba0 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66  tabase name pref
22bb0 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20  ix.  Like this: 
22bc0 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65   "database.table
22bd0 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73  ".  The pDatabas
22be0 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  e.** points to t
22bf0 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
22c00 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69  d the pTable poi
22c10 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nts to the datab
22c20 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65  ase name..** The
22c30 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61   SrcList.a[].zNa
22c40 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c  me field is fill
22c50 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
22c60 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67  e name which mig
22c70 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20  ht.** come from 
22c80 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61  pTable (if pData
22c90 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72  base is NULL) or
22ca0 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e   from pDatabase.
22cb0 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b    .** SrcList.a[
22cc0 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66  ].zDatabase is f
22cd0 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64  illed with the d
22ce0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f  atabase name fro
22cf0 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20  m pTable,.** or 
22d00 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20  with NULL if no 
22d10 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63  database is spec
22d20 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ified..**.** In 
22d30 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
22d40 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  call like this:.
22d50 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
22d60 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
22d70 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a  nd(D,A,B,0);.**.
22d80 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74  ** Then B is a t
22d90 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
22da0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
22db0 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20  is unspecified. 
22dc0 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69   If called.** li
22dd0 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
22de0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
22df0 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
22e00 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,C);.**.** Then
22e10 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20   C is the table 
22e20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68  name and B is th
22e30 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
22e40 20 20 49 66 20 43 20 69 73 20 64 65 66 69 6e 65    If C is define
22e50 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69 73 20  d.** then so is 
22e60 42 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  B.  In other wor
22e70 64 73 2c 20 77 65 20 6e 65 76 65 72 20 68 61 76  ds, we never hav
22e80 65 20 61 20 63 61 73 65 20 77 68 65 72 65 3a 0a  e a case where:.
22e90 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
22ea0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
22eb0 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a  nd(D,A,0,C);.**.
22ec0 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c 65 20 61  ** Both pTable a
22ed0 6e 64 20 70 44 61 74 61 62 61 73 65 20 61 72 65  nd pDatabase are
22ee0 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 71   assumed to be q
22ef0 75 6f 74 65 64 2e 20 20 54 68 65 79 20 61 72 65  uoted.  They are
22f00 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66   dequoted.** bef
22f10 6f 72 65 20 62 65 69 6e 67 20 61 64 64 65 64 20  ore being added 
22f20 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74 2e 0a  to the SrcList..
22f30 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
22f40 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
22f50 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
22f60 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  e,      /* Parsi
22f70 6e 67 20 63 6f 6e 74 65 78 74 2c 20 69 6e 20 77  ng context, in w
22f80 68 69 63 68 20 65 72 72 6f 72 73 20 61 72 65 20  hich errors are 
22f90 72 65 70 6f 72 74 65 64 20 2a 2f 0a 20 20 53 72  reported */.  Sr
22fa0 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  cList *pList,   
22fb0 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74    /* Append to t
22fc0 68 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c  his SrcList. NUL
22fd0 4c 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20  L creates a new 
22fe0 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b  SrcList */.  Tok
22ff0 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20  en *pTable,     
23000 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70 70   /* Table to app
23010 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  end */.  Token *
23020 70 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a 20  pDatabase    /* 
23030 44 61 74 61 62 61 73 65 20 6f 66 20 74 68 65 20  Database of the 
23040 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74  table */.){.  st
23050 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
23060 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
23070 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72  te3 *db;.  asser
23080 74 28 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20  t( pDatabase==0 
23090 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20  || pTable!=0 ); 
230a0 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20   /* Cannot have 
230b0 43 20 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20  C without B */. 
230c0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
230d0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
230e0 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b  pParse->db!=0 );
230f0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
23100 64 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  db;.  if( pList=
23110 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
23120 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
23130 63 52 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64  cRawNN(pParse->d
23140 62 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73  b, sizeof(SrcLis
23150 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
23160 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
23170 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
23180 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 20 20 70 4c  lloc = 1;.    pL
23190 69 73 74 2d 3e 6e 53 72 63 20 3d 20 31 3b 0a 20  ist->nSrc = 1;. 
231a0 20 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74     memset(&pList
231b0 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[0], 0, sizeo
231c0 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
231d0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  .    pList->a[0]
231e0 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  .iCursor = -1;. 
231f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53 72 63 4c   }else{.    SrcL
23200 69 73 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  ist *pNew = sqli
23210 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
23220 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  e(pParse, pList,
23230 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29   1, pList->nSrc)
23240 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
23250 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
23260 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
23270 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
23280 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
23290 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69  }else{.      pLi
232a0 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  st = pNew;.    }
232b0 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
232c0 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
232d0 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70  nSrc-1];.  if( p
232e0 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74  Database && pDat
232f0 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  abase->z==0 ){. 
23300 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30     pDatabase = 0
23310 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74  ;.  }.  if( pDat
23320 61 62 61 73 65 20 29 7b 0a 20 20 20 20 70 49 74  abase ){.    pIt
23330 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
23340 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
23350 28 64 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b  (db, pDatabase);
23360 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74  .    pItem->zDat
23370 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e  abase = sqlite3N
23380 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
23390 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73   pTable);.  }els
233a0 65 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  e{.    pItem->zN
233b0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
233c0 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
233d0 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 49 74 65  Table);.    pIte
233e0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30  m->zDatabase = 0
233f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
23400 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  List;.}../*.** A
23410 73 73 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72  ssign VdbeCursor
23420 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74   index numbers t
23430 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  o all tables in 
23440 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69  a SrcList.*/.voi
23450 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
23460 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61  AssignCursors(Pa
23470 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
23480 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
23490 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
234a0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
234b0 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c  tem;.  assert(pL
234c0 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ist || pParse->d
234d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
234e0 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
234f0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  {.    for(i=0, p
23500 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
23510 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
23520 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
23530 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43     if( pItem->iC
23540 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b  ursor>=0 ) break
23550 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69  ;.      pItem->i
23560 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
23570 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69  >nTab++;.      i
23580 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
23590 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
235a0 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
235b0 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
235c0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d   pItem->pSelect-
235d0 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  >pSrc);.      }.
235e0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
235f0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
23600 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
23610 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
23620 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
23630 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
23640 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
23650 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
23660 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
23670 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
23680 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
23690 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
236a0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74  eturn;.  for(pIt
236b0 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
236c0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
236d0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
236e0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
236f0 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61  e(db, pItem->zDa
23700 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
23710 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
23720 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
23730 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
23740 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  db, pItem->zAlia
23750 73 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  s);.    if( pIte
23760 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
23770 79 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  y ) sqlite3DbFre
23780 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e  e(db, pItem->u1.
23790 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20  zIndexedBy);.   
237a0 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69   if( pItem->fg.i
237b0 73 54 61 62 46 75 6e 63 20 29 20 73 71 6c 69 74  sTabFunc ) sqlit
237c0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
237d0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70  (db, pItem->u1.p
237e0 46 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 73 71  FuncArg);.    sq
237f0 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
23800 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  (db, pItem->pTab
23810 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
23820 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
23830 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Item->pSelect);.
23840 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
23850 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
23860 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  >pOn);.    sqlit
23870 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
23880 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  b, pItem->pUsing
23890 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
238a0 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69  DbFreeNN(db, pLi
238b0 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  st);.}../*.** Th
238c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
238d0 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
238e0 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20  er to add a new 
238f0 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65  term to the.** e
23900 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20  nd of a growing 
23910 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
23920 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20  e "p" parameter 
23930 69 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a  is the part of.*
23940 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
23950 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61  e that has alrea
23960 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63  dy been construc
23970 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c  ted.  "p" is NUL
23980 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20  L.** if this is 
23990 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f  the first term o
239a0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
239b0 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70  e.  pTable and p
239c0 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20  Database.** are 
239d0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
239e0 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61  table and databa
239f0 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20  se named in the 
23a00 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
23a10 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69  ..** pDatabase i
23a20 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61  s NULL if the da
23a30 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c  tabase name qual
23a40 69 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67  ifier is missing
23a50 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20   - the.** usual 
23a60 63 61 73 65 2e 20 20 49 66 20 74 68 65 20 74 65  case.  If the te
23a70 72 6d 20 68 61 73 20 61 6e 20 61 6c 69 61 73 2c  rm has an alias,
23a80 20 74 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69   then pAlias poi
23a90 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c  nts to the.** al
23aa0 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74  ias token.  If t
23ab0 68 65 20 74 65 72 6d 20 69 73 20 61 20 73 75 62  he term is a sub
23ac0 71 75 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62  query, then pSub
23ad0 71 75 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20  query is the.** 
23ae0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
23af0 20 74 68 61 74 20 74 68 65 20 73 75 62 71 75 65   that the subque
23b00 72 79 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65  ry encodes.  The
23b10 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70   pTable and.** p
23b20 44 61 74 61 62 61 73 65 20 70 61 72 61 6d 65 74  Database paramet
23b30 65 72 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72  ers are NULL for
23b40 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 54 68   subqueries.  Th
23b50 65 20 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67  e pOn and pUsing
23b60 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61  .** parameters a
23b70 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  re the content o
23b80 66 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  f the ON and USI
23b90 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  NG clauses..**.*
23ba0 2a 20 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53  * Return a new S
23bb0 72 63 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63  rcList which enc
23bc0 6f 64 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d  odes is the FROM
23bd0 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a   with the new.**
23be0 20 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a   term added..*/.
23bf0 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
23c00 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f  SrcListAppendFro
23c10 6d 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a  mTerm(.  Parse *
23c20 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
23c30 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
23c40 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
23c50 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
23c60 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72   /* The left par
23c70 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
23c80 61 75 73 65 20 61 6c 72 65 61 64 79 20 73 65 65  ause already see
23c90 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  n */.  Token *pT
23ca0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
23cb0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
23cc0 62 6c 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68  ble to add to th
23cd0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
23ce0 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  .  Token *pDatab
23cf0 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61  ase,       /* Na
23d00 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
23d10 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54  se containing pT
23d20 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  able */.  Token 
23d30 2a 70 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20  *pAlias,        
23d40 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68    /* The right-h
23d50 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
23d60 41 53 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  AS subexpression
23d70 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
23d80 75 62 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a  ubquery,      /*
23d90 20 41 20 73 75 62 71 75 65 72 79 20 75 73 65 64   A subquery used
23da0 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74   in place of a t
23db0 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45  able name */.  E
23dc0 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20  xpr *pOn,       
23dd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e         /* The ON
23de0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69   clause of a joi
23df0 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  n */.  IdList *p
23e00 55 73 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f  Using          /
23e10 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75  * The USING clau
23e20 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a  se of a join */.
23e30 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  ){.  struct SrcL
23e40 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
23e50 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
23e60 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
23e70 66 28 20 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c  f( !p && (pOn ||
23e80 20 70 55 73 69 6e 67 29 20 29 7b 0a 20 20 20 20   pUsing) ){.    
23e90 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
23ea0 70 50 61 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20  pParse, "a JOIN 
23eb0 63 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72  clause is requir
23ec0 65 64 20 62 65 66 6f 72 65 20 25 73 22 2c 20 0a  ed before %s", .
23ed0 20 20 20 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e        (pOn ? "ON
23ee0 22 20 3a 20 22 55 53 49 4e 47 22 29 0a 20 20 20  " : "USING").   
23ef0 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70   );.    goto app
23f00 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a  end_from_error;.
23f10 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65    }.  p = sqlite
23f20 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70  3SrcListAppend(p
23f30 50 61 72 73 65 2c 20 70 2c 20 70 54 61 62 6c 65  Parse, p, pTable
23f40 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
23f50 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
23f60 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d  goto append_from
23f70 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 61 73  _error;.  }.  as
23f80 73 65 72 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20  sert( p->nSrc>0 
23f90 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d  );.  pItem = &p-
23fa0 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
23fb0 20 61 73 73 65 72 74 28 20 28 70 54 61 62 6c 65   assert( (pTable
23fc0 3d 3d 30 29 3d 3d 28 70 44 61 74 61 62 61 73 65  ==0)==(pDatabase
23fd0 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ==0) );.  assert
23fe0 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pItem->zName==
23ff0 30 20 7c 7c 20 70 44 61 74 61 62 61 73 65 21 3d  0 || pDatabase!=
24000 30 20 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45  0 );.  if( IN_RE
24010 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20 70  NAME_OBJECT && p
24020 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  Item->zName ){. 
24030 20 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e     Token *pToken
24040 20 3d 20 28 41 4c 57 41 59 53 28 70 44 61 74 61   = (ALWAYS(pData
24050 62 61 73 65 29 20 26 26 20 70 44 61 74 61 62 61  base) && pDataba
24060 73 65 2d 3e 7a 29 20 3f 20 70 44 61 74 61 62 61  se->z) ? pDataba
24070 73 65 20 3a 20 70 54 61 62 6c 65 3b 0a 20 20 20  se : pTable;.   
24080 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f   sqlite3RenameTo
24090 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 70  kenMap(pParse, p
240a0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 6f  Item->zName, pTo
240b0 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ken);.  }.  asse
240c0 72 74 28 20 70 41 6c 69 61 73 21 3d 30 20 29 3b  rt( pAlias!=0 );
240d0 0a 20 20 69 66 28 20 70 41 6c 69 61 73 2d 3e 6e  .  if( pAlias->n
240e0 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   ){.    pItem->z
240f0 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e  Alias = sqlite3N
24100 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
24110 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20   pAlias);.  }.  
24120 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pItem->pSelect =
24130 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70 49   pSubquery;.  pI
24140 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a  tem->pOn = pOn;.
24150 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20    pItem->pUsing 
24160 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65 74 75  = pUsing;.  retu
24170 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e 64 5f 66  rn p;.. append_f
24180 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73  rom_error:.  ass
24190 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 73  ert( p==0 );.  s
241a0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
241b0 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 73 71 6c  (db, pOn);.  sql
241c0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
241d0 28 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20  (db, pUsing);.  
241e0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
241f0 65 74 65 28 64 62 2c 20 70 53 75 62 71 75 65 72  ete(db, pSubquer
24200 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  y);.  return 0;.
24210 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
24220 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e 4f  INDEXED BY or NO
24230 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65  T INDEXED clause
24240 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63   to the most rec
24250 65 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a 20  ently added .** 
24260 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 73  element of the s
24270 6f 75 72 63 65 2d 6c 69 73 74 20 70 61 73 73 65  ource-list passe
24280 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
24290 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  argument..*/.voi
242a0 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
242b0 49 6e 64 65 78 65 64 42 79 28 50 61 72 73 65 20  IndexedBy(Parse 
242c0 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
242d0 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e 64   *p, Token *pInd
242e0 65 78 65 64 42 79 29 7b 0a 20 20 61 73 73 65 72  exedBy){.  asser
242f0 74 28 20 70 49 6e 64 65 78 65 64 42 79 21 3d 30  t( pIndexedBy!=0
24300 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70   );.  if( p && p
24310 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3e 30 20 29  IndexedBy->n>0 )
24320 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
24330 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
24340 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
24350 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20 20 20 70  >nSrc>0 );.    p
24360 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
24370 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73  nSrc-1];.    ass
24380 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e  ert( pItem->fg.n
24390 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a  otIndexed==0 );.
243a0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
243b0 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
243c0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  y==0 );.    asse
243d0 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
243e0 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20  TabFunc==0 );.  
243f0 20 20 69 66 28 20 70 49 6e 64 65 78 65 64 42 79    if( pIndexedBy
24400 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65  ->n==1 && !pInde
24410 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20  xedBy->z ){.    
24420 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45    /* A "NOT INDE
24430 58 45 44 22 20 63 6c 61 75 73 65 20 77 61 73 20  XED" clause was 
24440 73 75 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61  supplied. See pa
24450 72 73 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20  rse.y .      ** 
24460 63 6f 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78  construct "index
24470 65 64 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61  ed_opt" for deta
24480 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49  ils. */.      pI
24490 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  tem->fg.notIndex
244a0 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
244b0 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  e{.      pItem->
244c0 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20  u1.zIndexedBy = 
244d0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
244e0 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
244f0 20 70 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20   pIndexedBy);.  
24500 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73      pItem->fg.is
24510 49 6e 64 65 78 65 64 42 79 20 3d 20 31 3b 0a 20  IndexedBy = 1;. 
24520 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
24530 2a 20 41 64 64 20 74 68 65 20 6c 69 73 74 20 6f  * Add the list o
24540 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
24550 65 6e 74 73 20 74 6f 20 74 68 65 20 53 72 63 4c  ents to the SrcL
24560 69 73 74 20 65 6e 74 72 79 20 66 6f 72 20 61 0a  ist entry for a.
24570 2a 2a 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d  ** table-valued-
24580 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
24590 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
245a0 46 75 6e 63 41 72 67 73 28 50 61 72 73 65 20 2a  FuncArgs(Parse *
245b0 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
245c0 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  *p, ExprList *pL
245d0 69 73 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ist){.  if( p ){
245e0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
245f0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
24600 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
24610 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
24620 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64  pItem->fg.notInd
24630 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  exed==0 );.    a
24640 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
24650 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20  .isIndexedBy==0 
24660 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
24670 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
24680 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74  nc==0 );.    pIt
24690 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20  em->u1.pFuncArg 
246a0 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 70 49 74  = pList;.    pIt
246b0 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
246c0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
246d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
246e0 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
246f0 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d  >db, pList);.  }
24700 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62  .}../*.** When b
24710 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f  uilding up a FRO
24720 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
24730 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e  parser, the join
24740 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   operator.** is 
24750 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68  initially attach
24760 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ed to the left o
24770 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65  perand.  But the
24780 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
24790 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65 20 6a  ** expects the j
247a0 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  oin operator to 
247b0 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  be on the right 
247c0 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72  operand.  This r
247d0 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73  outine.** Shifts
247e0 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74   all join operat
247f0 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  ors from left to
24800 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e   right for an en
24810 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61  tire FROM.** cla
24820 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  use..**.** Examp
24830 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20  le: Suppose the 
24840 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69  join is like thi
24850 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
24860 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f     A natural cro
24870 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20  ss join B.**.** 
24880 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20  The operator is 
24890 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a  "natural cross j
248a0 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64  oin".  The A and
248b0 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20   B operands are 
248c0 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e  stored.** in p->
248d0 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d  a[0] and p->a[1]
248e0 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
248f0 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 69 74   The parser init
24900 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65  ially stores the
24910 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74  .** operator wit
24920 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69  h A.  This routi
24930 6e 65 20 73 68 69 66 74 73 20 74 68 61 74 20 6f  ne shifts that o
24940 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20  perator over to 
24950 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  B..*/.void sqlit
24960 65 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f  e3SrcListShiftJo
24970 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a  inType(SrcList *
24980 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
24990 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
249a0 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69  r(i=p->nSrc-1; i
249b0 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
249c0 70 2d 3e 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74  p->a[i].fg.joint
249d0 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e  ype = p->a[i-1].
249e0 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  fg.jointype;.   
249f0 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 66   }.    p->a[0].f
24a00 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  g.jointype = 0;.
24a10 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
24a20 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
24a30 66 6f 72 20 61 20 42 45 47 49 4e 20 73 74 61 74  for a BEGIN stat
24a40 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
24a50 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73  qlite3BeginTrans
24a60 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
24a70 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b  arse, int type){
24a80 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
24a90 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
24aa0 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   i;..  assert( p
24ab0 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62  Parse!=0 );.  db
24ac0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
24ad0 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
24ae0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
24af0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
24b00 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
24b10 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c  ION, "BEGIN", 0,
24b20 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   0) ){.    retur
24b30 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c  n;.  }.  v = sql
24b40 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
24b50 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20  se);.  if( !v ) 
24b60 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79  return;.  if( ty
24b70 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20  pe!=TK_DEFERRED 
24b80 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
24b90 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
24ba0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
24bb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54  beAddOp2(v, OP_T
24bc0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28  ransaction, i, (
24bd0 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49  type==TK_EXCLUSI
24be0 56 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  VE)+1);.      sq
24bf0 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
24c00 65 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  ee(v, i);.    }.
24c10 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
24c20 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 41 75  eAddOp0(v, OP_Au
24c30 74 6f 43 6f 6d 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a  toCommit);.}../*
24c40 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
24c50 45 20 63 6f 64 65 20 66 6f 72 20 61 20 43 4f 4d  E code for a COM
24c60 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20  MIT or ROLLBACK 
24c70 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 43 6f  statement..** Co
24c80 64 65 20 66 6f 72 20 52 4f 4c 4c 42 41 43 4b 20  de for ROLLBACK 
24c90 69 73 20 67 65 6e 65 72 61 74 65 64 20 69 66 20  is generated if 
24ca0 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41  eType==TK_ROLLBA
24cb0 43 4b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  CK.  Otherwise.*
24cc0 2a 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  * code is genera
24cd0 74 65 64 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54  ted for a COMMIT
24ce0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
24cf0 33 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  3EndTransaction(
24d00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
24d10 6e 74 20 65 54 79 70 65 29 7b 0a 20 20 56 64 62  nt eType){.  Vdb
24d20 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 73 52 6f  e *v;.  int isRo
24d30 6c 6c 62 61 63 6b 3b 0a 0a 20 20 61 73 73 65 72  llback;..  asser
24d40 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
24d50 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
24d60 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ->db!=0 );.  ass
24d70 65 72 74 28 20 65 54 79 70 65 3d 3d 54 4b 5f 43  ert( eType==TK_C
24d80 4f 4d 4d 49 54 20 7c 7c 20 65 54 79 70 65 3d 3d  OMMIT || eType==
24d90 54 4b 5f 45 4e 44 20 7c 7c 20 65 54 79 70 65 3d  TK_END || eType=
24da0 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  =TK_ROLLBACK );.
24db0 20 20 69 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 65    isRollback = e
24dc0 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43  Type==TK_ROLLBAC
24dd0 4b 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  K;.  if( sqlite3
24de0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
24df0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
24e00 54 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20 69 73  TION, .       is
24e10 52 6f 6c 6c 62 61 63 6b 20 3f 20 22 52 4f 4c 4c  Rollback ? "ROLL
24e20 42 41 43 4b 22 20 3a 20 22 43 4f 4d 4d 49 54 22  BACK" : "COMMIT"
24e30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  , 0, 0) ){.    r
24e40 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d  eturn;.  }.  v =
24e50 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
24e60 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
24e70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
24e80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
24e90 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 69  AutoCommit, 1, i
24ea0 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d 0a  sRollback);.  }.
24eb0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
24ec0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
24ed0 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
24ee0 68 65 6e 20 69 74 20 70 61 72 73 65 73 20 61 20  hen it parses a 
24ef0 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74  command to creat
24f00 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72  e,.** release or
24f10 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c   rollback an SQL
24f20 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a   savepoint. .*/.
24f30 76 6f 69 64 20 73 71 6c 69 74 65 33 53 61 76 65  void sqlite3Save
24f40 70 6f 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61  point(Parse *pPa
24f50 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b  rse, int op, Tok
24f60 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
24f70 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ar *zName = sqli
24f80 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
24f90 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
24fa0 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
24fb0 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
24fc0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
24fd0 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
24fe0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
24ff0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
25000 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
25010 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d  r * const az[] =
25020 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52 45 4c   { "BEGIN", "REL
25030 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b  EASE", "ROLLBACK
25040 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  " };.    assert(
25050 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49   !SAVEPOINT_BEGI
25060 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52  N && SAVEPOINT_R
25070 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53 41 56  ELEASE==1 && SAV
25080 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d  EPOINT_ROLLBACK=
25090 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  =2 );.#endif.   
250a0 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c 69 74   if( !v || sqlit
250b0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
250c0 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56 45 50  se, SQLITE_SAVEP
250d0 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e  OINT, az[op], zN
250e0 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ame, 0) ){.     
250f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
25100 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
25110 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
25120 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
25130 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
25140 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70  OP_Savepoint, op
25150 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50  , 0, 0, zName, P
25160 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
25170 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
25180 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  re the TEMP data
25190 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64  base is open and
251a0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
251b0 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  se.  Return.** t
251c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
251d0 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20  ors.  Leave any 
251e0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
251f0 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
25200 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
25210 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
25220 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50  tabase(Parse *pP
25230 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
25240 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
25250 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62  b;.  if( db->aDb
25260 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70  [1].pBt==0 && !p
25270 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
25280 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
25290 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20    Btree *pBt;.  
252a0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
252b0 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20  nt flags = .    
252c0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
252d0 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20  N_READWRITE |.  
252e0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
252f0 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
25300 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
25310 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20  EN_EXCLUSIVE |. 
25320 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
25330 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
25340 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  SE |.          S
25350 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
25360 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  DB;..    rc = sq
25370 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64  lite3BtreeOpen(d
25380 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20  b->pVfs, 0, db, 
25390 26 70 42 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b  &pBt, 0, flags);
253a0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
253b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
253c0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
253d0 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
253e0 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
253f0 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20  ary database ". 
25400 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72         "file for
25410 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61   storing tempora
25420 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ry tables");.   
25430 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
25440 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
25450 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62   1;.    }.    db
25460 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70  ->aDb[1].pBt = p
25470 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
25480 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
25490 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51  ma );.    if( SQ
254a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69  LITE_NOMEM==sqli
254b0 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
254c0 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78  ize(pBt, db->nex
254d0 74 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30  tPagesize, -1, 0
254e0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
254f0 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
25500 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
25510 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
25520 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
25530 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
25540 68 61 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  hat the schema c
25550 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e 65 65 64 20  ookie will need 
25560 74 6f 20 62 65 20 76 65 72 69 66 69 65 64 0a 2a  to be verified.*
25570 2a 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 69  * for database i
25580 44 62 2e 20 20 54 68 65 20 63 6f 64 65 20 74 6f  Db.  The code to
25590 20 61 63 74 75 61 6c 6c 79 20 76 65 72 69 66 79   actually verify
255a0 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
255b0 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63 63 75 72  ie.** will occur
255c0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
255d0 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56 44 42  he top-level VDB
255e0 45 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 67 65  E and will be ge
255f0 6e 65 72 61 74 65 64 0a 2a 2a 20 6c 61 74 65 72  nerated.** later
25600 2c 20 62 79 20 73 71 6c 69 74 65 33 46 69 6e 69  , by sqlite3Fini
25610 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76  shCoding()..*/.v
25620 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56  oid sqlite3CodeV
25630 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73  erifySchema(Pars
25640 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
25650 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  Db){.  Parse *pT
25660 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
25670 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
25680 50 61 72 73 65 29 3b 0a 0a 20 20 61 73 73 65 72  Parse);..  asser
25690 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
256a0 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62  <pParse->db->nDb
256b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
256c0 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
256d0 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62  b].pBt!=0 || iDb
256e0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
256f0 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f   iDb<SQLITE_MAX_
25700 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20  ATTACHED+2 );.  
25710 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
25720 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 70  chemaMutexHeld(p
25730 50 61 72 73 65 2d 3e 64 62 2c 20 69 44 62 2c 20  Parse->db, iDb, 
25740 30 29 20 29 3b 0a 20 20 69 66 28 20 44 62 4d 61  0) );.  if( DbMa
25750 73 6b 54 65 73 74 28 70 54 6f 70 6c 65 76 65 6c  skTest(pToplevel
25760 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44  ->cookieMask, iD
25770 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44 62 4d  b)==0 ){.    DbM
25780 61 73 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c  askSet(pToplevel
25790 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44  ->cookieMask, iD
257a0 62 29 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49  b);.    if( !OMI
257b0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
257c0 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
257d0 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
257e0 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a  ase(pToplevel);.
257f0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
25800 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  ** If argument z
25810 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  Db is NULL, then
25820 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64   call sqlite3Cod
25830 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 29 20  eVerifySchema() 
25840 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 61 74 74  for each .** att
25850 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2e 20  ached database. 
25860 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b  Otherwise, invok
25870 65 20 69 74 20 66 6f 72 20 74 68 65 20 64 61 74  e it for the dat
25880 61 62 61 73 65 20 6e 61 6d 65 64 20 7a 44 62 20  abase named zDb 
25890 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
258a0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e  lite3CodeVerifyN
258b0 61 6d 65 64 53 63 68 65 6d 61 28 50 61 72 73 65  amedSchema(Parse
258c0 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
258d0 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71  char *zDb){.  sq
258e0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
258f0 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b  se->db;.  int i;
25900 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
25910 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
25920 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
25930 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
25940 70 44 62 2d 3e 70 42 74 20 26 26 20 28 21 7a 44  pDb->pBt && (!zD
25950 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53  b || 0==sqlite3S
25960 74 72 49 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d  trICmp(zDb, pDb-
25970 3e 7a 44 62 53 4e 61 6d 65 29 29 20 29 7b 0a 20  >zDbSName)) ){. 
25980 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
25990 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
259a0 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  rse, i);.    }. 
259b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
259c0 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
259d0 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72  hat prepares for
259e0 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74   doing an operat
259f0 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  ion that.** migh
25a00 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74  t change the dat
25a10 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abase..**.** Thi
25a20 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
25a30 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
25a40 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  on if we are not
25a50 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a   already within.
25a60 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
25a70 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72  .  If we are alr
25a80 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72  eady within a tr
25a90 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
25aa0 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  a checkpoint.** 
25ab0 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65  is set if the se
25ac0 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d  tStatement param
25ad0 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41  eter is true.  A
25ae0 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
25af0 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72  ld.** be set for
25b00 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74   operations that
25b10 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65   might fail (due
25b20 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   to a constraint
25b30 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  ) part of.** the
25b40 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64   way through and
25b50 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64   which will need
25b60 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72   to undo some wr
25b70 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76  ites without hav
25b80 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61  ing to.** rollba
25b90 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ck the whole tra
25ba0 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f  nsaction.  For o
25bb0 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20  perations where 
25bc0 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
25bd0 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65  ** can be checke
25be0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
25bf0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
25c00 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
25c10 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65  t is never.** ne
25c20 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
25c30 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20  a write and the 
25c40 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
25c50 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f  d not be set..*/
25c60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
25c70 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
25c80 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
25c90 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74  int setStatement
25ca0 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61  , int iDb){.  Pa
25cb0 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
25cc0 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
25cd0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
25ce0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
25cf0 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
25d00 20 69 44 62 29 3b 0a 20 20 44 62 4d 61 73 6b 53   iDb);.  DbMaskS
25d10 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72  et(pToplevel->wr
25d20 69 74 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20  iteMask, iDb);. 
25d30 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75   pToplevel->isMu
25d40 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65 74 53  ltiWrite |= setS
25d50 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a  tatement;.}../*.
25d60 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
25d70 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63   the statement c
25d80 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
25d90 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69 67 68  onstruction migh
25da0 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20  t write.** more 
25db0 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28  than one entry (
25dc0 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e  example: deletin
25dd0 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20 69  g one row then i
25de0 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68 65 72  nserting another
25df0 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d  ,.** inserting m
25e00 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69 6e 20  ultiple rows in 
25e10 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65  a table, or inse
25e20 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e 64 20  rting a row and 
25e30 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e 29 0a  index entries.).
25e40 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74 20 6f  ** If an abort o
25e50 63 63 75 72 73 20 61 66 74 65 72 20 73 6f 6d 65  ccurs after some
25e60 20 6f 66 20 74 68 65 73 65 20 77 72 69 74 65 73   of these writes
25e70 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c   have completed,
25e80 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a   then it will.**
25e90 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
25ea0 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65   undo the comple
25eb0 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76  ted writes..*/.v
25ec0 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69  oid sqlite3Multi
25ed0 57 72 69 74 65 28 50 61 72 73 65 20 2a 70 50 61  Write(Parse *pPa
25ee0 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  rse){.  Parse *p
25ef0 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
25f00 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
25f10 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c  pParse);.  pTopl
25f20 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69  evel->isMultiWri
25f30 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  te = 1;.}../* .*
25f40 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
25f50 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ator calls this 
25f60 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20 64 69  routine if is di
25f70 73 63 6f 76 65 72 73 20 74 68 61 74 20 69 74 20  scovers that it 
25f80 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74  is.** possible t
25f90 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74 65 6d  o abort a statem
25fa0 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d  ent prior to com
25fb0 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64  pletion.  In ord
25fc0 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72  er to .** perfor
25fd0 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77 69 74  m this abort wit
25fe0 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e 67 20  hout corrupting 
25ff0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 77 65  the database, we
26000 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a   need to make.**
26010 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73   sure that the s
26020 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72 6f 74  tatement is prot
26030 65 63 74 65 64 20 62 79 20 61 20 73 74 61 74 65  ected by a state
26040 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
26050 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61  ..**.** Technica
26060 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65  lly, we only nee
26070 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 79  d to set the may
26080 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20 74 68  Abort flag if th
26090 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69 74  e.** isMultiWrit
260a0 65 20 66 6c 61 67 20 77 61 73 20 70 72 65 76 69  e flag was previ
260b0 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68 65 72  ously set.  Ther
260c0 65 20 69 73 20 61 20 74 69 6d 65 20 64 65 70 65  e is a time depe
260d0 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74  ndency.** such t
260e0 68 61 74 20 74 68 65 20 61 62 6f 72 74 20 6d 75  hat the abort mu
260f0 73 74 20 6f 63 63 75 72 20 61 66 74 65 72 20 74  st occur after t
26100 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e 20 20  he multiwrite.  
26110 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f  This makes.** so
26120 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  me statements in
26130 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45 50 4c  volving the REPL
26140 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  ACE conflict res
26150 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
26160 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65  m.** go a little
26170 20 66 61 73 74 65 72 2e 20 20 42 75 74 20 74 61   faster.  But ta
26180 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65 20 6f  king advantage o
26190 66 20 74 68 69 73 20 74 69 6d 65 20 64 65 70 65  f this time depe
261a0 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20  ndency.** makes 
261b0 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c  it more difficul
261c0 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20  t to prove that 
261d0 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f 72 72  the code is corr
261e0 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74  ect (in .** part
261f0 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65 76 65  icular, it preve
26200 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72 69 74  nts us from writ
26210 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69 76 65  ing an effective
26220 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
26230 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41 73 73  on of sqlite3Ass
26240 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29 20 61  ertMayAbort()) a
26250 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20 63 68  nd so we have ch
26260 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20  osen.** to take 
26270 74 68 65 20 73 61 66 65 20 72 6f 75 74 65 20 61  the safe route a
26280 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70 74 69  nd skip the opti
26290 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  mization..*/.voi
262a0 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72  d sqlite3MayAbor
262b0 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  t(Parse *pParse)
262c0 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
262d0 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
262e0 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
262f0 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  se);.  pToplevel
26300 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a  ->mayAbort = 1;.
26310 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
26320 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20 63 61   OP_Halt that ca
26330 75 73 65 73 20 74 68 65 20 76 64 62 65 20 74 6f  uses the vdbe to
26340 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
26350 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20  E_CONSTRAINT.** 
26360 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72  error. The onErr
26370 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 74  or parameter det
26380 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 28 69  ermines which (i
26390 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20 73 74  f any) of the st
263a0 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f  atement.** and/o
263b0 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  r current transa
263c0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
263d0 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  back..*/.void sq
263e0 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
263f0 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
26400 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
26410 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
26420 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 20 20   int errCode,   
26430 20 20 20 2f 2a 20 65 78 74 65 6e 64 65 64 20 65     /* extended e
26440 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69  rror code */.  i
26450 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
26460 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74   /* Constraint t
26470 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  ype */.  char *p
26480 34 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72  4,         /* Er
26490 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20  ror message */. 
264a0 20 69 38 20 70 34 74 79 70 65 2c 20 20 20 20 20   i8 p4type,     
264b0 20 20 20 2f 2a 20 50 34 5f 53 54 41 54 49 43 20     /* P4_STATIC 
264c0 6f 72 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 20  or P4_TRANSIENT 
264d0 2a 2f 0a 20 20 75 38 20 70 35 45 72 72 6d 73 67  */.  u8 p5Errmsg
264e0 20 20 20 20 20 20 20 2f 2a 20 50 35 5f 45 72 72         /* P5_Err
264f0 4d 73 67 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  Msg type */.){. 
26500 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
26510 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
26520 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65 72  );.  assert( (er
26530 72 43 6f 64 65 26 30 78 66 66 29 3d 3d 53 51 4c  rCode&0xff)==SQL
26540 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29  ITE_CONSTRAINT )
26550 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d  ;.  if( onError=
26560 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
26570 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
26580 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20  (pParse);.  }.  
26590 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
265a0 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72  4(v, OP_Halt, er
265b0 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20  rCode, onError, 
265c0 30 2c 20 70 34 2c 20 70 34 74 79 70 65 29 3b 0a  0, p4, p4type);.
265d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
265e0 6e 67 65 50 35 28 76 2c 20 70 35 45 72 72 6d 73  ngeP5(v, p5Errms
265f0 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64  g);.}../*.** Cod
26600 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65  e an OP_Halt due
26610 20 74 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52   to UNIQUE or PR
26620 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
26630 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a  aint violation..
26640 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55  */.void sqlite3U
26650 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28  niqueConstraint(
26660 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
26670 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
26680 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
26690 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
266a0 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70  * Constraint typ
266b0 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
266c0 64 78 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  dx       /* The 
266d0 69 6e 64 65 78 20 74 68 61 74 20 74 72 69 67 67  index that trigg
266e0 65 72 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69  ers the constrai
266f0 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
26700 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a  *zErr;.  int j;.
26710 20 20 53 74 72 41 63 63 75 6d 20 65 72 72 4d 73    StrAccum errMs
26720 67 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  g;.  Table *pTab
26730 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b   = pIdx->pTable;
26740 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ..  sqlite3StrAc
26750 63 75 6d 49 6e 69 74 28 26 65 72 72 4d 73 67 2c  cumInit(&errMsg,
26760 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20   pParse->db, 0, 
26770 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
26780 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
26790 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
267a0 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
267b0 5d 29 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e  ]);.  if( pIdx->
267c0 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20 20 20 20  aColExpr ){.    
267d0 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
267e0 6e 64 66 28 26 65 72 72 4d 73 67 2c 20 22 69 6e  ndf(&errMsg, "in
267f0 64 65 78 20 27 25 71 27 22 2c 20 70 49 64 78 2d  dex '%q'", pIdx-
26800 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  >zName);.  }else
26810 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
26820 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
26830 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  j++){.      char
26840 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 61 73   *zCol;.      as
26850 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f  sert( pIdx->aiCo
26860 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20  lumn[j]>=0 );.  
26870 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
26880 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f  >aCol[pIdx->aiCo
26890 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
268a0 20 20 20 20 20 20 69 66 28 20 6a 20 29 20 73 71        if( j ) sq
268b0 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
268c0 28 26 65 72 72 4d 73 67 2c 20 22 2c 20 22 2c 20  (&errMsg, ", ", 
268d0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
268e0 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28  3_str_appendall(
268f0 26 65 72 72 4d 73 67 2c 20 70 54 61 62 2d 3e 7a  &errMsg, pTab->z
26900 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
26910 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28  ite3_str_append(
26920 26 65 72 72 4d 73 67 2c 20 22 2e 22 2c 20 31 29  &errMsg, ".", 1)
26930 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
26940 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 65  str_appendall(&e
26950 72 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20  rrMsg, zCol);.  
26960 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72 72 20 3d    }.  }.  zErr =
26970 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
26980 46 69 6e 69 73 68 28 26 65 72 72 4d 73 67 29 3b  Finish(&errMsg);
26990 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f  .  sqlite3HaltCo
269a0 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
269b0 20 0a 20 20 20 20 49 73 50 72 69 6d 61 72 79 4b   .    IsPrimaryK
269c0 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 3f 20  eyIndex(pIdx) ? 
269d0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
269e0 54 5f 50 52 49 4d 41 52 59 4b 45 59 20 0a 20 20  T_PRIMARYKEY .  
269f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a00 20 20 20 20 20 20 20 20 20 20 3a 20 53 51 4c 49            : SQLI
26a10 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e  TE_CONSTRAINT_UN
26a20 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72 72 6f  IQUE,.    onErro
26a30 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41  r, zErr, P4_DYNA
26a40 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69  MIC, P5_Constrai
26a50 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f  ntUnique);.}.../
26a60 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
26a70 48 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f 6e 2d  Halt due to non-
26a80 75 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a 2a 2f  unique rowid..*/
26a90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 77  .void sqlite3Row
26aa0 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  idConstraint(.  
26ab0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
26ac0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
26ad0 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  text */.  int on
26ae0 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
26af0 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
26b00 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a  on algorithm */.
26b10 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 20 20    Table *pTab   
26b20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
26b30 20 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d 75 6e   with the non-un
26b40 69 71 75 65 20 72 6f 77 69 64 20 2a 2f 20 0a 29  ique rowid */ .)
26b50 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
26b60 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
26b70 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29  pTab->iPKey>=0 )
26b80 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  {.    zMsg = sql
26b90 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
26ba0 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73 22 2c  se->db, "%s.%s",
26bb0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
26bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bd0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
26be0 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e  ol[pTab->iPKey].
26bf0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d  zName);.    rc =
26c00 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
26c10 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20  NT_PRIMARYKEY;. 
26c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d 73 67   }else{.    zMsg
26c30 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
26c40 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25  f(pParse->db, "%
26c50 73 2e 72 6f 77 69 64 22 2c 20 70 54 61 62 2d 3e  s.rowid", pTab->
26c60 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d  zName);.    rc =
26c70 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
26c80 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20  NT_ROWID;.  }.  
26c90 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
26ca0 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 72 63  raint(pParse, rc
26cb0 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73 67 2c  , onError, zMsg,
26cc0 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20 20 20   P4_DYNAMIC,.   
26cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ce0 20 20 20 20 20 50 35 5f 43 6f 6e 73 74 72 61 69       P5_Constrai
26cf0 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a  ntUnique);.}../*
26d00 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
26d10 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20   if pIndex uses 
26d20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
26d30 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52  quence pColl.  R
26d40 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
26d50 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c   it does and fal
26d60 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  se if it does no
26d70 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  t..*/.#ifndef SQ
26d80 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
26d90 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  X.static int col
26da0 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73  lationMatch(cons
26db0 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49  t char *zColl, I
26dc0 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20  ndex *pIndex){. 
26dd0 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
26de0 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( zColl!=0 );.  
26df0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65  for(i=0; i<pInde
26e00 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
26e10 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
26e20 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a   *z = pIndex->az
26e30 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73  Coll[i];.    ass
26e40 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70 49 6e  ert( z!=0 || pIn
26e50 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
26e60 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  <0 );.    if( pI
26e70 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
26e80 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c 69 74  ]>=0 && 0==sqlit
26e90 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f  e3StrICmp(z, zCo
26ea0 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ll) ){.      ret
26eb0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
26ec0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
26ed0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
26ee0 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
26ef0 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74 20  es of pTab that 
26f00 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
26f10 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
26f20 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ..** If pColl==0
26f30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20   then recompute 
26f40 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70  all indices of p
26f50 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  Tab..*/.#ifndef 
26f60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
26f70 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
26f80 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72  reindexTable(Par
26f90 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
26fa0 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f  e *pTab, char co
26fb0 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 69  nst *zColl){.  i
26fc0 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  f( !IsVirtual(pT
26fd0 61 62 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ab) ){.    Index
26fe0 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
26ff0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
27000 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
27010 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 20 20  th pTab */..    
27020 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d  for(pIndex=pTab-
27030 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
27040 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e   pIndex=pIndex->
27050 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
27060 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f  ( zColl==0 || co
27070 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f  llationMatch(zCo
27080 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20  ll, pIndex) ){. 
27090 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d         int iDb =
270a0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
270b0 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
270c0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
270d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
270e0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
270f0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
27100 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
27110 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
27120 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
27130 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   -1);.      }.  
27140 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
27150 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
27160 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
27170 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
27180 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65  ll databases whe
27190 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65  re the.** indice
271a0 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  s use the collat
271b0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
271c0 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ll.  If pColl==0
271d0 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a   then recompute.
271e0 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65  ** all indices e
271f0 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69  verywhere..*/.#i
27200 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27210 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
27220 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74   void reindexDat
27230 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50  abases(Parse *pP
27240 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74  arse, char const
27250 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a   *zColl){.  Db *
27260 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
27270 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
27280 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  gle database */.
27290 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
272a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
272b0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
272c0 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
272d0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
272e0 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
272f0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
27300 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68  ection */.  Hash
27310 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
27320 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
27330 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
27340 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54  es in pDb */.  T
27350 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
27360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
27370 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
27380 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65  abase */..  asse
27390 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
273a0 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28  HoldsAllMutexes(
273b0 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65  db) );  /* Neede
273c0 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63  d for schema acc
273d0 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62  ess */.  for(iDb
273e0 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b  =0, pDb=db->aDb;
273f0 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44   iDb<db->nDb; iD
27400 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20  b++, pDb++){.   
27410 20 61 73 73 65 72 74 28 20 70 44 62 21 3d 30 20   assert( pDb!=0 
27420 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c  );.    for(k=sql
27430 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44  iteHashFirst(&pD
27440 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
27450 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69  ash);  k; k=sqli
27460 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a  teHashNext(k)){.
27470 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61        pTab = (Ta
27480 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
27490 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65  ata(k);.      re
274a0 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
274b0 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b  e, pTab, zColl);
274c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
274d0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
274e0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
274f0 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
27500 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52  ..**.**        R
27510 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20  EINDEX          
27520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27530 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20    -- 1.**       
27540 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61   REINDEX  <colla
27550 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20  tion>           
27560 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20      -- 2.**     
27570 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61     REINDEX  ?<da
27580 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e  tabase>.?<tablen
27590 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20  ame>  -- 3.**   
275a0 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c       REINDEX  ?<
275b0 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65  database>.?<inde
275c0 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a  xname>  -- 4.**.
275d0 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73  ** Form 1 causes
275e0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20   all indices in 
275f0 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
27600 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 65 62  abases to be reb
27610 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20  uilt..** Form 2 
27620 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64  rebuilds all ind
27630 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  ices in all data
27640 62 61 73 65 73 20 74 68 61 74 20 75 73 65 20 74  bases that use t
27650 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c  he named.** coll
27660 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20  ating function. 
27670 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72   Forms 3 and 4 r
27680 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64  ebuild the named
27690 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a   index or all.**
276a0 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
276b0 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
276c0 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66  ed table..*/.#if
276d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
276e0 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71  _REINDEX.void sq
276f0 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72  lite3Reindex(Par
27700 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
27710 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e  n *pName1, Token
27720 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c   *pName2){.  Col
27730 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
27740 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
27750 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
27760 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20  o be reindexed, 
27770 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61  or NULL */.  cha
27780 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20  r *z;           
27790 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
277a0 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69   of a table or i
277b0 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndex */.  const 
277c0 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20  char *zDb;      
277d0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
277e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
277f0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
27800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27810 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
27820 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49   database */.  I
27830 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
27840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
27850 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
27860 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20  d with pTab */. 
27870 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
27880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27890 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
278a0 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  ex number */.  s
278b0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
278c0 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68  rse->db;   /* Th
278d0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
278e0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ction */.  Token
278f0 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20   *pObjName;     
27900 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
27910 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
27920 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64  ndex to be reind
27930 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  exed */..  /* Re
27940 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
27950 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72  schema. If an er
27960 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76  ror occurs, leav
27970 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
27980 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65  ge.  ** and code
27990 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
279a0 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  eturn NULL. */. 
279b0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
279c0 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
279d0 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
279e0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
279f0 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b  if( pName1==0 ){
27a00 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61  .    reindexData
27a10 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29  bases(pParse, 0)
27a20 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
27a30 7d 65 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28  }else if( NEVER(
27a40 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e  pName2==0) || pN
27a50 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  ame2->z==0 ){.  
27a60 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20    char *zColl;. 
27a70 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
27a80 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c  1->z );.    zCol
27a90 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
27aa0 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
27ab0 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  >db, pName1);.  
27ac0 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72    if( !zColl ) r
27ad0 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c  eturn;.    pColl
27ae0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
27af0 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
27b00 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20  ), zColl, 0);.  
27b10 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
27b20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61       reindexData
27b30 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43  bases(pParse, zC
27b40 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oll);.      sqli
27b50 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
27b60 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oll);.      retu
27b70 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rn;.    }.    sq
27b80 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
27b90 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44  zColl);.  }.  iD
27ba0 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
27bb0 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
27bc0 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
27bd0 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
27be0 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
27bf0 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
27c00 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
27c10 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
27c20 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
27c30 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b    zDb = db->aDb[
27c40 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
27c50 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
27c60 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20  indTable(db, z, 
27c70 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62  zDb);.  if( pTab
27c80 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54   ){.    reindexT
27c90 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
27ca0 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
27cb0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
27cc0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
27cd0 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
27ce0 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
27cf0 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69   z, zDb);.  sqli
27d00 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
27d10 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
27d20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
27d30 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
27d40 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
27d50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66  ;.    sqlite3Ref
27d60 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
27d70 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
27d80 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
27d90 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
27da0 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
27db0 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20  to identify the 
27dc0 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69  object to be rei
27dd0 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64  ndexed");.}.#end
27de0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
27df0 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
27e00 74 75 72 65 20 74 68 61 74 20 69 73 20 61 70 70  ture that is app
27e10 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
27e20 20 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a   given Index..**
27e30 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73  .** The caller s
27e40 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c  hould invoke sql
27e50 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
27e60 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e  () on the return
27e70 65 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 68 65  ed object.** whe
27e80 6e 20 69 74 20 68 61 73 20 66 69 6e 69 73 68 65  n it has finishe
27e90 64 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b  d using it..*/.K
27ea0 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b  eyInfo *sqlite3K
27eb0 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 50 61  eyInfoOfIndex(Pa
27ec0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
27ed0 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74  ex *pIdx){.  int
27ee0 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d   i;.  int nCol =
27ef0 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a   pIdx->nColumn;.
27f00 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64    int nKey = pId
27f10 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65  x->nKeyCol;.  Ke
27f20 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 69  yInfo *pKey;.  i
27f30 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
27f40 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
27f50 28 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e  ( pIdx->uniqNotN
27f60 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4b 65 79 20  ull ){.    pKey 
27f70 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
27f80 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
27f90 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65  , nKey, nCol-nKe
27fa0 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  y);.  }else{.   
27fb0 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b   pKey = sqlite3K
27fc0 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72  eyInfoAlloc(pPar
27fd0 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29  se->db, nCol, 0)
27fe0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b 65 79  ;.  }.  if( pKey
27ff0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
28000 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
28010 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 29 20  Writeable(pKey) 
28020 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
28030 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
28040 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
28050 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a  zColl = pIdx->az
28060 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70  Coll[i];.      p
28070 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Key->aColl[i] = 
28080 7a 43 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33 53 74  zColl==sqlite3St
28090 72 42 49 4e 41 52 59 20 3f 20 30 20 3a 0a 20 20  rBINARY ? 0 :.  
280a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
280c0 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
280d0 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  e, zColl);.     
280e0 20 70 4b 65 79 2d 3e 61 53 6f 72 74 46 6c 61 67   pKey->aSortFlag
280f0 73 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f  s[i] = pIdx->aSo
28100 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20  rtOrder[i];.    
28110 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70 4b    assert( 0==(pK
28120 65 79 2d 3e 61 53 6f 72 74 46 6c 61 67 73 5b 69  ey->aSortFlags[i
28130 5d 20 26 20 4b 45 59 49 4e 46 4f 5f 4f 52 44 45  ] & KEYINFO_ORDE
28140 52 5f 42 49 47 4e 55 4c 4c 29 20 29 3b 0a 20 20  R_BIGNULL) );.  
28150 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72    }.    if( pPar
28160 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
28170 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
28180 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52  ->rc==SQLITE_ERR
28190 4f 52 5f 4d 49 53 53 49 4e 47 5f 43 4f 4c 4c 53  OR_MISSING_COLLS
281a0 45 51 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  EQ );.      if( 
281b0 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72 79 3d 3d  pIdx->bNoQuery==
281c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
281d0 44 65 61 63 74 69 76 61 74 65 20 74 68 65 20 69  Deactivate the i
281e0 6e 64 65 78 20 62 65 63 61 75 73 65 20 69 74 20  ndex because it 
281f0 63 6f 6e 74 61 69 6e 73 20 61 6e 20 75 6e 6b 6e  contains an unkn
28200 6f 77 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20  own collating.  
28210 20 20 20 20 20 20 2a 2a 20 73 65 71 75 65 6e 63        ** sequenc
28220 65 2e 20 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  e.  The only way
28230 20 74 6f 20 72 65 61 63 74 69 76 65 20 74 68 65   to reactive the
28240 20 69 6e 64 65 78 20 69 73 20 74 6f 20 72 65 6c   index is to rel
28250 6f 61 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  oad the.        
28260 2a 2a 20 73 63 68 65 6d 61 2e 20 20 41 64 64 69  ** schema.  Addi
28270 6e 67 20 74 68 65 20 6d 69 73 73 69 6e 67 20 63  ng the missing c
28280 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
28290 65 20 6c 61 74 65 72 20 64 6f 65 73 20 6e 6f 74  e later does not
282a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61 63  .        ** reac
282b0 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 2e 20  tive the index. 
282c0 20 54 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   The application
282d0 20 68 61 64 20 74 68 65 20 63 68 61 6e 63 65 20   had the chance 
282e0 74 6f 20 72 65 67 69 73 74 65 72 0a 20 20 20 20  to register.    
282f0 20 20 20 20 2a 2a 20 74 68 65 20 6d 69 73 73 69      ** the missi
28300 6e 67 20 69 6e 64 65 78 20 75 73 69 6e 67 20 74  ng index using t
28310 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65  he collation-nee
28320 64 65 64 20 63 61 6c 6c 62 61 63 6b 2e 20 20 46  ded callback.  F
28330 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69  or.        ** si
28340 6d 70 6c 69 63 69 74 79 2c 20 53 51 4c 69 74 65  mplicity, SQLite
28350 20 77 69 6c 6c 20 6e 6f 74 20 67 69 76 65 20 74   will not give t
28360 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 61  he application a
28370 20 73 65 63 6f 6e 64 20 63 68 61 6e 63 65 2e 0a   second chance..
28380 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
28390 20 20 20 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72     pIdx->bNoQuer
283a0 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  y = 1;.        p
283b0 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
283c0 54 45 5f 45 52 52 4f 52 5f 52 45 54 52 59 3b 0a  TE_ERROR_RETRY;.
283d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
283e0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
283f0 66 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 70  f(pKey);.      p
28400 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Key = 0;.    }. 
28410 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79   }.  return pKey
28420 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
28430 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20  ITE_OMIT_CTE./* 
28440 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
28450 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65   is invoked once
28460 20 70 65 72 20 43 54 45 20 62 79 20 74 68 65 20   per CTE by the 
28470 70 61 72 73 65 72 20 77 68 69 6c 65 20 70 61 72  parser while par
28480 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48 20  sing a .** WITH 
28490 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68  clause. .*/.With
284a0 20 2a 73 71 6c 69 74 65 33 57 69 74 68 41 64 64   *sqlite3WithAdd
284b0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
284c0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
284d0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
284e0 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c  /.  With *pWith,
284f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
28500 78 69 73 74 69 6e 67 20 57 49 54 48 20 63 6c 61  xisting WITH cla
28510 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
28520 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
28530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
28540 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d  e of the common-
28550 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
28560 69 73 74 20 2a 70 41 72 67 6c 69 73 74 2c 20 20  ist *pArglist,  
28570 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63     /* Optional c
28580 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20  olumn name list 
28590 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
285a0 0a 20 20 53 65 6c 65 63 74 20 2a 70 51 75 65 72  .  Select *pQuer
285b0 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75  y          /* Qu
285c0 65 72 79 20 75 73 65 64 20 74 6f 20 69 6e 69 74  ery used to init
285d0 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65  ialize the table
285e0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
285f0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
28600 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65 77 3b  b;.  With *pNew;
28610 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
28620 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
28630 20 74 68 65 20 43 54 45 20 6e 61 6d 65 20 69 73   the CTE name is
28640 20 75 6e 69 71 75 65 20 77 69 74 68 69 6e 20 74   unique within t
28650 68 69 73 20 57 49 54 48 20 63 6c 61 75 73 65 2e  his WITH clause.
28660 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74   If.  ** not, st
28670 6f 72 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ore an error in 
28680 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74  the Parse struct
28690 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20  ure. */.  zName 
286a0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
286b0 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
286c0 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
286d0 20 7a 4e 61 6d 65 20 26 26 20 70 57 69 74 68 20   zName && pWith 
286e0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
286f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69    for(i=0; i<pWi
28700 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  th->nCte; i++){.
28710 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
28720 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  3StrICmp(zName, 
28730 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pWith->a[i].zNam
28740 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
28750 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
28760 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63  (pParse, "duplic
28770 61 74 65 20 57 49 54 48 20 74 61 62 6c 65 20 6e  ate WITH table n
28780 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29  ame: %s", zName)
28790 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
287a0 20 20 7d 0a 0a 20 20 69 66 28 20 70 57 69 74 68    }..  if( pWith
287b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
287c0 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 73 69  int64 nByte = si
287d0 7a 65 6f 66 28 2a 70 57 69 74 68 29 20 2b 20 28  zeof(*pWith) + (
287e0 73 69 7a 65 6f 66 28 70 57 69 74 68 2d 3e 61 5b  sizeof(pWith->a[
287f0 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e 6e 43 74  1]) * pWith->nCt
28800 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73  e);.    pNew = s
28810 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
28820 64 62 2c 20 70 57 69 74 68 2c 20 6e 42 79 74 65  db, pWith, nByte
28830 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
28840 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
28850 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
28860 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 29 3b 0a  izeof(*pWith));.
28870 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 70    }.  assert( (p
28880 4e 65 77 21 3d 30 20 26 26 20 7a 4e 61 6d 65 21  New!=0 && zName!
28890 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  =0) || db->mallo
288a0 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 69 66  cFailed );..  if
288b0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
288c0 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
288d0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
288e0 64 62 2c 20 70 41 72 67 6c 69 73 74 29 3b 0a 20  db, pArglist);. 
288f0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
28900 44 65 6c 65 74 65 28 64 62 2c 20 70 51 75 65 72  Delete(db, pQuer
28910 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  y);.    sqlite3D
28920 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
28930 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 70 57 69  ;.    pNew = pWi
28940 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  th;.  }else{.   
28950 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
28960 43 74 65 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70  Cte].pSelect = p
28970 51 75 65 72 79 3b 0a 20 20 20 20 70 4e 65 77 2d  Query;.    pNew-
28980 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70  >a[pNew->nCte].p
28990 43 6f 6c 73 20 3d 20 70 41 72 67 6c 69 73 74 3b  Cols = pArglist;
289a0 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65  .    pNew->a[pNe
289b0 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20 3d  w->nCte].zName =
289c0 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 70 4e 65 77   zName;.    pNew
289d0 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e  ->a[pNew->nCte].
289e0 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20  zCteErr = 0;.   
289f0 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a 20   pNew->nCte++;. 
28a00 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e 65   }..  return pNe
28a10 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  w;.}../*.** Free
28a20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
28a30 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74   the With object
28a40 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
28a50 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
28a60 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
28a70 69 74 68 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ithDelete(sqlite
28a80 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 57 69  3 *db, With *pWi
28a90 74 68 29 7b 0a 20 20 69 66 28 20 70 57 69 74 68  th){.  if( pWith
28aa0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
28ab0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57     for(i=0; i<pW
28ac0 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b  ith->nCte; i++){
28ad0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 43 74  .      struct Ct
28ae0 65 20 2a 70 43 74 65 20 3d 20 26 70 57 69 74 68  e *pCte = &pWith
28af0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71  ->a[i];.      sq
28b00 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
28b10 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 43  ete(db, pCte->pC
28b20 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ols);.      sqli
28b30 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
28b40 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63  db, pCte->pSelec
28b50 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
28b60 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 74 65  3DbFree(db, pCte
28b70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
28b80 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
28b90 65 28 64 62 2c 20 70 57 69 74 68 29 3b 0a 20 20  e(db, pWith);.  
28ba0 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  }.}.#endif /* !d
28bb0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
28bc0 49 54 5f 43 54 45 29 20 2a 2f 0a                 IT_CTE) */.