/ Hex Artifact Content
Login

Artifact 1932d05343aa5cf8462c10ac3c738be411908694482745682cc6f88370a83cab:


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 61 73 73 65 72 74 28 20   ){.    assert( 
1c40: 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1c50: 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44 69  vel==0 );  /* Di
1c60: 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65 6e  sables and re-en
1c70: 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a 20  ables match */. 
1c80: 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d 20     /* A minimum 
1c90: 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69 73  of one cursor is
1ca0: 20 72 65 71 75 69 72 65 64 20 69 66 20 61 75 74   required if aut
1cb0: 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75 73  oincrement is us
1cc0: 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74 69  ed.    *  See ti
1cd0: 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31 66  cket [a696379c1f
1ce0: 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69 66  08866] */.    if
1cf0: 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 21  ( pParse->pAinc!
1d00: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54  =0 && pParse->nT
1d10: 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d 3e  ab==0 ) pParse->
1d20: 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73 71  nTab = 1;.    sq
1d30: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
1d40: 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a 20  dy(v, pParse);. 
1d50: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1d60: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1d70: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65  else{.    pParse
1d80: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
1d90: 52 4f 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ROR;.  }.}../*.*
1da0: 2a 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72  * Run the parser
1db0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1dc0: 74 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20  tor recursively 
1dd0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65  in order to gene
1de0: 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72  rate.** code for
1df0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
1e00: 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68  nt given onto th
1e10: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61  e end of the pPa
1e20: 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63  rse context.** c
1e30: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
1e40: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68  onstruction.  Wh
1e50: 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73  en the parser is
1e60: 20 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79   run recursively
1e70: 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68  .** this way, th
1e80: 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20  e final OP_Halt 
1e90: 69 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20  is not appended 
1ea0: 61 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61  and other initia
1eb0: 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  lization.** and 
1ec0: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65  finalization ste
1ed0: 70 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62  ps are omitted b
1ee0: 65 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65  ecause those are
1ef0: 20 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65   handling by the
1f00: 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61  .** outermost pa
1f10: 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20  rser..**.** Not 
1f20: 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65  everything is ne
1f30: 73 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61  stable.  This fa
1f40: 63 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e  cility is design
1f50: 65 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20  ed to permit.** 
1f60: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20  INSERT, UPDATE, 
1f70: 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61  and DELETE opera
1f80: 74 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51  tions against SQ
1f90: 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73  LITE_MASTER.  Us
1fa0: 65 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75  e.** care if you
1fb0: 20 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74   decide to try t
1fc0: 6f 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69  o use this routi
1fd0: 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ne for some othe
1fe0: 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76  r purposes..*/.v
1ff0: 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65  oid sqlite3Neste
2000: 64 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50  dParse(Parse *pP
2010: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
2020: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
2030: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
2040: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63   char *zSql;.  c
2050: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
2060: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2070: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2080: 63 68 61 72 20 73 61 76 65 42 75 66 5b 50 41 52  char saveBuf[PAR
2090: 53 45 5f 54 41 49 4c 5f 53 5a 5d 3b 0a 0a 20 20  SE_TAIL_SZ];..  
20a0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
20b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
20c0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73  ert( pParse->nes
20d0: 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65  ted<10 );  /* Ne
20e0: 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c  sting should onl
20f0: 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20  y be of limited 
2100: 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74  depth */.  va_st
2110: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
2120: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
2130: 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a  e3VMPrintf(db, z
2140: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2150: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
2160: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
2170: 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d  return;   /* A m
2180: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
2190: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
21a0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b  pParse->nested++
21b0: 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42  ;.  memcpy(saveB
21c0: 75 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 28 70  uf, PARSE_TAIL(p
21d0: 50 61 72 73 65 29 2c 20 50 41 52 53 45 5f 54 41  Parse), PARSE_TA
21e0: 49 4c 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74  IL_SZ);.  memset
21f0: 28 50 41 52 53 45 5f 54 41 49 4c 28 70 50 61 72  (PARSE_TAIL(pPar
2200: 73 65 29 2c 20 30 2c 20 50 41 52 53 45 5f 54 41  se), 0, PARSE_TA
2210: 49 4c 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  IL_SZ);.  sqlite
2220: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
2230: 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73  e, zSql, &zErrMs
2240: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
2250: 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
2260: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2270: 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d  e(db, zSql);.  m
2280: 65 6d 63 70 79 28 50 41 52 53 45 5f 54 41 49 4c  emcpy(PARSE_TAIL
2290: 28 70 50 61 72 73 65 29 2c 20 73 61 76 65 42 75  (pParse), saveBu
22a0: 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a  f, PARSE_TAIL_SZ
22b0: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73  );.  pParse->nes
22c0: 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51  ted--;.}..#if SQ
22d0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
22e0: 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52  TICATION./*.** R
22f0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54  eturn TRUE if zT
2300: 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65  able is the name
2310: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 74   of the system t
2320: 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73  able that stores
2330: 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20   the.** list of 
2340: 75 73 65 72 73 20 61 6e 64 20 74 68 65 69 72 20  users and their 
2350: 61 63 63 65 73 73 20 63 72 65 64 65 6e 74 69 61  access credentia
2360: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
2370: 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
2380: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2390: 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  le){.  return sq
23a0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
23b0: 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73  able, "sqlite_us
23c0: 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  er")==0;.}.#endi
23d0: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  f../*.** Locate 
23e0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
23f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
2400: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
2410: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
2420: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
2430: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
2440: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
2450: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
2460: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2470: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
2480: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
2490: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
24a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
24b0: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
24c0: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
24d0: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
24e0: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
24f0: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
2500: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
2510: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
2520: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
2530: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
2540: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
2550: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
2560: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2570: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
2580: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
2590: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
25a0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
25b0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
25c0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
25d0: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
25e0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
25f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
2600: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2610: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
2620: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
2630: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
2640: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  ;..  /* All mute
2650: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2660: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2670: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2680: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
2690: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
26a0: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
26b0: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
26c0: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66  texes(db) );.#if
26d0: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
26e0: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a  HENTICATION.  /*
26f0: 20 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20   Only the admin 
2700: 75 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20  user is allowed 
2710: 74 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  to know that the
2720: 20 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62   sqlite_user tab
2730: 6c 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a  le.  ** exists *
2740: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68  /.  if( db->auth
2750: 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48  .authLevel<UAUTH
2760: 5f 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65  _Admin && sqlite
2770: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a  3UserAuthTable(z
2780: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
2790: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
27a0: 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 31 29 7b  ndif.  while(1){
27b0: 0a 20 20 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  .    for(i=OMIT_
27c0: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
27d0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
27e0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
27f0: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
2800: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
2810: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 66  MAIN */.      if
2820: 28 20 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 7c  ( zDatabase==0 |
2830: 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  | sqlite3StrICmp
2840: 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e  (zDatabase, db->
2850: 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29  aDb[j].zDbSName)
2860: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
2870: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
2880: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
2890: 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  , j, 0) );.     
28a0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
28b0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
28c0: 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  j].pSchema->tblH
28d0: 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ash, zName);.   
28e0: 20 20 20 20 20 69 66 28 20 70 20 29 20 72 65 74       if( p ) ret
28f0: 75 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20  urn p;.      }. 
2900: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4e 6f 74 20     }.    /* Not 
2910: 66 6f 75 6e 64 2e 20 20 49 66 20 74 68 65 20 6e  found.  If the n
2920: 61 6d 65 20 77 65 20 77 65 72 65 20 6c 6f 6f 6b  ame we were look
2930: 69 6e 67 20 66 6f 72 20 77 61 73 20 74 65 6d 70  ing for was temp
2940: 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20  .sqlite_master. 
2950: 20 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67     ** then chang
2960: 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 73 71  e the name to sq
2970: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
2980: 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
2990: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
29a0: 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c  e3StrICmp(zName,
29b0: 20 4d 41 53 54 45 52 5f 4e 41 4d 45 29 21 3d 30   MASTER_NAME)!=0
29c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
29d0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
29e0: 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d  p(zDatabase, db-
29f0: 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[1].zDbSName
2a00: 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
2a10: 20 20 7a 4e 61 6d 65 20 3d 20 54 45 4d 50 5f 4d    zName = TEMP_M
2a20: 41 53 54 45 52 5f 4e 41 4d 45 3b 0a 20 20 7d 0a  ASTER_NAME;.  }.
2a30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2a40: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
2a50: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
2a60: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
2a70: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
2a80: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
2a90: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
2aa0: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
2ab0: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
2ac0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
2ad0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
2ae0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
2af0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
2b00: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c  f not found.  Al
2b10: 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65  so leave an.** e
2b20: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
2b30: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
2b40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
2b50: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
2b60: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73  is routine and s
2b70: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2b80: 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
2b90: 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73  * routine leaves
2ba0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2bb0: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
2bc0: 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71  rMsg where.** sq
2bd0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29  lite3FindTable()
2be0: 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61   does not..*/.Ta
2bf0: 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  ble *sqlite3Loca
2c00: 74 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  teTable(.  Parse
2c10: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2c20: 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20    /* context in 
2c30: 77 68 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20  which to report 
2c40: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 33 32 20  errors */.  u32 
2c50: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2c60: 20 20 20 2f 2a 20 4c 4f 43 41 54 45 5f 56 49 45     /* LOCATE_VIE
2c70: 57 20 6f 72 20 4c 4f 43 41 54 45 5f 4e 4f 45 52  W or LOCATE_NOER
2c80: 52 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  R */.  const cha
2c90: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  r *zName,     /*
2ca0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
2cb0: 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  le we are lookin
2cc0: 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  g for */.  const
2cd0: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20   char *zDbase   
2ce0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2cf0: 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68   database.  Migh
2d00: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
2d10: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f    Table *p;..  /
2d20: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
2d30: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
2d40: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2d50: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
2d60: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
2d70: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
2d80: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
2d90: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
2da0: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
2db0: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
2dc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2dd0: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
2de0: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
2df0: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  e->db, zName, zD
2e00: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
2e10: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
2e20: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 66 6c 61 67  har *zMsg = flag
2e30: 73 20 26 20 4c 4f 43 41 54 45 5f 56 49 45 57 20  s & LOCATE_VIEW 
2e40: 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22  ? "no such view"
2e50: 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c   : "no such tabl
2e60: 65 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e";.#ifndef SQLI
2e70: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2e80: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 73 71 6c  ABLE.    if( sql
2e90: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 70  ite3FindDbName(p
2ea0: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 44 62 61 73  Parse->db, zDbas
2eb0: 65 29 3c 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  e)<1 ){.      /*
2ec0: 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 74 68 65   If zName is the
2ed0: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
2ee0: 20 61 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   a table in the 
2ef0: 73 63 68 65 6d 61 20 63 72 65 61 74 65 64 20 75  schema created u
2f00: 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 43 52  sing.      ** CR
2f10: 45 41 54 45 2c 20 74 68 65 6e 20 63 68 65 63 6b  EATE, then check
2f20: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 69 73   to see if it is
2f30: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
2f40: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
2f50: 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20  at.      ** can 
2f60: 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20  be an eponymous 
2f70: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 2a  virtual table. *
2f80: 2f 0a 20 20 20 20 20 20 4d 6f 64 75 6c 65 20 2a  /.      Module *
2f90: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29  pMod = (Module*)
2fa0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2fb0: 26 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4d 6f  &pParse->db->aMo
2fc0: 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  dule, zName);.  
2fd0: 20 20 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20      if( pMod==0 
2fe0: 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  && sqlite3_strni
2ff0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67  cmp(zName, "prag
3000: 6d 61 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20  ma_", 7)==0 ){. 
3010: 20 20 20 20 20 20 20 70 4d 6f 64 20 3d 20 73 71         pMod = sq
3020: 6c 69 74 65 33 50 72 61 67 6d 61 56 74 61 62 52  lite3PragmaVtabR
3030: 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2d 3e  egister(pParse->
3040: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
3050: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4d    }.      if( pM
3060: 6f 64 20 26 26 20 73 71 6c 69 74 65 33 56 74 61  od && sqlite3Vta
3070: 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 49  bEponymousTableI
3080: 6e 69 74 28 70 50 61 72 73 65 2c 20 70 4d 6f 64  nit(pParse, pMod
3090: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
30a0: 75 72 6e 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61  urn pMod->pEpoTa
30b0: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
30c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
30d0: 28 66 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f  (flags & LOCATE_
30e0: 4e 4f 45 52 52 29 3d 3d 30 20 29 7b 0a 20 20 20  NOERR)==0 ){.   
30f0: 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b     if( zDbase ){
3100: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3110: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3120: 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d   "%s: %s.%s", zM
3130: 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d  sg, zDbase, zNam
3140: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
3150: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3160: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3170: 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c   "%s: %s", zMsg,
3180: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
3190: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
31a0: 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
31b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
31c0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
31d0: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
31e0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 2a   identified by *
31f0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
3200: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
3210: 64 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  d sqlite3LocateT
3220: 61 62 6c 65 28 29 2e 20 54 68 65 20 64 69 66 66  able(). The diff
3230: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a  erence between.*
3240: 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  * sqlite3LocateT
3250: 61 62 6c 65 28 29 20 61 6e 64 20 74 68 69 73 20  able() and this 
3260: 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 61 74  function is that
3270: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
3280: 65 73 74 72 69 63 74 73 0a 2a 2a 20 74 68 65 20  estricts.** the 
3290: 73 65 61 72 63 68 20 74 6f 20 73 63 68 65 6d 61  search to schema
32a0: 20 28 70 2d 3e 70 53 63 68 65 6d 61 29 20 69 66   (p->pSchema) if
32b0: 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e   it is not NULL.
32c0: 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79 20   p->pSchema may 
32d0: 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  be.** non-NULL i
32e0: 66 20 69 74 20 69 73 20 70 61 72 74 20 6f 66 20  f it is part of 
32f0: 61 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65  a view or trigge
3300: 72 20 70 72 6f 67 72 61 6d 20 64 65 66 69 6e 69  r program defini
3310: 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c  tion. See.** sql
3320: 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 29  ite3FixSrcList()
3330: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
3340: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c  .Table *sqlite3L
3350: 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 0a  ocateTableItem(.
3360: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3370: 20 0a 20 20 75 33 32 20 66 6c 61 67 73 2c 0a 20   .  u32 flags,. 
3380: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
3390: 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e  item *p.){.  con
33a0: 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  st char *zDb;.  
33b0: 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65  assert( p->pSche
33c0: 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74  ma==0 || p->zDat
33d0: 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66  abase==0 );.  if
33e0: 28 20 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  ( p->pSchema ){.
33f0: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
3400: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
3410: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
3420: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
3430: 7a 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  zDb = pParse->db
3440: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
3450: 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ame;.  }else{.  
3460: 20 20 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61    zDb = p->zData
3470: 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  base;.  }.  retu
3480: 72 6e 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  rn sqlite3Locate
3490: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 66 6c  Table(pParse, fl
34a0: 61 67 73 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a  ags, p->zName, z
34b0: 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  Db);.}../*.** Lo
34c0: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
34d0: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
34e0: 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20  t describes .** 
34f0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
3500: 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  ex given the nam
3510: 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a  e of that index.
3520: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20  ** and the name 
3530: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
3540: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
3550: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75  e index..** Retu
3560: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
3570: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
3580: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
3590: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
35a0: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
35b0: 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74  e.** table and t
35c0: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
35d0: 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72  g index is retur
35e0: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
35f0: 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63  ng.** for duplic
3600: 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  ate index names 
3610: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
3620: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a  earch order is.*
3630: 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  * TEMP first, th
3640: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
3650: 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  y auxiliary data
3660: 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75  bases added.** u
3670: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
3680: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65  command..*/.Inde
3690: 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  x *sqlite3FindIn
36a0: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
36b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
36c0: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
36d0: 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  zDb){.  Index *p
36e0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
36f0: 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20   /* All mutexes 
3700: 61 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  are required for
3710: 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20   schema access. 
3720: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f   Make sure we ho
3730: 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73  ld them. */.  as
3740: 73 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20  sert( zDb!=0 || 
3750: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
3760: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
3770: 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  );.  for(i=OMIT_
3780: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
3790: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  b; i++){.    int
37a0: 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31   j = (i<2) ? i^1
37b0: 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68   : i;  /* Search
37c0: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
37d0: 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20  N */.    Schema 
37e0: 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  *pSchema = db->a
37f0: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  Db[j].pSchema;. 
3800: 20 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65     assert( pSche
3810: 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44  ma );.    if( zD
3820: 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  b && sqlite3StrI
3830: 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62  Cmp(zDb, db->aDb
3840: 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29 20 29 20  [j].zDbSName) ) 
3850: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
3860: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
3870: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
3880: 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20   j, 0) );.    p 
3890: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
38a0: 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  d(&pSchema->idxH
38b0: 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ash, zName);.   
38c0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
38d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
38e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d  }../*.** Reclaim
38f0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64   the memory used
3900: 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a   by an index.*/.
3910: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
3920: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
3930: 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23 69  b, Index *p){.#i
3940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3950: 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69  T_ANALYZE.  sqli
3960: 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61  te3DeleteIndexSa
3970: 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23 65  mples(db, p);.#e
3980: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78  ndif.  sqlite3Ex
3990: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
39a0: 70 50 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a  pPartIdxWhere);.
39b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
39c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 61  tDelete(db, p->a
39d0: 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  ColExpr);.  sqli
39e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
39f0: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66 28  >zColAff);.  if(
3a00: 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20 29 20   p->isResized ) 
3a10: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3a20: 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e 61 7a 43  , (void *)p->azC
3a30: 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  oll);.#ifdef SQL
3a40: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
3a50: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71 6c 69  _OR_STAT4.  sqli
3a60: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f  te3_free(p->aiRo
3a70: 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  wEst);.#endif.  
3a80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3a90: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  , p);.}../*.** F
3aa0: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c  or the index cal
3ab0: 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69  led zIdxName whi
3ac0: 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  ch is found in t
3ad0: 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c  he database iDb,
3ae0: 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20  .** unlike that 
3af0: 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54  index from its T
3b00: 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65  able then remove
3b10: 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a   the index from.
3b20: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  ** the index has
3b30: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
3b40: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75   all memory stru
3b50: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
3b60: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  d.** with the in
3b70: 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
3b80: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
3b90: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  eteIndex(sqlite3
3ba0: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
3bb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e  onst char *zIdxN
3bc0: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
3bd0: 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20 2a 70  Index;.  Hash *p
3be0: 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28  Hash;..  assert(
3bf0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3c00: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3c10: 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d   0) );.  pHash =
3c20: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70   &db->aDb[iDb].p
3c30: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b  Schema->idxHash;
3c40: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
3c50: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  te3HashInsert(pH
3c60: 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30  ash, zIdxName, 0
3c70: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
3c80: 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69  pIndex) ){.    i
3c90: 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  f( pIndex->pTabl
3ca0: 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65  e->pIndex==pInde
3cb0: 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  x ){.      pInde
3cc0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
3cd0: 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  x = pIndex->pNex
3ce0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
3cf0: 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
3d00: 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61      /* Justifica
3d10: 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29  tion of ALWAYS()
3d20: 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75 73  ;  The index mus
3d30: 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73 74  t be on the list
3d40: 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64   of.      ** ind
3d50: 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ices. */.      p
3d60: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
3d70: 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  e->pIndex;.     
3d80: 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
3d90: 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70  ) && p->pNext!=p
3da0: 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e  Index ){ p = p->
3db0: 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20 69  pNext; }.      i
3dc0: 66 28 20 41 4c 57 41 59 53 28 70 20 26 26 20 70  f( ALWAYS(p && p
3dd0: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29  ->pNext==pIndex)
3de0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   ){.        p->p
3df0: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
3e00: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
3e10: 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65    }.    freeInde
3e20: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
3e30: 20 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67   }.  db->mDbFlag
3e40: 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65  s |= DBFLAG_Sche
3e50: 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  maChange;.}../*.
3e60: 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20  ** Look through 
3e70: 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e  the list of open
3e80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
3e90: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64  in db->aDb[] and
3ea0: 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20   if.** any have 
3eb0: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d  been closed, rem
3ec0: 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
3ed0: 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63  e list.  Realloc
3ee0: 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61  ate the.** db->a
3ef0: 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74  Db[] structure t
3f00: 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65  o a smaller size
3f10: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  , if possible..*
3f20: 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68  *.** Entry 0 (th
3f30: 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73  e "main" databas
3f40: 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28  e) and entry 1 (
3f50: 74 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62  the "temp" datab
3f60: 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65  ase).** are neve
3f70: 72 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  r candidates for
3f80: 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64   being collapsed
3f90: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3fa0: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
3fb0: 65 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  eArray(sqlite3 *
3fc0: 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  db){.  int i, j;
3fd0: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
3fe0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3ff0: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
4000: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
4010: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
4020: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
4030: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4040: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a  pDb->zDbSName);.
4050: 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e        pDb->zDbSN
4060: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ame = 0;.      c
4070: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
4080: 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20     if( j<i ){.  
4090: 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d      db->aDb[j] =
40a0: 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20   db->aDb[i];.   
40b0: 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a   }.    j++;.  }.
40c0: 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20    db->nDb = j;. 
40d0: 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20   if( db->nDb<=2 
40e0: 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e  && db->aDb!=db->
40f0: 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20  aDbStatic ){.   
4100: 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53   memcpy(db->aDbS
4110: 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20  tatic, db->aDb, 
4120: 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62  2*sizeof(db->aDb
4130: 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  [0]));.    sqlit
4140: 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d  e3DbFree(db, db-
4150: 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61  >aDb);.    db->a
4160: 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74  Db = db->aDbStat
4170: 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ic;.  }.}../*.**
4180: 20 52 65 73 65 74 20 74 68 65 20 73 63 68 65 6d   Reset the schem
4190: 61 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  a for the databa
41a0: 73 65 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e  se at index iDb.
41b0: 20 20 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65    Also reset the
41c0: 0a 2a 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e  .** TEMP schema.
41d0: 20 20 54 68 65 20 72 65 73 65 74 20 69 73 20 64    The reset is d
41e0: 65 66 65 72 72 65 64 20 69 66 20 64 62 2d 3e 6e  eferred if db->n
41f0: 53 63 68 65 6d 61 4c 6f 63 6b 20 69 73 20 6e 6f  SchemaLock is no
4200: 74 20 7a 65 72 6f 2e 0a 2a 2a 20 44 65 66 65 72  t zero..** Defer
4210: 72 65 64 20 72 65 73 65 74 73 20 6d 61 79 20 62  red resets may b
4220: 65 20 72 75 6e 20 62 79 20 63 61 6c 6c 69 6e 67  e run by calling
4230: 20 77 69 74 68 20 69 44 62 3c 30 2e 0a 2a 2f 0a   with iDb<0..*/.
4240: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
4250: 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74  tOneSchema(sqlit
4260: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29  e3 *db, int iDb)
4270: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
4280: 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
4290: 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62 3e 3d   );..  if( iDb>=
42a0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
42b0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
42c0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
42d0: 20 30 29 20 29 3b 0a 20 20 20 20 44 62 53 65 74   0) );.    DbSet
42e0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62  Property(db, iDb
42f0: 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64  , DB_ResetWanted
4300: 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70  );.    DbSetProp
4310: 65 72 74 79 28 64 62 2c 20 31 2c 20 44 42 5f 52  erty(db, 1, DB_R
4320: 65 73 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 7d  esetWanted);.  }
4330: 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68  ..  if( db->nSch
4340: 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  emaLock==0 ){.  
4350: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
4360: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
4370: 20 20 69 66 28 20 44 62 48 61 73 50 72 6f 70 65    if( DbHasPrope
4380: 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 52 65  rty(db, i, DB_Re
4390: 73 65 74 57 61 6e 74 65 64 29 20 29 7b 0a 20 20  setWanted) ){.  
43a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68        sqlite3Sch
43b0: 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62  emaClear(db->aDb
43c0: 5b 69 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20  [i].pSchema);.  
43d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
43e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61  }../*.** Erase a
43f0: 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d  ll schema inform
4400: 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20 61  ation from all a
4410: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
4420: 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20  s (including.** 
4430: 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d 70  "main" and "temp
4440: 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ") for a single 
4450: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
4460: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
4470: 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65  ite3ResetAllSche
4480: 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28  masOfConnection(
4490: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
44a0: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
44b0: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
44c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
44d0: 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20  >nSchemaLock==0 
44e0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
44f0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
4500: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
4510: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
4520: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 29  ( pDb->pSchema )
4530: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
4540: 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e  chemaClear(pDb->
4550: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
4560: 20 20 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61    }.  db->mDbFla
4570: 67 73 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63  gs &= ~DBFLAG_Sc
4580: 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 73 71  hemaChange;.  sq
4590: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
45a0: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
45b0: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
45c0: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  db);.  sqlite3Co
45d0: 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72  llapseDatabaseAr
45e0: 72 61 79 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ray(db);.}../*.*
45f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4600: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4610: 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a  commit occurs..*
4620: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
4630: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
4640: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
4650: 7b 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73  {.  db->mDbFlags
4660: 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63 68 65   &= ~DBFLAG_Sche
4670: 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  maChange;.}../*.
4680: 2a 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79  ** Delete memory
4690: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
46a0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
46b0: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
46c0: 65 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65  ew (the.** Table
46d0: 2e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a  .aCol[] array)..
46e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
46f0: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
4700: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
4710: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
4720: 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20  int i;.  Column 
4730: 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28  *pCol;.  assert(
4740: 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20   pTable!=0 );.  
4750: 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62  if( (pCol = pTab
4760: 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a  le->aCol)!=0 ){.
4770: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
4780: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
4790: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
47a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
47b0: 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  b, pCol->zName);
47c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
47d0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  prDelete(db, pCo
47e0: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->pDflt);.     
47f0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4800: 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b  b, pCol->zColl);
4810: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4820: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
4830: 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a  ble->aCol);.  }.
4840: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
4850: 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20  the memory data 
4860: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
4870: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
4880: 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20  iven.** Table.  
4890: 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
48a0: 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74  ade to disk by t
48b0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
48c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
48d0: 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65  just deletes the
48e0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e   data structure.
48f0: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e    It does not un
4900: 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c  link.** the tabl
4910: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
4920: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
4930: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
4940: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
4950: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
4960: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
4970: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
4980: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4990: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
49a0: 2a 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61  *.** The db para
49b0: 6d 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61  meter is optiona
49c0: 6c 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65 64  l.  It is needed
49d0: 20 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62   if the Table ob
49e0: 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  ject .** contain
49f0: 73 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  s lookaside memo
4a00: 72 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65  ry.  (Table obje
4a10: 63 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d  cts in the schem
4a20: 61 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  a do not use.** 
4a30: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
4a40: 2c 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d  , but some ephem
4a50: 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63  eral Table objec
4a60: 74 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a  ts do.)  Or the.
4a70: 2a 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72 20  ** db parameter 
4a80: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
4a90: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4aa0: 64 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65  d to measure the
4ab0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20   memory.** used 
4ac0: 62 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  by the Table obj
4ad0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
4ae0: 6f 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  oid SQLITE_NOINL
4af0: 49 4e 45 20 64 65 6c 65 74 65 54 61 62 6c 65 28  INE deleteTable(
4b00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
4b10: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49  le *pTable){.  I
4b20: 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70  ndex *pIndex, *p
4b30: 4e 65 78 74 3b 0a 0a 23 69 66 64 65 66 20 53 51  Next;..#ifdef SQ
4b40: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
4b50: 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  Record the numbe
4b60: 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
4b70: 20 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f 63   lookaside alloc
4b80: 61 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d 61  ations in schema
4b90: 20 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72 69   Tables.  ** pri
4ba0: 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20  or to doing any 
4bb0: 66 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f 6e  free() operation
4bc0: 73 2e 20 20 53 69 6e 63 65 20 73 63 68 65 6d 61  s.  Since schema
4bd0: 20 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 75   Tables do not u
4be0: 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64  se.  ** lookasid
4bf0: 65 2c 20 74 68 69 73 20 6e 75 6d 62 65 72 20 73  e, this number s
4c00: 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65  hould not change
4c10: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b  . */.  int nLook
4c20: 61 73 69 64 65 20 3d 20 30 3b 0a 20 20 69 66 28  aside = 0;.  if(
4c30: 20 64 62 20 26 26 20 28 70 54 61 62 6c 65 2d 3e   db && (pTable->
4c40: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
4c50: 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20  hemeral)==0 ){. 
4c60: 20 20 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20     nLookaside = 
4c70: 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65  sqlite3Lookaside
4c80: 55 73 65 64 28 64 62 2c 20 30 29 3b 0a 20 20 7d  Used(db, 0);.  }
4c90: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65  .#endif..  /* De
4ca0: 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  lete all indices
4cb0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4cc0: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a   this table. */.
4cd0: 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70    for(pIndex = p
4ce0: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
4cf0: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e  Index; pIndex=pN
4d00: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
4d10: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
4d20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
4d30: 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  dex->pSchema==pT
4d40: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 0a 20 20  able->pSchema.  
4d50: 20 20 20 20 20 20 20 7c 7c 20 28 49 73 56 69 72         || (IsVir
4d60: 74 75 61 6c 28 70 54 61 62 6c 65 29 20 26 26 20  tual(pTable) && 
4d70: 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 21  pIndex->idxType!
4d80: 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
4d90: 41 50 50 44 45 46 29 20 29 3b 0a 20 20 20 20 69  APPDEF) );.    i
4da0: 66 28 20 28 64 62 3d 3d 30 20 7c 7c 20 64 62 2d  f( (db==0 || db-
4db0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4dc0: 29 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  ) && !IsVirtual(
4dd0: 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20  pTable) ){.     
4de0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
4df0: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20  Index->zName; . 
4e00: 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20       TESTONLY ( 
4e10: 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20  Index *pOld = ) 
4e20: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
4e30: 74 28 0a 20 20 20 20 20 20 20 20 20 26 70 49 6e  t(.         &pIn
4e40: 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  dex->pSchema->id
4e50: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a  xHash, zName, 0.
4e60: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
4e70: 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20  ssert( db==0 || 
4e80: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
4e90: 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49  exHeld(db, 0, pI
4ea0: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29  ndex->pSchema) )
4eb0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4ec0: 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20  pOld==pIndex || 
4ed0: 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  pOld==0 );.    }
4ee0: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
4ef0: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
4f00: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
4f10: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74   foreign keys at
4f20: 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74  tached to this t
4f30: 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  able. */.  sqlit
4f40: 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70  e3FkDelete(db, p
4f50: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65  Table);..  /* De
4f60: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
4f70: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
4f80: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
4f90: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
4fa0: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
4fb0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4fc0: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
4fd0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
4fe0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43  e(db, pTable->zC
4ff0: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
5000: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
5010: 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
5020: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
5030: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
5040: 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b  pTable->pCheck);
5050: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5060: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
5070: 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43  E.  sqlite3VtabC
5080: 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29  lear(db, pTable)
5090: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
50a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
50b0: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  ble);..  /* Veri
50c0: 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61  fy that no looka
50d0: 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20  side memory was 
50e0: 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74  used by schema t
50f0: 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  ables */.  asser
5100: 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30  t( nLookaside==0
5110: 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d   || nLookaside==
5120: 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65  sqlite3Lookaside
5130: 55 73 65 64 28 64 62 2c 30 29 20 29 3b 0a 7d 0a  Used(db,0) );.}.
5140: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
5150: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
5160: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
5170: 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  le){.  /* Do not
5180: 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c   delete the tabl
5190: 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65  e until the refe
51a0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
51b0: 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69  hes zero. */.  i
51c0: 66 28 20 21 70 54 61 62 6c 65 20 29 20 72 65 74  f( !pTable ) ret
51d0: 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62  urn;.  if( ((!db
51e0: 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   || db->pnBytesF
51f0: 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70  reed==0) && (--p
5200: 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 29 3e  Table->nTabRef)>
5210: 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
5220: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
5230: 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Table);.}.../*.*
5240: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
5250: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
5260: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
5270: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
5280: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
5290: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
52a0: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
52b0: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
52c0: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
52d0: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
52e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
52f0: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
5300: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
5310: 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44  ble *p;.  Db *pD
5320: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  b;..  assert( db
5330: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
5340: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
5350: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
5360: 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a  rt( zTabName );.
5370: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5380: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
5390: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
53a0: 20 20 74 65 73 74 63 61 73 65 28 20 7a 54 61 62    testcase( zTab
53b0: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f  Name[0]==0 );  /
53c0: 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61  * Zero-length ta
53d0: 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c  ble names are al
53e0: 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d  lowed */.  pDb =
53f0: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
5400: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
5410: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
5420: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
5430: 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  zTabName, 0);.  
5440: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
5450: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
5460: 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46  >mDbFlags |= DBF
5470: 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
5480: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
5490: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
54a0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
54b0: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
54c0: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
54d0: 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  oken.  Space to 
54e0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
54f0: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f  d string.** is o
5500: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
5510: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
5520: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
5530: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
5540: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
5550: 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61  Any quotation ma
5560: 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22  rks (ex:  "name"
5570: 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d  , 'name', [name]
5580: 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61  , or `name`) tha
5590: 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68  t.** surround th
55a0: 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f  e body of the to
55b0: 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e  ken are removed.
55c0: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
55d0: 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69  e often just poi
55e0: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
55f0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
5600: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
5610: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
5620: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
5630: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
5640: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
5650: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
5660: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
5670: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
5680: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
5690: 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a  mToken(sqlite3 *
56a0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
56b0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
56c0: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  ;.  if( pName ){
56d0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
56e0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
56f0: 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e  , (char*)pName->
5700: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
5710: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
5720: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (zName);.  }else
5730: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
5740: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
5750: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
5760: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
5770: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
5780: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
5790: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
57a0: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
57b0: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
57c0: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
57d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
57e0: 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73  MasterTable(Pars
57f0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *p, int iDb){.
5800: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
5810: 74 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20  te3GetVdbe(p);. 
5820: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
5830: 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52  k(p, iDb, MASTER
5840: 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53 54 45 52  _ROOT, 1, MASTER
5850: 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c 69 74 65  _NAME);.  sqlite
5860: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
5870: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
5880: 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  0, MASTER_ROOT, 
5890: 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70  iDb, 5);.  if( p
58a0: 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ->nTab==0 ){.   
58b0: 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20   p->nTab = 1;.  
58c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  }.}../*.** Param
58d0: 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74  eter zName point
58e0: 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69  s to a nul-termi
58f0: 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e  nated buffer con
5900: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
5910: 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73  .** of a databas
5920: 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  e ("main", "temp
5930: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
5940: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
5950: 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
5960: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69  on returns the i
5970: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
5980: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
5990: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d  ->aDb[], or.** -
59a0: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
59b0: 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  b cannot be foun
59c0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
59d0: 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69  3FindDbName(sqli
59e0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
59f0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
5a00: 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20  nt i = -1;      
5a10: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
5a20: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a  umber */.  if( z
5a30: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a  Name ){.    Db *
5a40: 70 44 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28  pDb;.    for(i=(
5a50: 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d  db->nDb-1), pDb=
5a60: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d  &db->aDb[i]; i>=
5a70: 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a  0; i--, pDb--){.
5a80: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
5a90: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 44 62  ite3_stricmp(pDb
5aa0: 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4e 61 6d  ->zDbSName, zNam
5ab0: 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  e) ) break;.    
5ac0: 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69 73 20 61    /* "main" is a
5ad0: 6c 77 61 79 73 20 61 6e 20 61 63 63 65 70 74 61  lways an accepta
5ae0: 62 6c 65 20 61 6c 69 61 73 20 66 6f 72 20 74 68  ble alias for th
5af0: 65 20 70 72 69 6d 61 72 79 20 64 61 74 61 62 61  e primary databa
5b00: 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  se.      ** even
5b10: 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20   if it has been 
5b20: 72 65 6e 61 6d 65 64 20 75 73 69 6e 67 20 53 51  renamed using SQ
5b30: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41  LITE_DBCONFIG_MA
5b40: 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a 20 20 20  INDBNAME. */.   
5b50: 20 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20 30     if( i==0 && 0
5b60: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
5b70: 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65 29  p("main", zName)
5b80: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
5b90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
5ba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
5bb0: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
5bc0: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
5bd0: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
5be0: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
5bf0: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
5c00: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
5c10: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
5c20: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
5c30: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
5c40: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
5c50: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
5c60: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
5c70: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
5c80: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  xist..*/.int sql
5c90: 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74  ite3FindDb(sqlit
5ca0: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
5cb0: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Name){.  int i; 
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ce0: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
5cf0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
5d00: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
5d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
5d20: 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68  me we are search
5d30: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61  ing for */.  zNa
5d40: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
5d50: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
5d60: 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69  ame);.  i = sqli
5d70: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
5d80: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
5d90: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
5da0: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ame);.  return i
5db0: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c  ;.}../* The tabl
5dc0: 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69  e or view or tri
5dd0: 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73  gger name is pas
5de0: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
5df0: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a  ine via tokens.*
5e00: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
5e10: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
5e20: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
5e30: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
5e40: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43  example:.**.** C
5e50: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
5e60: 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a  yyy (...);.** .*
5e70: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
5e80: 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e   set to "xxx" an
5e90: 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20  d pName2 "yyy". 
5ea0: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
5eb0: 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d if.** the tabl
5ec0: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
5ed0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
5ee0: 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  .e.:.**.** CREAT
5ef0: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
5f00: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  ;.**.** Then pNa
5f10: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
5f20: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
5f30: 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  s ""..**.** This
5f40: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
5f50: 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e  e *ppUnqual poin
5f60: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
5f70: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
5f80: 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20  1 or.** pName2) 
5f90: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
5fa0: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
5fb0: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64  e name.  The ind
5fc0: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ex of the.** dat
5fd0: 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72  abase "xxx" is r
5fe0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
5ff0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
6000: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
6010: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
6020: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
6030: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
6040: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
6050: 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me1,      /* The
6060: 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61   "xxx" in the na
6070: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20  me "xxx.yyy" or 
6080: 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  "xxx" */.  Token
6090: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f   *pName2,      /
60a0: 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74  * The "yyy" in t
60b0: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
60c0: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70  " */.  Token **p
60d0: 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72  Unqual     /* Wr
60e0: 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66  ite the unqualif
60f0: 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ied object name 
6100: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
6110: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
6120: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
6130: 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
6140: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
6150: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
6160: 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  e->db;..  assert
6170: 28 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a 20  ( pName2!=0 );. 
6180: 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30   if( pName2->n>0
6190: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
61a0: 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20  init.busy ) {.  
61b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
61c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72  Msg(pParse, "cor
61d0: 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b  rupt database");
61e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
61f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e  ;.    }.    *pUn
6200: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20  qual = pName2;. 
6210: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
6220: 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65  FindDb(db, pName
6230: 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  1);.    if( iDb<
6240: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
6250: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6260: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  e, "unknown data
6270: 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31  base %T", pName1
6280: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6290: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
62a0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
62b0: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c  b->init.iDb==0 |
62c0: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 0a  | db->init.busy.
62d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
62e0: 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20  (db->mDbFlags & 
62f0: 44 42 46 4c 41 47 5f 56 61 63 75 75 6d 29 21 3d  DBFLAG_Vacuum)!=
6300: 30 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62  0);.    iDb = db
6310: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
6320: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
6330: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
6340: 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  iDb;.}../*.** Th
6350: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
6360: 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
6370: 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  he UTF-8 string 
6380: 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c  zName is a legal
6390: 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20  .** unqualified 
63a0: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73  name for a new s
63b0: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61  chema object (ta
63c0: 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77  ble, index, view
63d0: 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e   or.** trigger).
63e0: 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c   All names are l
63f0: 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73  egal except thos
6400: 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  e that begin wit
6410: 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  h the string.** 
6420: 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70  "sqlite_" (in up
6430: 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69  per, lower or mi
6440: 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20  xed case). This 
6450: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  portion of the n
6460: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72  amespace.** is r
6470: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
6480: 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74  rnal use..*/.int
6490: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a   sqlite3CheckObj
64a0: 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70  ectName(Parse *p
64b0: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
64c0: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
64d0: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
64e0: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
64f0: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20  e->nested==0 .  
6500: 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72          && (pPar
6510: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
6520: 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
6530: 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ma)==0.         
6540: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
6550: 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  rNICmp(zName, "s
6560: 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20  qlite_", 7) ){. 
6570: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6580: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65  sg(pParse, "obje
6590: 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64  ct name reserved
65a0: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73   for internal us
65b0: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
65c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
65d0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
65e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
65f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6600: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
6610: 20 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62 6c   index of a tabl
6620: 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  e.*/.Index *sqli
6630: 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
6640: 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  ex(Table *pTab){
6650: 0a 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 66  .  Index *p;.  f
6660: 6f 72 28 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65  or(p=pTab->pInde
6670: 78 3b 20 70 20 26 26 20 21 49 73 50 72 69 6d 61  x; p && !IsPrima
6680: 72 79 4b 65 79 49 6e 64 65 78 28 70 29 3b 20 70  ryKeyIndex(p); p
6690: 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 72  =p->pNext){}.  r
66a0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
66b0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6c  * Return the col
66c0: 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64  umn of index pId
66d0: 78 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  x that correspon
66e0: 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a 2a 20 63  ds to table.** c
66f0: 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20 52 65 74  olumn iCol.  Ret
6700: 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74 20 66 6f  urn -1 if not fo
6710: 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c 69  und..*/.i16 sqli
6720: 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
6730: 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 31  (Index *pIdx, i1
6740: 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69  6 iCol){.  int i
6750: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
6760: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
6770: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  +){.    if( iCol
6780: 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
6790: 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  [i] ) return i;.
67a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
67b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
67c0: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e  constructing a n
67d0: 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65  ew table represe
67e0: 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72  ntation in memor
67f0: 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74  y.  This is.** t
6800: 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65  he first of seve
6810: 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  ral action routi
6820: 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c  nes that get cal
6830: 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a  led in response.
6840: 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54  ** to a CREATE T
6850: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
6860: 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20   In particular, 
6870: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
6880: 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20  called.** after 
6890: 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43  seeing tokens "C
68a0: 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c  REATE" and "TABL
68b0: 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  E" and the table
68c0: 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d   name. The isTem
68d0: 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  p.** flag is tru
68e0: 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  e if the table s
68f0: 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
6900: 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
6910: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
6920: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20  e instead of in 
6930: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
6940: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  e file.  This is
6950: 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61   normally the ca
6960: 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22  se.** when the "
6970: 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52  TEMP" or "TEMPOR
6980: 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63  ARY" keyword occ
6990: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a  urs in between.*
69a0: 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42  * CREATE and TAB
69b0: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  LE..**.** The ne
69c0: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  w table record i
69d0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  s initialized an
69e0: 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d  d put in pParse-
69f0: 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41  >pNewTable..** A
6a00: 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52  s more of the CR
6a10: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
6a20: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20  ment is parsed, 
6a30: 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f  additional actio
6a40: 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69  n.** routines wi
6a50: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  ll be called to 
6a60: 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  add more informa
6a70: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63  tion to this rec
6a80: 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ord..** At the e
6a90: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
6aa0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
6ab0: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64  , the sqlite3End
6ac0: 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a  Table() routine.
6ad0: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ** is called to 
6ae0: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e  complete the con
6af0: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65  struction of the
6b00: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
6b10: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
6b20: 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20  e3StartTable(.  
6b30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
6b40: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
6b50: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
6b60: 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73  Name1,   /* Firs
6b70: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  t part of the na
6b80: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
6b90: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  or view */.  Tok
6ba0: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a  en *pName2,   /*
6bb0: 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
6bc0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
6bd0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
6be0: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
6bf0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
6c00: 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61  his is a TEMP ta
6c10: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ble */.  int isV
6c20: 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  iew,      /* Tru
6c30: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
6c40: 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  IEW */.  int isV
6c50: 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75  irtual,   /* Tru
6c60: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
6c70: 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a  IRTUAL table */.
6c80: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
6c90: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
6ca0: 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64   if table alread
6cb0: 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
6cc0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a   Table *pTable;.
6cd0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
6ce0: 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f  0; /* The name o
6cf0: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
6d00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
6d10: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
6d20: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
6d30: 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
6d40: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
6d50: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
6d60: 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ble in */.  Toke
6d70: 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  n *pName;    /* 
6d80: 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
6d90: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
6da0: 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66   create */..  if
6db0: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
6dc0: 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  && db->init.newT
6dd0: 6e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  num==1 ){.    /*
6de0: 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20   Special case:  
6df0: 50 61 72 73 69 6e 67 20 74 68 65 20 73 71 6c 69  Parsing the sqli
6e00: 74 65 5f 6d 61 73 74 65 72 20 6f 72 20 73 71 6c  te_master or sql
6e10: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
6e20: 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69 44  schema */.    iD
6e30: 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  b = db->init.iDb
6e40: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  ;.    zName = sq
6e50: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
6e60: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
6e70: 44 62 29 29 3b 0a 20 20 20 20 70 4e 61 6d 65 20  Db));.    pName 
6e80: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 65 6c 73  = pName1;.  }els
6e90: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  e{.    /* The co
6ea0: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20  mmon case */.   
6eb0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
6ec0: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
6ed0: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
6ee0: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
6ef0: 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
6f00: 6e 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  n;.    if( !OMIT
6f10: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
6f20: 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  p && pName2->n>0
6f30: 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20   && iDb!=1 ){.  
6f40: 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69      /* If creati
6f50: 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c  ng a temp table,
6f60: 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f   the name may no
6f70: 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20  t be qualified. 
6f80: 55 6e 6c 65 73 73 20 0a 20 20 20 20 20 20 2a 2a  Unless .      **
6f90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
6fa0: 6d 65 20 69 73 20 22 74 65 6d 70 22 20 61 6e 79  me is "temp" any
6fb0: 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73  way.  */.      s
6fc0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6fd0: 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72  Parse, "temporar
6fe0: 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73  y table name mus
6ff0: 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64  t be unqualified
7000: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
7010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7020: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
7030: 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31  isTemp ) iDb = 1
7040: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  ;.    zName = sq
7050: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
7060: 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
7070: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61   }.  pParse->sNa
7080: 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65  meToken = *pName
7090: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
70a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
70b0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
70c0: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
70d0: 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
70e0: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65  ) ){.    goto be
70f0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7100: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69  .  }.  if( db->i
7110: 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54  nit.iDb==1 ) isT
7120: 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  emp = 1;.#ifndef
7130: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
7140: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73  HORIZATION.  ass
7150: 65 72 74 28 20 69 73 54 65 6d 70 3d 3d 30 20 7c  ert( isTemp==0 |
7160: 7c 20 69 73 54 65 6d 70 3d 3d 31 20 29 3b 0a 20  | isTemp==1 );. 
7170: 20 61 73 73 65 72 74 28 20 69 73 56 69 65 77 3d   assert( isView=
7180: 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 31 20  =0 || isView==1 
7190: 29 3b 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69  );.  {.    stati
71a0: 63 20 63 6f 6e 73 74 20 75 38 20 61 43 6f 64 65  c const u8 aCode
71b0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 53 51  [] = {.       SQ
71c0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
71d0: 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45  E,.       SQLITE
71e0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  _CREATE_TEMP_TAB
71f0: 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54  LE,.       SQLIT
7200: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 2c 0a 20  E_CREATE_VIEW,. 
7210: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45        SQLITE_CRE
7220: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 0a 20 20  ATE_TEMP_VIEW.  
7230: 20 20 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a    };.    char *z
7240: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
7250: 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
7260: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
7270: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
7280: 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
7290: 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29  MA_TABLE(isTemp)
72a0: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
72b0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
72c0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
72d0: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74  .    if( !isVirt
72e0: 75 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75  ual && sqlite3Au
72f0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
7300: 28 69 6e 74 29 61 43 6f 64 65 5b 69 73 54 65 6d  (int)aCode[isTem
7310: 70 2b 32 2a 69 73 56 69 65 77 5d 2c 0a 20 20 20  p+2*isView],.   
7320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7340: 20 20 20 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44      zName, 0, zD
7350: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
7360: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
7370: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  or;.    }.  }.#e
7380: 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
7390: 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62  sure the new tab
73a0: 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74  le name does not
73b0: 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e   collide with an
73c0: 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69   existing.  ** i
73d0: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61  ndex or table na
73e0: 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  me in the same d
73f0: 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65 20  atabase.  Issue 
7400: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
7410: 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73   if.  ** it does
7420: 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20  . The exception 
7430: 69 73 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  is if the statem
7440: 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65 64  ent being parsed
7450: 20 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a   was passed.  **
7460: 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64   to an sqlite3_d
7470: 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61  eclare_vtab() ca
7480: 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ll. In that case
7490: 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   only the column
74a0: 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20   names.  ** and 
74b0: 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73  types will be us
74c0: 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20  ed, so there is 
74d0: 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20  no need to test 
74e0: 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20  for namespace.  
74f0: 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20  ** collisions.. 
7500: 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44 45   */.  if( !IN_DE
7510: 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20  CLARE_VTAB ){.  
7520: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
7530: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
7540: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  ame;.    if( SQL
7550: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
7560: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
7570: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
7580: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
7590: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  r;.    }.    pTa
75a0: 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ble = sqlite3Fin
75b0: 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
75c0: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
75d0: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  pTable ){.      
75e0: 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20  if( !noErr ){.  
75f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7600: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
7610: 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20  able %T already 
7620: 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b  exists", pName);
7630: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7640: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
7650: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
7660: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
7670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
7680: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
7690: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
76a0: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62    }.      goto b
76b0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
76c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
76d0: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
76e0: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29  (db, zName, zDb)
76f0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
7700: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7710: 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
7720: 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20  lready an index 
7730: 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
7740: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  );.      goto be
7750: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7760: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54  .    }.  }..  pT
7770: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62  able = sqlite3Db
7780: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
7790: 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
77a0: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
77b0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
77c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
77d0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
77e0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
77f0: 42 4b 50 54 3b 0a 20 20 20 20 70 50 61 72 73 65  BKPT;.    pParse
7800: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
7810: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7820: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
7830: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
7840: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b  e;.  pTable->iPK
7850: 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c  ey = -1;.  pTabl
7860: 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  e->pSchema = db-
7870: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
7880: 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 54 61  a;.  pTable->nTa
7890: 62 52 65 66 20 3d 20 31 3b 0a 23 69 66 64 65 66  bRef = 1;.#ifdef
78a0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
78b0: 52 4f 57 45 53 54 0a 20 20 70 54 61 62 6c 65 2d  ROWEST.  pTable-
78c0: 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71  >nRowLogEst = sq
78d0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 53 51 4c 49  lite3LogEst(SQLI
78e0: 54 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45 53  TE_DEFAULT_ROWES
78f0: 54 29 3b 0a 23 65 6c 73 65 0a 20 20 70 54 61 62  T);.#else.  pTab
7900: 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  le->nRowLogEst =
7910: 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
7920: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
7930: 28 31 30 34 38 35 37 36 29 20 29 3b 0a 23 65 6e  (1048576) );.#en
7940: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 50  dif.  assert( pP
7950: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
7960: 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =0 );.  pParse->
7970: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
7980: 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  le;..  /* If thi
7990: 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73  s is the magic s
79a0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
79b0: 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74  able used by aut
79c0: 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a  oincrement,.  **
79d0: 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70   then record a p
79e0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74  ointer to this t
79f0: 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  able in the main
7a00: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
7a10: 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ure.  ** so that
7a20: 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64   INSERT can find
7a30: 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c   the table easil
7a40: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
7a50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
7a60: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20  INCREMENT.  if( 
7a70: 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20  !pParse->nested 
7a80: 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  && strcmp(zName,
7a90: 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
7aa0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  e")==0 ){.    as
7ab0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
7ac0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
7ad0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
7ae0: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
7af0: 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c  >pSeqTab = pTabl
7b00: 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
7b10: 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
7b20: 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68  ting the code th
7b30: 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74  at will insert t
7b40: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
7b50: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51  into.  ** the SQ
7b60: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
7b70: 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74  e.  Note in part
7b80: 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d  icular that we m
7b90: 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a  ust go ahead.  *
7ba0: 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74  * and allocate t
7bb0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
7bc0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65   for the table e
7bd0: 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72  ntry now.  Befor
7be0: 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41  e any.  ** PRIMA
7bf0: 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
7c00: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61   keywords are pa
7c10: 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79  rsed.  Those key
7c20: 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65  words will cause
7c30: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f  .  ** indices to
7c40: 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20   be created and 
7c50: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
7c60: 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72   must come befor
7c70: 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69  e the .  ** indi
7c80: 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ces.  Hence, the
7c90: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
7ca0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73  or the table mus
7cb0: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20  t be allocated. 
7cc0: 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   ** now..  */.  
7cd0: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
7ce0: 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74  sy && (v = sqlit
7cf0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
7d00: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))!=0 ){.    int
7d10: 20 61 64 64 72 31 3b 0a 20 20 20 20 69 6e 74 20   addr1;.    int 
7d20: 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20  fileFormat;.    
7d30: 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20  int reg1, reg2, 
7d40: 72 65 67 33 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c  reg3;.    /* nul
7d50: 6c 52 6f 77 5b 5d 20 69 73 20 61 6e 20 4f 50 5f  lRow[] is an OP_
7d60: 52 65 63 6f 72 64 20 65 6e 63 6f 64 69 6e 67 20  Record encoding 
7d70: 6f 66 20 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e  of a row contain
7d80: 69 6e 67 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20  ing 5 NULLs */. 
7d90: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
7da0: 63 68 61 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d  char nullRow[] =
7db0: 20 7b 20 36 2c 20 30 2c 20 30 2c 20 30 2c 20 30   { 6, 0, 0, 0, 0
7dc0: 2c 20 30 20 7d 3b 0a 20 20 20 20 73 71 6c 69 74  , 0 };.    sqlit
7dd0: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
7de0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
7df0: 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
7e00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
7e10: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
7e20: 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20   isVirtual ){.  
7e30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7e40: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67  ddOp0(v, OP_VBeg
7e50: 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  in);.    }.#endi
7e60: 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  f..    /* If the
7e70: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64   file format and
7e80: 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65   encoding in the
7e90: 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20 6e   database have n
7ea0: 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20  ot been set, .  
7eb0: 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f    ** set them no
7ec0: 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  w..    */.    re
7ed0: 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67  g1 = pParse->reg
7ee0: 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
7ef0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32  ->nMem;.    reg2
7f00: 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f   = pParse->regRo
7f10: 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ot = ++pParse->n
7f20: 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20  Mem;.    reg3 = 
7f30: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
7f40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7f50: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64  ddOp3(v, OP_Read
7f60: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67  Cookie, iDb, reg
7f70: 33 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  3, BTREE_FILE_FO
7f80: 52 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  RMAT);.    sqlit
7f90: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
7fa0: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 61 64 64  v, iDb);.    add
7fb0: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
7fc0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
7fd0: 20 72 65 67 33 29 3b 20 56 64 62 65 43 6f 76 65   reg3); VdbeCove
7fe0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 66 69 6c  rage(v);.    fil
7ff0: 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66  eFormat = (db->f
8000: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65  lags & SQLITE_Le
8010: 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20  gacyFileFmt)!=0 
8020: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
8030: 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d      1 : SQLITE_M
8040: 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a  AX_FILE_FORMAT;.
8050: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8060: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
8070: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45  ookie, iDb, BTRE
8080: 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 66  E_FILE_FORMAT, f
8090: 69 6c 65 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  ileFormat);.    
80a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
80b0: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
80c0: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 54 45  e, iDb, BTREE_TE
80d0: 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 45 4e 43  XT_ENCODING, ENC
80e0: 28 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  (db));.    sqlit
80f0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
8100: 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 20 20 2f  , addr1);..    /
8110: 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65 61  * This just crea
8120: 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64  tes a place-hold
8130: 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  er record in the
8140: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
8150: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  able..    ** The
8160: 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64 20   record created 
8170: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
8180: 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20   anything yet.  
8190: 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61  It will be repla
81a0: 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ced.    ** by th
81b0: 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20  e real entry in 
81c0: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 61  code generated a
81d0: 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  t sqlite3EndTabl
81e0: 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
81f0: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
8200: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
8210: 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74  s left in regist
8220: 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  er pParse->regRo
8230: 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  wid..    ** The 
8240: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
8250: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
8260: 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  e is left in reg
8270: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
8280: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  ..    ** The row
8290: 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  id and root page
82a0: 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20 61   number values a
82b0: 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  re needed by the
82c0: 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 2a   code that.    *
82d0: 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  * sqlite3EndTabl
82e0: 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e  e will generate.
82f0: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  .    */.#if !def
8300: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
8310: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
8320: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
8330: 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
8340: 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69   if( isView || i
8350: 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20  sVirtual ){.    
8360: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8370: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
8380: 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20 20  r, 0, reg2);.   
8390: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
83a0: 20 20 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65    {.      pParse
83b0: 2d 3e 61 64 64 72 43 72 54 61 62 20 3d 0a 20 20  ->addrCrTab =.  
83c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
83d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
83e0: 72 65 61 74 65 42 74 72 65 65 2c 20 69 44 62 2c  reateBtree, iDb,
83f0: 20 72 65 67 32 2c 20 42 54 52 45 45 5f 49 4e 54   reg2, BTREE_INT
8400: 4b 45 59 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  KEY);.    }.    
8410: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
8420: 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  rTable(pParse, i
8430: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
8440: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8450: 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 72 65  _NewRowid, 0, re
8460: 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g1);.    sqlite3
8470: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
8480: 5f 42 6c 6f 62 2c 20 36 2c 20 72 65 67 33 2c 20  _Blob, 6, reg3, 
8490: 30 2c 20 6e 75 6c 6c 52 6f 77 2c 20 50 34 5f 53  0, nullRow, P4_S
84a0: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
84b0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
84c0: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72   OP_Insert, 0, r
84d0: 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  eg3, reg1);.    
84e0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
84f0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
8500: 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74  PEND);.    sqlit
8510: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
8520: 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a  OP_Close);.  }..
8530: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e    /* Normal (non
8540: 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20  -error) return. 
8550: 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  */.  return;..  
8560: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
8570: 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68  ccurs, we jump h
8580: 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62  ere */.begin_tab
8590: 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  le_error:.  sqli
85a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
85b0: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
85c0: 7d 0a 0a 2f 2a 20 53 65 74 20 70 72 6f 70 65 72  }../* Set proper
85d0: 74 69 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20  ties of a table 
85e0: 63 6f 6c 75 6d 6e 20 62 61 73 65 64 20 6f 6e 20  column based on 
85f0: 74 68 65 20 28 6d 61 67 69 63 61 6c 29 0a 2a 2a  the (magical).**
8600: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   name of the col
8610: 75 6d 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  umn..*/.#if SQLI
8620: 54 45 5f 45 4e 41 42 4c 45 5f 48 49 44 44 45 4e  TE_ENABLE_HIDDEN
8630: 5f 43 4f 4c 55 4d 4e 53 0a 76 6f 69 64 20 73 71  _COLUMNS.void sq
8640: 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65  lite3ColumnPrope
8650: 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 54 61  rtiesFromName(Ta
8660: 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f 6c 75 6d  ble *pTab, Colum
8670: 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20 69 66 28 20  n *pCol){.  if( 
8680: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
8690: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 5f  (pCol->zName, "_
86a0: 5f 68 69 64 64 65 6e 5f 5f 22 2c 20 31 30 29 3d  _hidden__", 10)=
86b0: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e  =0 ){.    pCol->
86c0: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
86d0: 4c 41 47 5f 48 49 44 44 45 4e 3b 0a 20 20 7d 65  LAG_HIDDEN;.  }e
86e0: 6c 73 65 20 69 66 28 20 70 54 61 62 20 26 26 20  lse if( pTab && 
86f0: 70 43 6f 6c 21 3d 70 54 61 62 2d 3e 61 43 6f 6c  pCol!=pTab->aCol
8700: 20 26 26 20 28 70 43 6f 6c 5b 2d 31 5d 2e 63 6f   && (pCol[-1].co
8710: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
8720: 5f 48 49 44 44 45 4e 29 20 29 7b 0a 20 20 20 20  _HIDDEN) ){.    
8730: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
8740: 3d 20 54 46 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a  = TF_OOOHidden;.
8750: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
8760: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63  *.** Add a new c
8770: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62  olumn to the tab
8780: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
8790: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a  ng constructed..
87a0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
87b0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
87c0: 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ine once for eac
87d0: 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  h column declara
87e0: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45  tion.** in a CRE
87f0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
8800: 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61  ent.  sqlite3Sta
8810: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
8820: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
8830: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
8840: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
8850: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8860: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
8870: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
8880: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61  ite3AddColumn(Pa
8890: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
88a0: 65 6e 20 2a 70 4e 61 6d 65 2c 20 54 6f 6b 65 6e  en *pName, Token
88b0: 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c   *pType){.  Tabl
88c0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
88d0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72   char *z;.  char
88e0: 20 2a 7a 54 79 70 65 3b 0a 20 20 43 6f 6c 75 6d   *zType;.  Colum
88f0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74  n *pCol;.  sqlit
8900: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
8910: 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  >db;.  if( (p = 
8920: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
8930: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
8940: 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e    if( p->nCol+1>
8950: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
8960: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
8970: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
8980: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8990: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
89a0: 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d   on %s", p->zNam
89b0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
89c0: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
89d0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
89e0: 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 70 54 79 70   pName->n + pTyp
89f0: 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20 20 69 66 28  e->n + 2);.  if(
8a00: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
8a10: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d    memcpy(z, pNam
8a20: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
8a30: 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20 3d  .  z[pName->n] =
8a40: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71   0;.  sqlite3Deq
8a50: 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69  uote(z);.  for(i
8a60: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
8a70: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
8a80: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c 20  ite3_stricmp(z, 
8a90: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
8aa0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
8ab0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8ac0: 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65  arse, "duplicate
8ad0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73   column name: %s
8ae0: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", z);.      sql
8af0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
8b00: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
8b10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
8b20: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
8b30: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
8b40: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
8b50: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
8b60: 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c  lloc(db,p->aCol,
8b70: 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65  (p->nCol+8)*size
8b80: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
8b90: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
8ba0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8bb0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
8bc0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
8bd0: 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20    }.    p->aCol 
8be0: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43  = aNew;.  }.  pC
8bf0: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
8c00: 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCol];.  memset
8c10: 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCol, 0, sizeof
8c20: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
8c30: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
8c40: 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  ;.  sqlite3Colum
8c50: 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e  nPropertiesFromN
8c60: 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a 20 0a  ame(p, pCol);. .
8c70: 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d    if( pType->n==
8c80: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
8c90: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
8ca0: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
8cb0: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
8cc0: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 20  ult affinity.   
8cd0: 20 2a 2a 20 27 42 4c 4f 42 27 2e 20 2a 2f 0a 20   ** 'BLOB'. */. 
8ce0: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
8cf0: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y = SQLITE_AFF_B
8d00: 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73  LOB;.    pCol->s
8d10: 7a 45 73 74 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  zEst = 1;.  }els
8d20: 65 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 7a  e{.    zType = z
8d30: 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   + sqlite3Strlen
8d40: 33 30 28 7a 29 20 2b 20 31 3b 0a 20 20 20 20 6d  30(z) + 1;.    m
8d50: 65 6d 63 70 79 28 7a 54 79 70 65 2c 20 70 54 79  emcpy(zType, pTy
8d60: 70 65 2d 3e 7a 2c 20 70 54 79 70 65 2d 3e 6e 29  pe->z, pType->n)
8d70: 3b 0a 20 20 20 20 7a 54 79 70 65 5b 70 54 79 70  ;.    zType[pTyp
8d80: 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 73  e->n] = 0;.    s
8d90: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 54  qlite3Dequote(zT
8da0: 79 70 65 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  ype);.    pCol->
8db0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
8dc0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
8dd0: 54 79 70 65 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45  Type, &pCol->szE
8de0: 73 74 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63  st);.    pCol->c
8df0: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
8e00: 41 47 5f 48 41 53 54 59 50 45 3b 0a 20 20 7d 0a  AG_HASTYPE;.  }.
8e10: 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 20 20 70    p->nCol++;.  p
8e20: 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e  Parse->constrain
8e30: 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b 0a 7d 0a 0a  tName.n = 0;.}..
8e40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
8e50: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
8e60: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
8e70: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
8e80: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
8e90: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
8ea0: 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e  ement.  A "NOT N
8eb0: 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20  ULL" constraint 
8ec0: 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e  has.** been seen
8ed0: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54   on a column.  T
8ee0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
8ef0: 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61   the notNull fla
8f00: 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  g on.** the colu
8f10: 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  mn currently und
8f20: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
8f30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8f40: 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65  AddNotNull(Parse
8f50: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e   *pParse, int on
8f60: 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20  Error){.  Table 
8f70: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
8f80: 6f 6c 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  ol;.  p = pParse
8f90: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
8fa0: 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52  f( p==0 || NEVER
8fb0: 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65  (p->nCol<1) ) re
8fc0: 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26  turn;.  pCol = &
8fd0: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d  p->aCol[p->nCol-
8fe0: 31 5d 3b 0a 20 20 70 43 6f 6c 2d 3e 6e 6f 74 4e  1];.  pCol->notN
8ff0: 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  ull = (u8)onErro
9000: 72 3b 0a 20 20 70 2d 3e 74 61 62 46 6c 61 67 73  r;.  p->tabFlags
9010: 20 7c 3d 20 54 46 5f 48 61 73 4e 6f 74 4e 75 6c   |= TF_HasNotNul
9020: 6c 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  l;..  /* Set the
9030: 20 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 66 6c 61   uniqNotNull fla
9040: 67 20 6f 6e 20 61 6e 79 20 55 4e 49 51 55 45 20  g on any UNIQUE 
9050: 6f 72 20 50 4b 20 69 6e 64 65 78 65 73 20 61 6c  or PK indexes al
9060: 72 65 61 64 79 20 63 72 65 61 74 65 64 0a 20 20  ready created.  
9070: 2a 2a 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d  ** on this colum
9080: 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 6f  n.  */.  if( pCo
9090: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f  l->colFlags & CO
90a0: 4c 46 4c 41 47 5f 55 4e 49 51 55 45 20 29 7b 0a  LFLAG_UNIQUE ){.
90b0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
90c0: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d  .    for(pIdx=p-
90d0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
90e0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
90f0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9100: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31  pIdx->nKeyCol==1
9110: 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f   && pIdx->onErro
9120: 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20  r!=OE_None );.  
9130: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
9140: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 70 2d 3e 6e 43  Column[0]==p->nC
9150: 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  ol-1 ){.        
9160: 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  pIdx->uniqNotNul
9170: 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 1;.      }. 
9180: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
9190: 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d  * Scan the colum
91a0: 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70  n type name zTyp
91b0: 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29  e (length nType)
91c0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a   and return the.
91d0: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66  ** associated af
91e0: 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a  finity type..**.
91f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9200: 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65  does a case-inde
9210: 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f  pendent search o
9220: 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20  f zType for the 
9230: 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69  .** substrings i
9240: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
9250: 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66  table. If one of
9260: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
9270: 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65  is.** found, the
9280: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61   corresponding a
9290: 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72  ffinity is retur
92a0: 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f  ned. If zType co
92b0: 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74  ntains.** more t
92c0: 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  han one of the s
92d0: 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69  ubstrings, entri
92e0: 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f  es toward the to
92f0: 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62  p of .** the tab
9300: 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79  le take priority
9310: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
9320: 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42  f zType is 'BLOB
9330: 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45  INT', .** SQLITE
9340: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20  _AFF_INTEGER is 
9350: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
9360: 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20  Substring     | 
9370: 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d  Affinity.** ----
9380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
93a0: 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20  'INT'         | 
93b0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
93c0: 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20  ER.** 'CHAR'    
93d0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
93e0: 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20  _TEXT.** 'CLOB' 
93f0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
9400: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58  AFF_TEXT.** 'TEX
9410: 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  T'        | SQLI
9420: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
9430: 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53  BLOB'        | S
9440: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 0a 2a  QLITE_AFF_BLOB.*
9450: 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20  * 'REAL'        
9460: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
9470: 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20  L.** 'FLOA'     
9480: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
9490: 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20  REAL.** 'DOUB'  
94a0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
94b0: 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66  FF_REAL.**.** If
94c0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62   none of the sub
94d0: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61  strings in the a
94e0: 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66  bove table are f
94f0: 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ound,.** SQLITE_
9500: 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72  AFF_NUMERIC is r
9510: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72  eturned..*/.char
9520: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
9530: 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Type(const char 
9540: 2a 7a 49 6e 2c 20 75 38 20 2a 70 73 7a 45 73 74  *zIn, u8 *pszEst
9550: 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a  ){.  u32 h = 0;.
9560: 20 20 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c    char aff = SQL
9570: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
9580: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9590: 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Char = 0;..  ass
95a0: 65 72 74 28 20 7a 49 6e 21 3d 30 20 29 3b 0a 20  ert( zIn!=0 );. 
95b0: 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30 5d 20 29   while( zIn[0] )
95c0: 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29  {.    h = (h<<8)
95d0: 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72 54   + sqlite3UpperT
95e0: 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 26 30 78  oLower[(*zIn)&0x
95f0: 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a  ff];.    zIn++;.
9600: 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27      if( h==(('c'
9610: 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b  <<24)+('h'<<16)+
9620: 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b  ('a'<<8)+'r') ){
9630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9640: 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66  CHAR */.      af
9650: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
9660: 45 58 54 3b 0a 20 20 20 20 20 20 7a 43 68 61 72  EXT;.      zChar
9670: 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c 73   = zIn;.    }els
9680: 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c  e if( h==(('c'<<
9690: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
96a0: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20  o'<<8)+'b') ){  
96b0: 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a       /* CLOB */.
96c0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
96d0: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
96e0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
96f0: 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  't'<<24)+('e'<<1
9700: 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29  6)+('x'<<8)+'t')
9710: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58   ){       /* TEX
9720: 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  T */.      aff =
9730: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
9740: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9750: 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27  h==(('b'<<24)+('
9760: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
9770: 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'b')          /
9780: 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * BLOB */.      
9790: 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54    && (aff==SQLIT
97a0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c  E_AFF_NUMERIC ||
97b0: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
97c0: 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  _REAL) ){.      
97d0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
97e0: 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 69 66 28  _BLOB;.      if(
97f0: 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20 29 20 7a   zIn[0]=='(' ) z
9800: 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23 69 66 6e  Char = zIn;.#ifn
9810: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9820: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
9830: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9840: 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c  (('r'<<24)+('e'<
9850: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c  <16)+('a'<<8)+'l
9860: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ')          /* R
9870: 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  EAL */.        &
9880: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
9890: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
98a0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
98b0: 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65  AFF_REAL;.    }e
98c0: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27  lse if( h==(('f'
98d0: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
98e0: 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20  ('o'<<8)+'a')   
98f0: 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a         /* FLOA *
9900: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
9910: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
9920: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
9930: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
9940: 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EAL;.    }else i
9950: 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29  f( h==(('d'<<24)
9960: 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c  +('o'<<16)+('u'<
9970: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
9980: 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20    /* DOUB */.   
9990: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
99a0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
99b0: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
99c0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
99d0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
99e0: 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46 46   if( (h&0x00FFFF
99f0: 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b  FF)==(('i'<<16)+
9a00: 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('n'<<8)+'t') ){
9a10: 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20      /* INT */.  
9a20: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9a30: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
9a40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9a50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 73  .  }..  /* If ps
9a60: 7a 45 73 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  zEst is not NULL
9a70: 2c 20 73 74 6f 72 65 20 61 6e 20 65 73 74 69 6d  , store an estim
9a80: 61 74 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64  ate of the field
9a90: 20 73 69 7a 65 2e 20 20 54 68 65 0a 20 20 2a 2a   size.  The.  **
9aa0: 20 65 73 74 69 6d 61 74 65 20 69 73 20 73 63 61   estimate is sca
9ab0: 6c 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  led so that the 
9ac0: 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e 74 65 67  size of an integ
9ad0: 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a 20 20 69  er is 1.  */.  i
9ae0: 66 28 20 70 73 7a 45 73 74 20 29 7b 0a 20 20 20  f( pszEst ){.   
9af0: 20 2a 70 73 7a 45 73 74 20 3d 20 31 3b 20 20 20   *pszEst = 1;   
9b00: 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20  /* default size 
9b10: 69 73 20 61 70 70 72 6f 78 20 34 20 62 79 74 65  is approx 4 byte
9b20: 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66  s */.    if( aff
9b30: 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  <SQLITE_AFF_NUME
9b40: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28  RIC ){.      if(
9b50: 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20   zChar ){.      
9b60: 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30    while( zChar[0
9b70: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ] ){.          i
9b80: 66 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  f( sqlite3Isdigi
9b90: 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20  t(zChar[0]) ){. 
9ba0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76             int v
9bb0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
9bc0: 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33    sqlite3GetInt3
9bd0: 32 28 7a 43 68 61 72 2c 20 26 76 29 3b 0a 20 20  2(zChar, &v);.  
9be0: 20 20 20 20 20 20 20 20 20 20 76 20 3d 20 76 2f            v = v/
9bf0: 34 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20  4 + 1;.         
9c00: 20 20 20 69 66 28 20 76 3e 32 35 35 20 29 20 76     if( v>255 ) v
9c10: 20 3d 20 32 35 35 3b 0a 20 20 20 20 20 20 20 20   = 255;.        
9c20: 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 76 3b      *pszEst = v;
9c30: 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52   /* BLOB(k), VAR
9c40: 43 48 41 52 28 6b 29 2c 20 43 48 41 52 28 6b 29  CHAR(k), CHAR(k)
9c50: 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f   -> r=(k/4+1) */
9c60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
9c70: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
9c80: 20 20 20 20 20 20 20 20 20 20 7a 43 68 61 72 2b            zChar+
9c90: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
9ca0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9cb0: 20 20 2a 70 73 7a 45 73 74 20 3d 20 35 3b 20 20    *pszEst = 5;  
9cc0: 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20   /* BLOB, TEXT, 
9cd0: 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28 61 70  CLOB -> r=5  (ap
9ce0: 70 72 6f 78 20 32 30 20 62 79 74 65 73 29 2a 2f  prox 20 bytes)*/
9cf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9d00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b   }.  return aff;
9d10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78  .}../*.** The ex
9d20: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
9d30: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
9d40: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
9d50: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
9d60: 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65  .** of the table
9d70: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
9d80: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
9d90: 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c  *.** Default val
9da0: 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d  ue expressions m
9db0: 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e  ust be constant.
9dc0: 20 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70    Raise an excep
9dd0: 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20  tion if this.** 
9de0: 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e  is not the case.
9df0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9e00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
9e10: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
9e20: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
9e30: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
9e40: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
9e50: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
9e60: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c  sqlite3AddDefaul
9e70: 74 56 61 6c 75 65 28 0a 20 20 50 61 72 73 65 20  tValue(.  Parse 
9e80: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
9e90: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9ea0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
9eb0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
9ec0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
9ed0: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  d expression of 
9ee0: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
9ef0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
9f00: 72 20 2a 7a 53 74 61 72 74 2c 20 20 20 20 20 20  r *zStart,      
9f10: 2f 2a 20 53 74 61 72 74 20 6f 66 20 74 68 65 20  /* Start of the 
9f20: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 74 65  default value te
9f30: 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  xt */.  const ch
9f40: 61 72 20 2a 7a 45 6e 64 20 20 20 20 20 20 20 20  ar *zEnd        
9f50: 20 2f 2a 20 46 69 72 73 74 20 63 68 61 72 61 63   /* First charac
9f60: 74 65 72 20 70 61 73 74 20 65 6e 64 20 6f 66 20  ter past end of 
9f70: 64 65 66 61 75 74 20 76 61 6c 75 65 20 74 65 78  defaut value tex
9f80: 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  t */.){.  Table 
9f90: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
9fa0: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
9fb0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9fc0: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
9fd0: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
9fe0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20  !=0 ){.    pCol 
9ff0: 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  = &(p->aCol[p->n
a000: 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28  Col-1]);.    if(
a010: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
a020: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
a030: 6e 28 70 45 78 70 72 2c 20 64 62 2d 3e 69 6e 69  n(pExpr, db->ini
a040: 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20  t.busy) ){.     
a050: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a060: 28 70 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c  (pParse, "defaul
a070: 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d  t value of colum
a080: 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f  n [%s] is not co
a090: 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20  nstant",.       
a0a0: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b     pCol->zName);
a0b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a0c0: 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70    /* A copy of p
a0d0: 45 78 70 72 20 69 73 20 75 73 65 64 20 69 6e 73  Expr is used ins
a0e0: 74 65 61 64 20 6f 66 20 74 68 65 20 6f 72 69 67  tead of the orig
a0f0: 69 6e 61 6c 2c 20 61 73 20 70 45 78 70 72 20 63  inal, as pExpr c
a100: 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
a110: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 70 6f 69   tokens that poi
a120: 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d  nt to volatile m
a130: 65 6d 6f 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  emory..      */.
a140: 20 20 20 20 20 20 45 78 70 72 20 78 3b 0a 20 20        Expr x;.  
a150: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
a160: 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  elete(db, pCol->
a170: 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 6d 65  pDflt);.      me
a180: 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a 65  mset(&x, 0, size
a190: 6f 66 28 78 29 29 3b 0a 20 20 20 20 20 20 78 2e  of(x));.      x.
a1a0: 6f 70 20 3d 20 54 4b 5f 53 50 41 4e 3b 0a 20 20  op = TK_SPAN;.  
a1b0: 20 20 20 20 78 2e 75 2e 7a 54 6f 6b 65 6e 20 3d      x.u.zToken =
a1c0: 20 73 71 6c 69 74 65 33 44 62 53 70 61 6e 44 75   sqlite3DbSpanDu
a1d0: 70 28 64 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45  p(db, zStart, zE
a1e0: 6e 64 29 3b 0a 20 20 20 20 20 20 78 2e 70 4c 65  nd);.      x.pLe
a1f0: 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  ft = pExpr;.    
a200: 20 20 78 2e 66 6c 61 67 73 20 3d 20 45 50 5f 53    x.flags = EP_S
a210: 6b 69 70 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  kip;.      pCol-
a220: 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >pDflt = sqlite3
a230: 45 78 70 72 44 75 70 28 64 62 2c 20 26 78 2c 20  ExprDup(db, &x, 
a240: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
a250: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
a260: 46 72 65 65 28 64 62 2c 20 78 2e 75 2e 7a 54 6f  Free(db, x.u.zTo
a270: 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ken);.    }.  }.
a280: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
a290: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
a2a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77 61 72  }../*.** Backwar
a2b0: 64 73 20 43 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds Compatibility
a2c0: 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48 69   Hack:.** .** Hi
a2d0: 73 74 6f 72 69 63 61 6c 20 76 65 72 73 69 6f 6e  storical version
a2e0: 73 20 6f 66 20 53 51 4c 69 74 65 20 61 63 63 65  s of SQLite acce
a2f0: 70 74 65 64 20 73 74 72 69 6e 67 73 20 61 73 20  pted strings as 
a300: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 0a  column names in.
a310: 2a 2a 20 69 6e 64 65 78 65 73 20 61 6e 64 20 50  ** indexes and P
a320: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
a330: 72 61 69 6e 74 73 20 61 6e 64 20 69 6e 20 55 4e  raints and in UN
a340: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73  IQUE constraints
a350: 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  .  Example:.**.*
a360: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
a370: 4c 45 20 78 79 7a 28 61 2c 62 2c 63 2c 64 2c 65  LE xyz(a,b,c,d,e
a380: 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 27 61 27  ,PRIMARY KEY('a'
a390: 29 2c 55 4e 49 51 55 45 28 27 62 27 2c 27 63 27  ),UNIQUE('b','c'
a3a0: 20 43 4f 4c 4c 41 54 45 20 74 72 69 6d 29 0a 2a   COLLATE trim).*
a3b0: 2a 20 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  *     CREATE IND
a3c0: 45 58 20 61 62 63 20 4f 4e 20 78 79 7a 28 27 63  EX abc ON xyz('c
a3d0: 27 2c 27 64 27 20 44 45 53 43 2c 27 65 27 20 43  ','d' DESC,'e' C
a3e0: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 44 45  OLLATE nocase DE
a3f0: 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SC);.**.** This 
a400: 69 73 20 67 6f 6f 66 79 2e 20 20 42 75 74 20 74  is goofy.  But t
a410: 6f 20 70 72 65 73 65 72 76 65 20 62 61 63 6b 77  o preserve backw
a420: 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
a430: 74 79 20 77 65 20 63 6f 6e 74 69 6e 75 65 20 74  ty we continue t
a440: 6f 0a 2a 2a 20 61 63 63 65 70 74 20 69 74 2e 20  o.** accept it. 
a450: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
a460: 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  es the necessary
a470: 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 20 20 49 74   conversion.  It
a480: 20 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74 68 65   converts.** the
a490: 20 65 78 70 72 65 73 73 69 6f 6e 20 67 69 76 65   expression give
a4a0: 6e 20 69 6e 20 69 74 73 20 61 72 67 75 6d 65 6e  n in its argumen
a4b0: 74 20 66 72 6f 6d 20 61 20 54 4b 5f 53 54 52 49  t from a TK_STRI
a4c0: 4e 47 20 69 6e 74 6f 20 61 20 54 4b 5f 49 44 0a  NG into a TK_ID.
a4d0: 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ** if the expres
a4e0: 73 69 6f 6e 20 69 73 20 6a 75 73 74 20 61 20 54  sion is just a T
a4f0: 4b 5f 53 54 52 49 4e 47 20 77 69 74 68 20 61 6e  K_STRING with an
a500: 20 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c 41 54   optional COLLAT
a510: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 49 66 20  E clause..** If 
a520: 74 68 65 20 65 70 78 72 65 73 73 69 6f 6e 20 69  the epxression i
a530: 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72  s anything other
a540: 20 74 68 61 6e 20 54 4b 5f 53 54 52 49 4e 47 2c   than TK_STRING,
a550: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
a560: 69 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  is.** unchanged.
a570: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a580: 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49  sqlite3StringToI
a590: 64 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  d(Expr *p){.  if
a5a0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49  ( p->op==TK_STRI
a5b0: 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 6f 70 20  NG ){.    p->op 
a5c0: 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c 73 65  = TK_ID;.  }else
a5d0: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
a5e0: 4f 4c 4c 41 54 45 20 26 26 20 70 2d 3e 70 4c 65  OLLATE && p->pLe
a5f0: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  ft->op==TK_STRIN
a600: 47 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 65 66  G ){.    p->pLef
a610: 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20  t->op = TK_ID;. 
a620: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69   }.}../*.** Desi
a630: 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52  gnate the PRIMAR
a640: 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61  Y KEY for the ta
a650: 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61  ble.  pList is a
a660: 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a   list of names .
a670: 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68  ** of columns th
a680: 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d  at form the prim
a690: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69  ary key.  If pLi
a6a0: 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  st is NULL, then
a6b0: 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63   the.** most rec
a6c0: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
a6d0: 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  mn of the table 
a6e0: 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  is the primary k
a6f0: 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c  ey..**.** A tabl
a700: 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f  e can have at mo
a710: 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b  st one primary k
a720: 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c  ey.  If the tabl
a730: 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a  e already has.**
a740: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28   a primary key (
a750: 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
a760: 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b  second primary k
a770: 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20  ey) then create 
a780: 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a  an.** error..**.
a790: 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52  ** If the PRIMAR
a7a0: 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69  Y KEY is on a si
a7b0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73  ngle column whos
a7c0: 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e  e datatype is IN
a7d0: 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77  TEGER,.** then w
a7e0: 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73  e will try to us
a7f0: 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73  e that column as
a800: 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74   the rowid.  Set
a810: 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79   the Table.iPKey
a820: 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
a830: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
a840: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
a850: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
a860: 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
a870: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20  ARY KEY column. 
a880: 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20   Table.iPKey is 
a890: 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65  set to -1 if the
a8a0: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45  re is.** no INTE
a8b0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
a8c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65  .**.** If the ke
a8d0: 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  y is not an INTE
a8e0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
a8f0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75   then create a u
a900: 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66  nique.** index f
a910: 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20  or the key.  No 
a920: 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
a930: 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49   for INTEGER PRI
a940: 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f  MARY KEYs..*/.vo
a950: 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69  id sqlite3AddPri
a960: 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65  maryKey(.  Parse
a970: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
a980: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
a990: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
a9a0: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
a9b0: 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f  f field names to
a9c0: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
a9d0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
a9e0: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
a9f0: 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65   with a uniquene
aa00: 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  ss conflict */. 
aa10: 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20   int autoInc,   
aa20: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
aa30: 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  e AUTOINCREMENT 
aa40: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
aa50: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  nt */.  int sort
aa60: 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c  Order     /* SQL
aa70: 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51  ITE_SO_ASC or SQ
aa80: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a  LITE_SO_DESC */.
aa90: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
aaa0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
aab0: 61 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  able;.  Column *
aac0: 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pCol = 0;.  int 
aad0: 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20  iCol = -1, i;.  
aae0: 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66 28  int nTerm;.  if(
aaf0: 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
ab00: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
ab10: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61  ;.  if( pTab->ta
ab20: 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50  bFlags & TF_HasP
ab30: 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20 20  rimaryKey ){.   
ab40: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
ab50: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
ab60: 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61  "table \"%s\" ha
ab70: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
ab80: 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54  primary key", pT
ab90: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
aba0: 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79  goto primary_key
abb0: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61  _exit;.  }.  pTa
abc0: 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
abd0: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 3b  F_HasPrimaryKey;
abe0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
abf0: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
ac00: 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  ab->nCol - 1;.  
ac10: 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e    pCol = &pTab->
ac20: 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  aCol[iCol];.    
ac30: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
ac40: 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  = COLFLAG_PRIMKE
ac50: 59 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 31  Y;.    nTerm = 1
ac60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
ac70: 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  Term = pList->nE
ac80: 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  xpr;.    for(i=0
ac90: 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b  ; i<nTerm; i++){
aca0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 45  .      Expr *pCE
acb0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
acc0: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69  rSkipCollate(pLi
acd0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
ace0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
acf0: 43 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  CExpr!=0 );.    
ad00: 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54    sqlite3StringT
ad10: 6f 49 64 28 70 43 45 78 70 72 29 3b 0a 20 20 20  oId(pCExpr);.   
ad20: 20 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f     if( pCExpr->o
ad30: 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
ad40: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
ad50: 7a 43 4e 61 6d 65 20 3d 20 70 43 45 78 70 72 2d  zCName = pCExpr-
ad60: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
ad70: 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
ad80: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
ad90: 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iCol++){.       
ada0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
adb0: 72 49 43 6d 70 28 7a 43 4e 61 6d 65 2c 20 70 54  rICmp(zCName, pT
adc0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
add0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
ade0: 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
adf0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
ae00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
ae10: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
ae20: 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b  COLFLAG_PRIMKEY;
ae30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
ae40: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
ae50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ae60: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
ae70: 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26  ( nTerm==1.   &&
ae80: 20 70 43 6f 6c 0a 20 20 20 26 26 20 73 71 6c 69   pCol.   && sqli
ae90: 74 65 33 53 74 72 49 43 6d 70 28 73 71 6c 69 74  te3StrICmp(sqlit
aea0: 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f  e3ColumnType(pCo
aeb0: 6c 2c 22 22 29 2c 20 22 49 4e 54 45 47 45 52 22  l,""), "INTEGER"
aec0: 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72 74 4f  )==0.   && sortO
aed0: 72 64 65 72 21 3d 53 51 4c 49 54 45 5f 53 4f 5f  rder!=SQLITE_SO_
aee0: 44 45 53 43 0a 20 20 29 7b 0a 20 20 20 20 70 54  DESC.  ){.    pT
aef0: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c  ab->iPKey = iCol
af00: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43  ;.    pTab->keyC
af10: 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  onf = (u8)onErro
af20: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  r;.    assert( a
af30: 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74  utoInc==0 || aut
af40: 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70  oInc==1 );.    p
af50: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
af60: 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f   autoInc*TF_Auto
af70: 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 20 20 69  increment;.    i
af80: 66 28 20 70 4c 69 73 74 20 29 20 70 50 61 72 73  f( pList ) pPars
af90: 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 20  e->iPkSortOrder 
afa0: 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f  = pList->a[0].so
afb0: 72 74 4f 72 64 65 72 3b 0a 20 20 7d 65 6c 73 65  rtOrder;.  }else
afc0: 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a   if( autoInc ){.
afd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
afe0: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
aff0: 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  T.    sqlite3Err
b000: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41  orMsg(pParse, "A
b010: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20  UTOINCREMENT is 
b020: 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20  only allowed on 
b030: 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54  an ".       "INT
b040: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
b050: 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  ");.#endif.  }el
b060: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  se{.    sqlite3C
b070: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
b080: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73  e, 0, 0, 0, pLis
b090: 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20  t, onError, 0,. 
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0b0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 6f 72            0, sor
b0c0: 74 4f 72 64 65 72 2c 20 30 2c 20 53 51 4c 49 54  tOrder, 0, SQLIT
b0d0: 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52  E_IDXTYPE_PRIMAR
b0e0: 59 4b 45 59 29 3b 0a 20 20 20 20 70 4c 69 73 74  YKEY);.    pList
b0f0: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61   = 0;.  }..prima
b100: 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73  ry_key_exit:.  s
b110: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
b120: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
b130: 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72   pList);.  retur
b140: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  n;.}../*.** Add 
b150: 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73  a new CHECK cons
b160: 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61  traint to the ta
b170: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
b180: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
b190: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b1a0: 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61  3AddCheckConstra
b1b0: 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
b1c0: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
b1d0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
b1e0: 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70   Expr *pCheckExp
b1f0: 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20  r  /* The check 
b200: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
b210: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b220: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62  OMIT_CHECK.  Tab
b230: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
b240: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
b250: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
b260: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
b270: 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c  pTab && !IN_DECL
b280: 41 52 45 5f 56 54 41 42 0a 20 20 20 26 26 20 21  ARE_VTAB.   && !
b290: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 65  sqlite3BtreeIsRe
b2a0: 61 64 6f 6e 6c 79 28 64 62 2d 3e 61 44 62 5b 64  adonly(db->aDb[d
b2b0: 62 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e 70 42 74  b->init.iDb].pBt
b2c0: 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  ).  ){.    pTab-
b2d0: 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65  >pCheck = sqlite
b2e0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
b2f0: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43  pParse, pTab->pC
b300: 68 65 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72  heck, pCheckExpr
b310: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
b320: 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d  e->constraintNam
b330: 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  e.n ){.      sql
b340: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
b350: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ame(pParse, pTab
b360: 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73  ->pCheck, &pPars
b370: 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d  e->constraintNam
b380: 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 1);.    }.  }
b390: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
b3a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
b3b0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
b3c0: 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20  , pCheckExpr);. 
b3d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
b3e0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  the collation fu
b3f0: 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nction of the mo
b400: 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73  st recently pars
b410: 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a  ed table column.
b420: 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65  ** to the CollSe
b430: 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64  q given..*/.void
b440: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61   sqlite3AddColla
b450: 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  teType(Parse *pP
b460: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  arse, Token *pTo
b470: 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ken){.  Table *p
b480: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
b490: 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20  r *zColl;       
b4a0: 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74         /* Dequot
b4b0: 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  ed name of colla
b4c0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f  tion sequence */
b4d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
b4e0: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
b4f0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
b500: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
b510: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64  = p->nCol-1;.  d
b520: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
b530: 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    zColl = sqlite
b540: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
b550: 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66  b, pToken);.  if
b560: 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72  ( !zColl ) retur
b570: 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  n;..  if( sqlite
b580: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
b590: 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Parse, zColl) ){
b5a0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
b5b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
b5c0: 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b  ree(db, p->aCol[
b5d0: 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70  i].zColl);.    p
b5e0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20  ->aCol[i].zColl 
b5f0: 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20  = zColl;.  .    
b600: 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
b610: 20 69 73 20 64 65 63 6c 61 72 65 64 20 61 73 20   is declared as 
b620: 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20  "<name> PRIMARY 
b630: 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70  KEY COLLATE <typ
b640: 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  e>",.    ** then
b650: 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61   an index may ha
b660: 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  ve been created 
b670: 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62  on this column b
b680: 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
b690: 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20   collation type 
b6a0: 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65  was added. Corre
b6b0: 63 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73  ct this if it is
b6c0: 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a   the case..    *
b6d0: 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  /.    for(pIdx=p
b6e0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
b6f0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
b700: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
b710: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d   pIdx->nKeyCol==
b720: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
b730: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
b740: 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==i ){.        p
b750: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d  Idx->azColl[0] =
b760: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
b770: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
b780: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
b790: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
b7a0: 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  zColl);.  }.}../
b7b0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
b7c0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 63  on returns the c
b7d0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
b7e0: 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e  e for database n
b7f0: 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e  ative text.** en
b800: 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65  coding identifie
b810: 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20  d by the string 
b820: 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e  zName, length nN
b830: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ame..**.** If th
b840: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
b850: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69  ation sequence i
b860: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c  s not available,
b870: 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   or not availabl
b880: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61  e.** in the data
b890: 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f  base native enco
b8a0: 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74  ding, the collat
b8b0: 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69  ion factory is i
b8c0: 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71  nvoked to.** req
b8d0: 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65 20  uest it. If the 
b8e0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
b8f0: 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c  y does not suppl
b900: 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e 63  y such a sequenc
b910: 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65  e,.** and the se
b920: 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61  quence is availa
b930: 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  ble in another t
b940: 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ext encoding, th
b950: 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65  en that is.** re
b960: 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a  turned instead..
b970: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73  **.** If no vers
b980: 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75  ions of the requ
b990: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  ested collations
b9a0: 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61 76   sequence are av
b9b0: 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61  ailable, or.** a
b9c0: 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63  nother error occ
b9d0: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
b9e0: 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
b9f0: 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74  or message writt
ba00: 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73  en into.** pPars
ba10: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
ba20: 75 74 69 6e 65 20 69 73 20 61 20 77 72 61 70 70  utine is a wrapp
ba30: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
ba40: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20  3FindCollSeq(). 
ba50: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
ba60: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c   invokes the col
ba70: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
ba80: 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c  f the named coll
ba90: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
baa0: 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e  found.** and gen
bab0: 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20  erates an error 
bac0: 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53  message..**.** S
bad0: 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33  ee also: sqlite3
bae0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73  FindCollSeq(), s
baf0: 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71  qlite3GetCollSeq
bb00: 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  ().*/.CollSeq *s
bb10: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
bb20: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
bb30: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
bb40: 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Name){.  sqlite3
bb50: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
bb60: 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e  b;.  u8 enc = EN
bb70: 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74  C(db);.  u8 init
bb80: 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  busy = db->init.
bb90: 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  busy;.  CollSeq 
bba0: 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c  *pColl;..  pColl
bbb0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
bbc0: 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a  llSeq(db, enc, z
bbd0: 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b  Name, initbusy);
bbe0: 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79  .  if( !initbusy
bbf0: 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21   && (!pColl || !
bc00: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a  pColl->xCmp) ){.
bc10: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
bc20: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
bc30: 61 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c  arse, enc, pColl
bc40: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20  , zName);.  }.. 
bc50: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
bc60: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
bc70: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
bc80: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73   increment the s
bc90: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a  chema cookie..**
bca0: 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63  .** The schema c
bcb0: 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f  ookie is used to
bcc0: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20   determine when 
bcd0: 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74  the schema for t
bce0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
bcf0: 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65  hanges.  After e
bd00: 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ach schema chang
bd10: 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61  e, the cookie va
bd20: 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  lue.** changes. 
bd30: 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   When a process 
bd40: 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20  first reads the 
bd50: 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64  schema it record
bd60: 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e  s the.** cookie.
bd70: 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68    Thereafter, wh
bd80: 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74  enever it goes t
bd90: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
bda0: 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65  abase,.** it che
bdb0: 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  cks the cookie t
bdc0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
bdd0: 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63  schema has not c
bde0: 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20  hanged.** since 
bdf0: 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64  it was last read
be00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61  ..**.** This pla
be10: 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  n is not complet
be20: 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66  ely bullet-proof
be30: 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  .  It is possibl
be40: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68  e for.** the sch
be50: 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75  ema to change mu
be60: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64  ltiple times and
be70: 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20   for the cookie 
be80: 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63  to be.** set bac
be90: 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65  k to prior value
bea0: 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68  .  But schema ch
beb0: 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71  anges are infreq
bec0: 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20  uent.** and the 
bed0: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68  probability of h
bee0: 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20  itting the same 
bef0: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20  cookie value is 
bf00: 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65  only.** 1 chance
bf10: 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65   in 2^32.  So we
bf20: 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e  're safe enough.
bf30: 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54  .**.** IMPLEMENT
bf40: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 33 34 32 33  ATION-OF: R-3423
bf50: 30 2d 35 36 30 34 39 20 53 51 4c 69 74 65 20 61  0-56049 SQLite a
bf60: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69 6e 63  utomatically inc
bf70: 72 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20 73  rements.** the s
bf80: 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 77 68  chema-version wh
bf90: 65 6e 65 76 65 72 20 74 68 65 20 73 63 68 65 6d  enever the schem
bfa0: 61 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 76 6f  a changes..*/.vo
bfb0: 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  id sqlite3Change
bfc0: 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50  Cookie(Parse *pP
bfd0: 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
bfe0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
bff0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
c000: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
c010: 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
c020: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
c030: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
c040: 20 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33   0) );.  sqlite3
c050: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
c060: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
c070: 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45   BTREE_SCHEMA_VE
c080: 52 53 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20 20  RSION, .        
c090: 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
c0a0: 28 31 2b 28 75 6e 73 69 67 6e 65 64 29 64 62 2d  (1+(unsigned)db-
c0b0: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
c0c0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
c0d0: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61  ));.}../*.** Mea
c0e0: 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
c0f0: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65  of characters ne
c100: 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74  eded to output t
c110: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e  he given.** iden
c120: 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d  tifier.  The num
c130: 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63  ber returned inc
c140: 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73  ludes any quotes
c150: 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65   used.** but doe
c160: 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68  s not include th
c170: 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f  e null terminato
c180: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74  r..**.** The est
c190: 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76  imate is conserv
c1a0: 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74  ative.  It might
c1b0: 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20   be larger that 
c1c0: 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c  what is.** reall
c1d0: 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  y needed..*/.sta
c1e0: 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e  tic int identLen
c1f0: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gth(const char *
c200: 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66  z){.  int n;.  f
c210: 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c  or(n=0; *z; n++,
c220: 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a   z++){.    if( *
c230: 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d  z=='"' ){ n++; }
c240: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20  .  }.  return n 
c250: 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  + 2;.}../*.** Th
c260: 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
c270: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
c280: 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66  o an output buff
c290: 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a  er. The second .
c2a0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
c2b0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
c2c0: 69 6e 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e  integer that con
c2d0: 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74  tains the offset
c2e0: 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20   at.** which to 
c2f0: 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f  write into the o
c300: 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68  utput buffer. Th
c310: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69  is function copi
c320: 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65  es the.** nul-te
c330: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
c340: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
c350: 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74 65  e third paramete
c360: 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c  r, zSignedIdent,
c370: 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69  .** to the speci
c380: 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74  fied offset in t
c390: 68 65 20 62 75 66 66 65 72 20 61 6e 64 20 75 70  he buffer and up
c3a0: 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72  dates *pIdx to r
c3b0: 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66  efer.** to the f
c3c0: 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20  irst byte after 
c3d0: 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 77 72  the last byte wr
c3e0: 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74  itten before ret
c3f0: 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49  urning..** .** I
c400: 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69  f the string zSi
c410: 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73  gnedIdent consis
c420: 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61  ts entirely of a
c430: 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20  lpha-numeric.** 
c440: 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73  characters, does
c450: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
c460: 61 20 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e  a digit and is n
c470: 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72  ot an SQL keywor
c480: 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  d,.** then it is
c490: 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f   copied to the o
c4a0: 75 74 70 75 74 20 62 75 66 66 65 72 20 65 78 61  utput buffer exa
c4b0: 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f  ctly as it is. O
c4c0: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20  therwise,.** it 
c4d0: 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20  is quoted using 
c4e0: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a  double-quotes..*
c4f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64  /.static void id
c500: 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20  entPut(char *z, 
c510: 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20  int *pIdx, char 
c520: 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a  *zSignedIdent){.
c530: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
c540: 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67  *zIdent = (unsig
c550: 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65  ned char*)zSigne
c560: 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c  dIdent;.  int i,
c570: 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20   j, needQuote;. 
c580: 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66   i = *pIdx;..  f
c590: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
c5a0: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; j++){.    if(
c5b0: 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d   !sqlite3Isalnum
c5c0: 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a  (zIdent[j]) && z
c5d0: 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20  Ident[j]!='_' ) 
c5e0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65  break;.  }.  nee
c5f0: 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33  dQuote = sqlite3
c600: 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30  Isdigit(zIdent[0
c610: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  ]).            |
c620: 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64  | sqlite3Keyword
c630: 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21  Code(zIdent, j)!
c640: 3d 54 4b 5f 49 44 0a 20 20 20 20 20 20 20 20 20  =TK_ID.         
c650: 20 20 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21     || zIdent[j]!
c660: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  =0.            |
c670: 7c 20 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28 20 6e  | j==0;..  if( n
c680: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
c690: 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a  ] = '"';.  for(j
c6a0: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
c6b0: 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20  ++){.    z[i++] 
c6c0: 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20  = zIdent[j];.   
c6d0: 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d   if( zIdent[j]==
c6e0: 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  '"' ) z[i++] = '
c6f0: 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65  "';.  }.  if( ne
c700: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
c710: 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d   = '"';.  z[i] =
c720: 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b   0;.  *pIdx = i;
c730: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
c740: 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  te a CREATE TABL
c750: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72  E statement appr
c760: 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
c770: 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20  given.** table. 
c780: 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20   Memory to hold 
c790: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
c7a0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74  statement is obt
c7b0: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71  ained.** from sq
c7c0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
c7d0: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
c7e0: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
c7f0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
c800: 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61  c char *createTa
c810: 62 6c 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20  bleStmt(sqlite3 
c820: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a  *db, Table *p){.
c830: 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20    int i, k, n;. 
c840: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
c850: 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65  char *zSep, *zSe
c860: 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c  p2, *zEnd;.  Col
c870: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d  umn *pCol;.  n =
c880: 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d   0;.  for(pCol =
c890: 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69   p->aCol, i=0; i
c8a0: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
c8b0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d  Col++){.    n +=
c8c0: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f   identLength(pCo
c8d0: 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20  l->zName) + 5;. 
c8e0: 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c   }.  n += identL
c8f0: 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b  ength(p->zName);
c900: 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a  .  if( n<50 ){ .
c910: 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20      zSep = "";. 
c920: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a     zSep2 = ",";.
c930: 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a      zEnd = ")";.
c940: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65    }else{.    zSe
c950: 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20  p = "\n  ";.    
c960: 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b  zSep2 = ",\n  ";
c970: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29  .    zEnd = "\n)
c980: 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35  ";.  }.  n += 35
c990: 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20   + 6*p->nCol;.  
c9a0: 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 44  zStmt = sqlite3D
c9b0: 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29  bMallocRaw(0, n)
c9c0: 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30  ;.  if( zStmt==0
c9d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
c9e0: 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
c9f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
ca00: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
ca10: 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45  f(n, zStmt, "CRE
ca20: 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20  ATE TABLE ");.  
ca30: 6b 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  k = sqlite3Strle
ca40: 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64  n30(zStmt);.  id
ca50: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
ca60: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a  , p->zName);.  z
ca70: 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b  Stmt[k++] = '(';
ca80: 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61  .  for(pCol=p->a
ca90: 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e  Col, i=0; i<p->n
caa0: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
cab0: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
cac0: 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  nst char * const
cad0: 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20   azType[] = {.  
cae0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
caf0: 41 46 46 5f 42 4c 4f 42 20 20 20 20 2a 2f 20 22  AFF_BLOB    */ "
cb00: 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ",.        /* SQ
cb10: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20  LITE_AFF_TEXT   
cb20: 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20   */ " TEXT",.   
cb30: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
cb40: 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20  FF_NUMERIC */ " 
cb50: 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  NUM",.        /*
cb60: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
cb70: 47 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20  GER */ " INT",. 
cb80: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
cb90: 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20  _AFF_REAL    */ 
cba0: 22 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20  " REAL".    };. 
cbb0: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
cbc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
cbd0: 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e;..    sqlite3_
cbe0: 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a  snprintf(n-k, &z
cbf0: 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a  Stmt[k], zSep);.
cc00: 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33      k += sqlite3
cc10: 53 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b  Strlen30(&zStmt[
cc20: 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20  k]);.    zSep = 
cc30: 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74  zSep2;.    ident
cc40: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
cc50: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
cc60: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61   assert( pCol->a
cc70: 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41  ffinity-SQLITE_A
cc80: 46 46 5f 42 4c 4f 42 20 3e 3d 20 30 20 29 3b 0a  FF_BLOB >= 0 );.
cc90: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
cca0: 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54  ->affinity-SQLIT
ccb0: 45 5f 41 46 46 5f 42 4c 4f 42 20 3c 20 41 72 72  E_AFF_BLOB < Arr
ccc0: 61 79 53 69 7a 65 28 61 7a 54 79 70 65 29 20 29  aySize(azType) )
ccd0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
cce0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
ccf0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
cd00: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
cd10: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
cd20: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
cd30: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
cd40: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
cd50: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
cd60: 45 52 49 43 20 29 3b 0a 20 20 20 20 74 65 73 74  ERIC );.    test
cd70: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
cd80: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
cd90: 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20  _INTEGER );.    
cda0: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
cdb0: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
cdc0: 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20  _AFF_REAL );.   
cdd0: 20 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 61 7a   .    zType = az
cde0: 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e  Type[pCol->affin
cdf0: 69 74 79 20 2d 20 53 51 4c 49 54 45 5f 41 46 46  ity - SQLITE_AFF
ce00: 5f 42 4c 4f 42 5d 3b 0a 20 20 20 20 6c 65 6e 20  _BLOB];.    len 
ce10: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
ce20: 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 61 73  0(zType);.    as
ce30: 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69  sert( pCol->affi
ce40: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
ce50: 5f 42 4c 4f 42 20 0a 20 20 20 20 20 20 20 20 20  _BLOB .         
ce60: 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69     || pCol->affi
ce70: 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33 41 66 66  nity==sqlite3Aff
ce80: 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c  inityType(zType,
ce90: 20 30 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70   0) );.    memcp
cea0: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79  y(&zStmt[k], zTy
ceb0: 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20  pe, len);.    k 
cec0: 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65  += len;.    asse
ced0: 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a  rt( k<=n );.  }.
cee0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
cef0: 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b  tf(n-k, &zStmt[k
cf00: 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a  ], "%s", zEnd);.
cf10: 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a    return zStmt;.
cf20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20  }../*.** Resize 
cf30: 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  an Index object 
cf40: 74 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e  to hold N column
cf50: 73 20 74 6f 74 61 6c 2e 20 20 52 65 74 75 72 6e  s total.  Return
cf60: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
cf70: 20 73 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c   success and SQL
cf80: 49 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20  ITE_NOMEM on an 
cf90: 4f 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74  OOM error..*/.st
cfa0: 61 74 69 63 20 69 6e 74 20 72 65 73 69 7a 65 49  atic int resizeI
cfb0: 6e 64 65 78 4f 62 6a 65 63 74 28 73 71 6c 69 74  ndexObject(sqlit
cfc0: 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70  e3 *db, Index *p
cfd0: 49 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 63  Idx, int N){.  c
cfe0: 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20 69  har *zExtra;.  i
cff0: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20  nt nByte;.  if( 
d000: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e  pIdx->nColumn>=N
d010: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d020: 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
d030: 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d 3d  Idx->isResized==
d040: 30 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28  0 );.  nByte = (
d050: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b 20  sizeof(char*) + 
d060: 73 69 7a 65 6f 66 28 69 31 36 29 20 2b 20 31 29  sizeof(i16) + 1)
d070: 2a 4e 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 73  *N;.  zExtra = s
d080: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
d090: 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  ro(db, nByte);. 
d0a0: 20 69 66 28 20 7a 45 78 74 72 61 3d 3d 30 20 29   if( zExtra==0 )
d0b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
d0c0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d  OMEM_BKPT;.  mem
d0d0: 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78  cpy(zExtra, pIdx
d0e0: 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66  ->azColl, sizeof
d0f0: 28 63 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43  (char*)*pIdx->nC
d100: 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e  olumn);.  pIdx->
d110: 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20  azColl = (const 
d120: 63 68 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20  char**)zExtra;. 
d130: 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f   zExtra += sizeo
d140: 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65  f(char*)*N;.  me
d150: 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64  mcpy(zExtra, pId
d160: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a  x->aiColumn, siz
d170: 65 6f 66 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e  eof(i16)*pIdx->n
d180: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d  Column);.  pIdx-
d190: 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36  >aiColumn = (i16
d1a0: 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74  *)zExtra;.  zExt
d1b0: 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36  ra += sizeof(i16
d1c0: 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45  )*N;.  memcpy(zE
d1d0: 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72  xtra, pIdx->aSor
d1e0: 74 4f 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43  tOrder, pIdx->nC
d1f0: 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e  olumn);.  pIdx->
d200: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
d210: 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70 49 64 78  *)zExtra;.  pIdx
d220: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20  ->nColumn = N;. 
d230: 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64   pIdx->isResized
d240: 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
d250: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
d260: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
d270: 74 6f 74 61 6c 20 72 6f 77 20 77 69 64 74 68 20  total row width 
d280: 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a  for a table..*/.
d290: 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69  static void esti
d2a0: 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28 54  mateTableWidth(T
d2b0: 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 75  able *pTab){.  u
d2c0: 6e 73 69 67 6e 65 64 20 77 54 61 62 6c 65 20 3d  nsigned wTable =
d2d0: 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75   0;.  const Colu
d2e0: 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69  mn *pTabCol;.  i
d2f0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54  nt i;.  for(i=pT
d300: 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f  ab->nCol, pTabCo
d310: 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e  l=pTab->aCol; i>
d320: 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b  0; i--, pTabCol+
d330: 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c 65 20 2b  +){.    wTable +
d340: 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74  = pTabCol->szEst
d350: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
d360: 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77 54 61 62  ->iPKey<0 ) wTab
d370: 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a  le++;.  pTab->sz
d380: 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  TabRow = sqlite3
d390: 4c 6f 67 45 73 74 28 77 54 61 62 6c 65 2a 34 29  LogEst(wTable*4)
d3a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  ;.}../*.** Estim
d3b0: 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20  ate the average 
d3c0: 73 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 66 6f  size of a row fo
d3d0: 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  r an index..*/.s
d3e0: 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d  tatic void estim
d3f0: 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 49 6e  ateIndexWidth(In
d400: 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e  dex *pIdx){.  un
d410: 73 69 67 6e 65 64 20 77 49 6e 64 65 78 20 3d 20  signed wIndex = 
d420: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  0;.  int i;.  co
d430: 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  nst Column *aCol
d440: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
d450: 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30  >aCol;.  for(i=0
d460: 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; i<pIdx->nColum
d470: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36  n; i++){.    i16
d480: 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   x = pIdx->aiCol
d490: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  umn[i];.    asse
d4a0: 72 74 28 20 78 3c 70 49 64 78 2d 3e 70 54 61 62  rt( x<pIdx->pTab
d4b0: 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  le->nCol );.    
d4c0: 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20  wIndex += x<0 ? 
d4d0: 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61  1 : aCol[pIdx->a
d4e0: 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73  iColumn[i]].szEs
d4f0: 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73  t;.  }.  pIdx->s
d500: 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65  zIdxRow = sqlite
d510: 33 4c 6f 67 45 73 74 28 77 49 6e 64 65 78 2a 34  3LogEst(wIndex*4
d520: 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  );.}../* Return 
d530: 74 72 75 65 20 69 66 20 76 61 6c 75 65 20 78 20  true if value x 
d540: 69 73 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66 20  is found any of 
d550: 74 68 65 20 66 69 72 73 74 20 6e 43 6f 6c 20 65  the first nCol e
d560: 6e 74 72 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b  ntries of aiCol[
d570: 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ].*/.static int 
d580: 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20  hasColumn(const 
d590: 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20  i16 *aiCol, int 
d5a0: 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20  nCol, int x){.  
d5b0: 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20  while( nCol-- > 
d5c0: 30 20 29 20 69 66 28 20 78 3d 3d 2a 28 61 69 43  0 ) if( x==*(aiC
d5d0: 6f 6c 2b 2b 29 20 29 20 72 65 74 75 72 6e 20 31  ol++) ) return 1
d5e0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
d5f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d600: 69 6e 65 20 72 75 6e 73 20 61 74 20 74 68 65 20  ine runs at the 
d610: 65 6e 64 20 6f 66 20 70 61 72 73 69 6e 67 20 61  end of parsing a
d620: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
d630: 61 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20  atement that.** 
d640: 68 61 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f  has a WITHOUT RO
d650: 57 49 44 20 63 6c 61 75 73 65 2e 20 20 54 68 65  WID clause.  The
d660: 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75   job of this rou
d670: 74 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76 65  tine is to conve
d680: 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72  rt both.** inter
d690: 6e 61 6c 20 73 63 68 65 6d 61 20 64 61 74 61 20  nal schema data 
d6a0: 73 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 74  structures and t
d6b0: 68 65 20 67 65 6e 65 72 61 74 65 64 20 56 44 42  he generated VDB
d6c0: 45 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20 74  E code so that t
d6d0: 68 65 79 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f  hey.** are appro
d6e0: 70 72 69 61 74 65 20 66 6f 72 20 61 20 57 49 54  priate for a WIT
d6f0: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
d700: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 72 6f   instead of a ro
d710: 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68  wid table..** Ch
d720: 61 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a  anges include:.*
d730: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 53 65  *.**     (1)  Se
d740: 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66  t all columns of
d750: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
d760: 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 74   schema object t
d770: 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a  o be NOT NULL..*
d780: 2a 20 20 20 20 20 28 32 29 20 20 43 6f 6e 76 65  *     (2)  Conve
d790: 72 74 20 50 33 20 70 61 72 61 6d 65 74 65 72 20  rt P3 parameter 
d7a0: 6f 66 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65  of the OP_Create
d7b0: 42 74 72 65 65 20 66 72 6f 6d 20 42 54 52 45 45  Btree from BTREE
d7c0: 5f 49 4e 54 4b 45 59 20 0a 2a 2a 20 20 20 20 20  _INTKEY .**     
d7d0: 20 20 20 20 20 69 6e 74 6f 20 42 54 52 45 45 5f       into BTREE_
d7e0: 42 4c 4f 42 4b 45 59 2e 0a 2a 2a 20 20 20 20 20  BLOBKEY..**     
d7f0: 28 33 29 20 20 42 79 70 61 73 73 20 74 68 65 20  (3)  Bypass the 
d800: 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  creation of the 
d810: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
d820: 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20 20  ble entry.**    
d830: 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 50 52        for the PR
d840: 49 4d 41 52 59 20 4b 45 59 20 61 73 20 74 68 65  IMARY KEY as the
d850: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
d860: 65 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20 20  ex is now.**    
d870: 20 20 20 20 20 20 69 64 65 6e 74 69 66 69 65 64        identified
d880: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   by the sqlite_m
d890: 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72  aster table entr
d8a0: 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  y of the table i
d8b0: 74 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28 34  tself..**     (4
d8c0: 29 20 20 53 65 74 20 74 68 65 20 49 6e 64 65 78  )  Set the Index
d8d0: 2e 74 6e 75 6d 20 6f 66 20 74 68 65 20 50 52 49  .tnum of the PRI
d8e0: 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f  MARY KEY Index o
d8f0: 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20  bject in the.** 
d900: 20 20 20 20 20 20 20 20 20 73 63 68 65 6d 61 20           schema 
d910: 74 6f 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20  to the rootpage 
d920: 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 61  from the main ta
d930: 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 35 29 20  ble..**     (5) 
d940: 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63   Add all table c
d950: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52  olumns to the PR
d960: 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20  IMARY KEY Index 
d970: 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20 20  object.**       
d980: 20 20 20 73 6f 20 74 68 61 74 20 74 68 65 20 50     so that the P
d990: 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 61 20  RIMARY KEY is a 
d9a0: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20  covering index. 
d9b0: 20 54 68 65 20 73 75 72 70 6c 75 73 0a 2a 2a 20   The surplus.** 
d9c0: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73           columns
d9d0: 20 61 72 65 20 70 61 72 74 20 6f 66 20 4b 65 79   are part of Key
d9e0: 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20 61  Info.nAllField a
d9f0: 6e 64 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  nd are not used 
da00: 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  for.**          
da10: 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75  sorting or looku
da20: 70 20 6f 72 20 75 6e 69 71 75 65 6e 65 73 73 20  p or uniqueness 
da30: 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20 20 28  checks..**     (
da40: 36 29 20 20 52 65 70 6c 61 63 65 20 74 68 65 20  6)  Replace the 
da50: 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20 61 6c  rowid tail on al
da60: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
da70: 67 65 6e 65 72 61 74 65 64 20 55 4e 49 51 55 45  generated UNIQUE
da80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e 64  .**          ind
da90: 69 63 65 73 20 77 69 74 68 20 74 68 65 20 50 52  ices with the PR
daa0: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
dab0: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 76 69 72  s..**.** For vir
dac0: 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 6f 6e 6c  tual tables, onl
dad0: 79 20 28 31 29 20 69 73 20 70 65 72 66 6f 72 6d  y (1) is perform
dae0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
daf0: 69 64 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68  id convertToWith
db00: 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 50 61  outRowidTable(Pa
db10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
db20: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64  le *pTab){.  Ind
db30: 65 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64 65  ex *pIdx;.  Inde
db40: 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e 50  x *pPk;.  int nP
db50: 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  k;.  int i, j;. 
db60: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
db70: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
db80: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
db90: 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  Vdbe;..  /* Mark
dba0: 20 65 76 65 72 79 20 50 52 49 4d 41 52 59 20 4b   every PRIMARY K
dbb0: 45 59 20 63 6f 6c 75 6d 6e 20 61 73 20 4e 4f 54  EY column as NOT
dbc0: 20 4e 55 4c 4c 20 28 65 78 63 65 70 74 20 66 6f   NULL (except fo
dbd0: 72 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  r imposter table
dbe0: 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  s).  */.  if( !d
dbf0: 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72  b->init.imposter
dc00: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 6f 72  Table ){.    for
dc10: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
dc20: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
dc30: 69 66 28 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  if( (pTab->aCol[
dc40: 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f  i].colFlags & CO
dc50: 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d  LFLAG_PRIMKEY)!=
dc60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61  0 ){.        pTa
dc70: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75  b->aCol[i].notNu
dc80: 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  ll = OE_Abort;. 
dc90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
dca0: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 6d 61 69  ..  /* The remai
dcb0: 6e 69 6e 67 20 74 72 61 6e 73 66 6f 72 6d 61 74  ning transformat
dcc0: 69 6f 6e 73 20 6f 6e 6c 79 20 61 70 70 6c 79 20  ions only apply 
dcd0: 74 6f 20 62 2d 74 72 65 65 20 74 61 62 6c 65 73  to b-tree tables
dce0: 2c 20 6e 6f 74 20 74 6f 0a 20 20 2a 2a 20 76 69  , not to.  ** vi
dcf0: 72 74 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a  rtual tables */.
dd00: 20 20 69 66 28 20 49 4e 5f 44 45 43 4c 41 52 45    if( IN_DECLARE
dd10: 5f 56 54 41 42 20 29 20 72 65 74 75 72 6e 3b 0a  _VTAB ) return;.
dd20: 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68  .  /* Convert th
dd30: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P3 operand of 
dd40: 74 68 65 20 4f 50 5f 43 72 65 61 74 65 42 74 72  the OP_CreateBtr
dd50: 65 65 20 6f 70 63 6f 64 65 20 66 72 6f 6d 20 42  ee opcode from B
dd60: 54 52 45 45 5f 49 4e 54 4b 45 59 0a 20 20 2a 2a  TREE_INTKEY.  **
dd70: 20 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42   into BTREE_BLOB
dd80: 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  KEY..  */.  if( 
dd90: 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61  pParse->addrCrTa
dda0: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
ddb0: 20 76 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   v );.    sqlite
ddc0: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
ddd0: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54   pParse->addrCrT
dde0: 61 62 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45  ab, BTREE_BLOBKE
ddf0: 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  Y);.  }..  /* Lo
de00: 63 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59  cate the PRIMARY
de10: 20 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c   KEY index.  Or,
de20: 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 77   if this table w
de30: 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20  as originally.  
de40: 2a 2a 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ** an INTEGER PR
de50: 49 4d 41 52 59 20 4b 45 59 20 74 61 62 6c 65 2c  IMARY KEY table,
de60: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 50 52   create a new PR
de70: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e  IMARY KEY index.
de80: 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61   .  */.  if( pTa
de90: 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20  b->iPKey>=0 ){. 
dea0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
deb0: 73 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 69 70  st;.    Token ip
dec0: 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20 73 71 6c 69  kToken;.    sqli
ded0: 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 69 70  te3TokenInit(&ip
dee0: 6b 54 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e 61 43  kToken, pTab->aC
def0: 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e  ol[pTab->iPKey].
df00: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73  zName);.    pLis
df10: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
df20: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
df30: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
df40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
df50: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
df60: 49 44 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c 20 30  ID, &ipkToken, 0
df70: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
df80: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
df90: 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73     pList->a[0].s
dfa0: 6f 72 74 4f 72 64 65 72 20 3d 20 70 50 61 72 73  ortOrder = pPars
dfb0: 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 3b  e->iPkSortOrder;
dfc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
dfd0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d  rse->pNewTable==
dfe0: 70 54 61 62 20 29 3b 0a 20 20 20 20 73 71 6c 69  pTab );.    sqli
dff0: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
e000: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Parse, 0, 0, 0, 
e010: 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79  pList, pTab->key
e020: 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30  Conf, 0, 0, 0, 0
e030: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e040: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
e050: 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b  IDXTYPE_PRIMARYK
e060: 45 59 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  EY);.    if( db-
e070: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
e080: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b 20  return;.    pPk 
e090: 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
e0a0: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
e0b0: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
e0c0: 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = -1;.  }else{. 
e0d0: 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33     pPk = sqlite3
e0e0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
e0f0: 70 54 61 62 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  pTab);..    /*. 
e100: 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c     ** Remove all
e110: 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d   redundant colum
e120: 6e 73 20 66 72 6f 6d 20 74 68 65 20 50 52 49 4d  ns from the PRIM
e130: 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 20 65 78  ARY KEY.  For ex
e140: 61 6d 70 6c 65 2c 20 63 68 61 6e 67 65 0a 20 20  ample, change.  
e150: 20 20 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b 45    ** "PRIMARY KE
e160: 59 28 61 2c 62 2c 61 2c 62 2c 63 2c 62 2c 63 2c  Y(a,b,a,b,c,b,c,
e170: 64 29 22 20 69 6e 74 6f 20 6a 75 73 74 20 22 50  d)" into just "P
e180: 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 63  RIMARY KEY(a,b,c
e190: 2c 64 29 22 2e 20 20 4c 61 74 65 72 0a 20 20 20  ,d)".  Later.   
e1a0: 20 2a 2a 20 63 6f 64 65 20 61 73 73 75 6d 65 73   ** code assumes
e1b0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
e1c0: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 65 70   contains no rep
e1d0: 65 61 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20  eated columns.. 
e1e0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
e1f0: 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79  j=1; i<pPk->nKey
e200: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
e210: 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70   if( hasColumn(p
e220: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c  Pk->aiColumn, j,
e230: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
e240: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ]) ){.        pP
e250: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20  k->nColumn--;.  
e260: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e270: 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e     pPk->aiColumn
e280: 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e 61 69 43  [j++] = pPk->aiC
e290: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
e2a0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 6b 2d  }.    }.    pPk-
e2b0: 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b 0a 20 20  >nKeyCol = j;.  
e2c0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 6b 21  }.  assert( pPk!
e2d0: 3d 30 20 29 3b 0a 20 20 70 50 6b 2d 3e 69 73 43  =0 );.  pPk->isC
e2e0: 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20 69  overing = 1;.  i
e2f0: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70  f( !db->init.imp
e300: 6f 73 74 65 72 54 61 62 6c 65 20 29 20 70 50 6b  osterTable ) pPk
e310: 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20  ->uniqNotNull = 
e320: 31 3b 0a 20 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e  1;.  nPk = pPk->
e330: 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 42  nKeyCol;..  /* B
e340: 79 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69  ypass the creati
e350: 6f 6e 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  on of the PRIMAR
e360: 59 20 4b 45 59 20 62 74 72 65 65 20 61 6e 64 20  Y KEY btree and 
e370: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
e380: 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 65 6e 74  r.  ** table ent
e390: 72 79 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  ry. This is only
e3a0: 20 72 65 71 75 69 72 65 64 20 69 66 20 63 75 72   required if cur
e3b0: 72 65 6e 74 6c 79 20 67 65 6e 65 72 61 74 69 6e  rently generatin
e3c0: 67 20 56 44 42 45 0a 20 20 2a 2a 20 63 6f 64 65  g VDBE.  ** code
e3d0: 20 66 6f 72 20 61 20 43 52 45 41 54 45 20 54 41   for a CREATE TA
e3e0: 42 4c 45 20 28 6e 6f 74 20 77 68 65 6e 20 70 61  BLE (not when pa
e3f0: 72 73 69 6e 67 20 6f 6e 65 20 61 73 20 70 61 72  rsing one as par
e400: 74 20 6f 66 20 72 65 61 64 69 6e 67 0a 20 20 2a  t of reading.  *
e410: 2a 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68  * a database sch
e420: 65 6d 61 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ema).  */.  if( 
e430: 76 20 26 26 20 70 50 6b 2d 3e 74 6e 75 6d 3e 30  v && pPk->tnum>0
e440: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
e450: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
e460: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
e470: 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28  dbeChangeOpcode(
e480: 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d 2c 20 4f 50  v, pPk->tnum, OP
e490: 5f 47 6f 74 6f 29 3b 0a 20 20 7d 0a 0a 20 20 2f  _Goto);.  }..  /
e4a0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
e4b0: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
e4c0: 45 59 20 69 73 20 74 68 65 20 74 61 62 6c 65 20  EY is the table 
e4d0: 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 70  root page */.  p
e4e0: 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62 2d  Pk->tnum = pTab-
e4f0: 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64  >tnum;..  /* Upd
e500: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
e510: 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
e520: 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45 20 69   of all UNIQUE i
e530: 6e 64 69 63 65 73 20 62 79 20 63 6f 6e 76 65 72  ndices by conver
e540: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 69  ting.  ** the fi
e550: 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e  nal rowid column
e560: 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72   into one or mor
e570: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
e580: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20   PRIMARY KEY..  
e590: 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54  */.  for(pIdx=pT
e5a0: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
e5b0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
e5c0: 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  xt){.    int n;.
e5d0: 20 20 20 20 69 66 28 20 49 73 50 72 69 6d 61 72      if( IsPrimar
e5e0: 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20  yKeyIndex(pIdx) 
e5f0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
e600: 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b  for(i=n=0; i<nPk
e610: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
e620: 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64  ( !hasColumn(pId
e630: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64  x->aiColumn, pId
e640: 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d  x->nKeyCol, pPk-
e650: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20  >aiColumn[i]) ) 
e660: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n++;.    }.    i
e670: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
e680: 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69   /* This index i
e690: 73 20 61 20 73 75 70 65 72 73 65 74 20 6f 66 20  s a superset of 
e6a0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
e6b0: 2a 2f 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 6e  */.      pIdx->n
e6c0: 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e  Column = pIdx->n
e6d0: 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f  KeyCol;.      co
e6e0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
e6f0: 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65    if( resizeInde
e700: 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 49 64 78  xObject(db, pIdx
e710: 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b  , pIdx->nKeyCol+
e720: 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  n) ) return;.   
e730: 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78   for(i=0, j=pIdx
e740: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b  ->nKeyCol; i<nPk
e750: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
e760: 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64  ( !hasColumn(pId
e770: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64  x->aiColumn, pId
e780: 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d  x->nKeyCol, pPk-
e790: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b  >aiColumn[i]) ){
e7a0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
e7b0: 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b  iColumn[j] = pPk
e7c0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
e7d0: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
e7e0: 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a  oll[j] = pPk->az
e7f0: 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Coll[i];.       
e800: 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   j++;.      }.  
e810: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
e820: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70  pIdx->nColumn>=p
e830: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29  Idx->nKeyCol+n )
e840: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
e850: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  dx->nColumn>=j )
e860: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
e870: 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
e880: 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
e890: 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f 0a   KEY index.  */.
e8a0: 20 20 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d 3e    if( nPk<pTab->
e8b0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  nCol ){.    if( 
e8c0: 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63  resizeIndexObjec
e8d0: 74 28 64 62 2c 20 70 50 6b 2c 20 70 54 61 62 2d  t(db, pPk, pTab-
e8e0: 3e 6e 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 3b  >nCol) ) return;
e8f0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d  .    for(i=0, j=
e900: 6e 50 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  nPk; i<pTab->nCo
e910: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
e920: 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 50  f( !hasColumn(pP
e930: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20  k->aiColumn, j, 
e940: 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  i) ){.        as
e950: 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f  sert( j<pPk->nCo
e960: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
e970: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  pPk->aiColumn[j]
e980: 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 50   = i;.        pP
e990: 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 73  k->azColl[j] = s
e9a0: 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b  qlite3StrBINARY;
e9b0: 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  .        j++;.  
e9c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e9d0: 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e 43 6f  assert( pPk->nCo
e9e0: 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20 20 61  lumn==j );.    a
e9f0: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
ea00: 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  l==j );.  }else{
ea10: 0a 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d  .    pPk->nColum
ea20: 6e 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a  n = pTab->nCol;.
ea30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
ea40: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
ea50: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
ea60: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
ea70: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
ea80: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
ea90: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
eaa0: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
eab0: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
eac0: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
ead0: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
eae0: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
eaf0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
eb00: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
eb10: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
eb20: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
eb30: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
eb40: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
eb50: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
eb60: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
eb70: 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20   unless.** this 
eb80: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
eb90: 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74  able or db->init
eba0: 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20  .busy==1.  When 
ebb0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
ebc0: 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20  .** it means we 
ebd0: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
ebe0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
ebf0: 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a  ble because we j
ec00: 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  ust.** connected
ec10: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
ec20: 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
ec30: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
ec40: 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e  ble has.** recen
ec50: 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20  tly changed, so 
ec60: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
ec70: 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  is table already
ec80: 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68   exists in.** th
ec90: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
eca0: 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f  table.  We do no
ecb0: 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65  t want to create
ecc0: 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a   it again..**.**
ecd0: 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20   If the pSelect 
ece0: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
ecf0: 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
ed00: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
ed10: 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74  .** was called t
ed20: 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65  o create a table
ed30: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
ed40: 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41  a .** "CREATE TA
ed50: 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  BLE ... AS SELEC
ed60: 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74  T ..." statement
ed70: 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  .  The column na
ed80: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  mes of.** the ne
ed90: 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74  w table will mat
eda0: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ch the result se
edb0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  t of the SELECT.
edc0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
edd0: 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73  EndTable(.  Pars
ede0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
edf0: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
ee00: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
ee10: 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20  *pCons,         
ee20: 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b    /* The ',' tok
ee30: 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  en after the las
ee40: 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a  t column defn. *
ee50: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  /.  Token *pEnd,
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ee70: 68 65 20 27 29 27 20 62 65 66 6f 72 65 20 6f 70  he ')' before op
ee80: 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 43 52 45  tions in the CRE
ee90: 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75  ATE TABLE */.  u
eea0: 38 20 74 61 62 4f 70 74 73 2c 20 20 20 20 20 20  8 tabOpts,      
eeb0: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
eec0: 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55  table options. U
eed0: 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53  sually 0. */.  S
eee0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20  elect *pSelect  
eef0: 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
ef00: 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20   from a "CREATE 
ef10: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a  ... AS SELECT" *
ef20: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef40: 20 2f 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c   /* The new tabl
ef50: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
ef60: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
ef70: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
ef80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
ef90: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
efa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
efb0: 74 61 62 61 73 65 20 69 6e 20 77 68 69 63 68 20  tabase in which 
efc0: 74 68 65 20 74 61 62 6c 65 20 6c 69 76 65 73 20  the table lives 
efd0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
efe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
eff0: 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64  * An implied ind
f000: 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ex of the table 
f010: 2a 2f 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d  */..  if( pEnd==
f020: 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 20  0 && pSelect==0 
f030: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
f040: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 64 62   }.  assert( !db
f050: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
f060: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
f070: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
f080: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
f090: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d  .  /* If the db-
f0a0: 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20  >init.busy is 1 
f0b0: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
f0c0: 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20  reading the SQL 
f0d0: 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71  off the.  ** "sq
f0e0: 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20  lite_master" or 
f0f0: 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73  "sqlite_temp_mas
f100: 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68  ter" table on th
f110: 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20  e disk..  ** So 
f120: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  do not write to 
f130: 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20  the disk again. 
f140: 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f   Extract the roo
f150: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  t page number.  
f160: 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ** for the table
f170: 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e   from the db->in
f180: 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64  it.newTnum field
f190: 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d  .  (The page num
f1a0: 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  ber.  ** should 
f1b0: 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68  have been put th
f1c0: 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74  ere by the sqlit
f1d0: 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e  eOpenCb routine.
f1e0: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ).  **.  ** If t
f1f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
f200: 62 65 72 20 69 73 20 31 2c 20 74 68 61 74 20 6d  ber is 1, that m
f210: 65 61 6e 73 20 74 68 69 73 20 69 73 20 74 68 65  eans this is the
f220: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20   sqlite_master. 
f230: 20 2a 2a 20 74 61 62 6c 65 20 69 74 73 65 6c 66   ** table itself
f240: 2e 20 20 53 6f 20 6d 61 72 6b 20 69 74 20 72 65  .  So mark it re
f250: 61 64 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ad-only..  */.  
f260: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
f270: 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 65  y ){.    if( pSe
f280: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71  lect ){.      sq
f290: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
f2a0: 61 72 73 65 2c 20 22 22 29 3b 0a 20 20 20 20 20  arse, "");.     
f2b0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
f2c0: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d     p->tnum = db-
f2d0: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
f2e0: 20 20 20 69 66 28 20 70 2d 3e 74 6e 75 6d 3d 3d     if( p->tnum==
f2f0: 31 20 29 20 70 2d 3e 74 61 62 46 6c 61 67 73 20  1 ) p->tabFlags 
f300: 7c 3d 20 54 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a  |= TF_Readonly;.
f310: 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
f320: 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  l processing for
f330: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 54   WITHOUT ROWID T
f340: 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 74  ables */.  if( t
f350: 61 62 4f 70 74 73 20 26 20 54 46 5f 57 69 74 68  abOpts & TF_With
f360: 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  outRowid ){.    
f370: 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73  if( (p->tabFlags
f380: 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
f390: 65 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ent) ){.      sq
f3a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
f3b0: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
f3c0: 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6e  "AUTOINCREMENT n
f3d0: 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 57 49  ot allowed on WI
f3e0: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
f3f0: 65 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  es");.      retu
f400: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rn;.    }.    if
f410: 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26  ( (p->tabFlags &
f420: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
f430: 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  y)==0 ){.      s
f440: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f450: 50 61 72 73 65 2c 20 22 50 52 49 4d 41 52 59 20  Parse, "PRIMARY 
f460: 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e 20 74  KEY missing on t
f470: 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61  able %s", p->zNa
f480: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
f490: 20 20 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67        p->tabFlag
f4a0: 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75 74 52  s |= TF_WithoutR
f4b0: 6f 77 69 64 20 7c 20 54 46 5f 4e 6f 56 69 73 69  owid | TF_NoVisi
f4c0: 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  bleRowid;.      
f4d0: 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74  convertToWithout
f4e0: 52 6f 77 69 64 54 61 62 6c 65 28 70 50 61 72 73  RowidTable(pPars
f4f0: 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, p);.    }.  }
f500: 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ..  iDb = sqlite
f510: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
f520: 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  b, p->pSchema);.
f530: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f540: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20  OMIT_CHECK.  /* 
f550: 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e  Resolve names in
f560: 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74   all CHECK const
f570: 72 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  raint expression
f580: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
f590: 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 73  >pCheck ){.    s
f5a0: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
f5b0: 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73  fReference(pPars
f5c0: 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b  e, p, NC_IsCheck
f5d0: 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b  , 0, p->pCheck);
f5e0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
f5f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
f600: 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20  MIT_CHECK) */.. 
f610: 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65   /* Estimate the
f620: 20 61 76 65 72 61 67 65 20 72 6f 77 20 73 69 7a   average row siz
f630: 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  e for the table 
f640: 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c  and for all impl
f650: 69 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20  ied indices */. 
f660: 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69   estimateTableWi
f670: 64 74 68 28 70 29 3b 0a 20 20 66 6f 72 28 70 49  dth(p);.  for(pI
f680: 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49  dx=p->pIndex; pI
f690: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
f6a0: 4e 65 78 74 29 7b 0a 20 20 20 20 65 73 74 69 6d  Next){.    estim
f6b0: 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49  ateIndexWidth(pI
f6c0: 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dx);.  }..  /* I
f6d0: 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69  f not initializi
f6e0: 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ng, then create 
f6f0: 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65  a record for the
f700: 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20   new table.  ** 
f710: 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
f720: 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68  STER table of th
f730: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a  e database..  **
f740: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73  .  ** If this is
f750: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62   a TEMPORARY tab
f760: 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e  le, write the en
f770: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78  try into the aux
f780: 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65  iliary.  ** file
f790: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f   instead of into
f7a0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
f7b0: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
f7c0: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
f7d0: 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  sy ){.    int n;
f7e0: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
f7f0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20    char *zType;  
f800: 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22    /* "view" or "
f810: 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68  table" */.    ch
f820: 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a  ar *zType2;   /*
f830: 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c   "VIEW" or "TABL
f840: 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  E" */.    char *
f850: 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78  zStmt;    /* Tex
f860: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
f870: 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20  TABLE or CREATE 
f880: 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a  VIEW statement *
f890: 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  /..    v = sqlit
f8a0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
f8b0: 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  );.    if( NEVER
f8c0: 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (v==0) ) return;
f8d0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
f8e0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
f8f0: 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  ose, 0);..    /*
f900: 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c   .    ** Initial
f910: 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 74 68  ize zType for th
f920: 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20 74 61  e new view or ta
f930: 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
f940: 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d  if( p->pSelect==
f950: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
f960: 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f  regular table */
f970: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
f980: 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54  table";.      zT
f990: 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a  ype2 = "TABLE";.
f9a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f9b0: 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c  MIT_VIEW.    }el
f9c0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76  se{.      /* A v
f9d0: 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  iew */.      zTy
f9e0: 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20  pe = "view";.   
f9f0: 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45     zType2 = "VIE
fa00: 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  W";.#endif.    }
fa10: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
fa20: 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41 42   is a CREATE TAB
fa30: 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54 20  LE xx AS SELECT 
fa40: 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65  ..., execute the
fa50: 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73   SELECT.    ** s
fa60: 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75  tatement to popu
fa70: 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61 62  late the new tab
fa80: 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67  le. The root-pag
fa90: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  e number for the
faa0: 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c  .    ** new tabl
fab0: 65 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72  e is in register
fac0: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
fad0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
fae0: 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20  Once the SELECT 
faf0: 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62  has been coded b
fb00: 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  y sqlite3Select(
fb10: 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20  ), it is in a.  
fb20: 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74    ** suitable st
fb30: 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72  ate to query for
fb40: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
fb50: 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62  s and types to b
fb60: 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79  e used.    ** by
fb70: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a   the new table..
fb80: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20      **.    ** A 
fb90: 73 68 61 72 65 64 2d 63 61 63 68 65 20 77 72 69  shared-cache wri
fba0: 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  te-lock is not r
fbb0: 65 71 75 69 72 65 64 20 74 6f 20 77 72 69 74 65  equired to write
fbc0: 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c   to the new tabl
fbd0: 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73  e,.    ** as a s
fbe0: 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20  chema-lock must 
fbf0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
fc00: 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72  n obtained to cr
fc10: 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20  eate it. Since. 
fc20: 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c     ** a schema-l
fc30: 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c  ock excludes all
fc40: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
fc50: 75 73 65 72 73 2c 20 74 68 65 20 77 72 69 74 65  users, the write
fc60: 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20  -lock would.    
fc70: 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e  ** be redundant.
fc80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
fc90: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
fca0: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
fcb0: 3b 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68  ;    /* Where th
fcc0: 65 20 53 45 4c 45 43 54 20 73 68 6f 75 6c 64 20  e SELECT should 
fcd0: 73 74 6f 72 65 20 72 65 73 75 6c 74 73 20 2a 2f  store results */
fce0: 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 59 69  .      int regYi
fcf0: 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  eld;       /* Re
fd00: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63  gister holding c
fd10: 6f 2d 72 6f 75 74 69 6e 65 20 65 6e 74 72 79 2d  o-routine entry-
fd20: 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69  point */.      i
fd30: 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
fd40: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
fd50: 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   co-routine */. 
fd60: 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 3b       int regRec;
fd70: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65           /* A re
fd80: 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72  cord to be inser
fd90: 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 74  t into the new t
fda0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  able */.      in
fdb0: 74 20 72 65 67 52 6f 77 69 64 3b 20 20 20 20 20  t regRowid;     
fdc0: 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20 74 68    /* Rowid of th
fdd0: 65 20 6e 65 78 74 20 72 6f 77 20 74 6f 20 69 6e  e next row to in
fde0: 73 65 72 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  sert */.      in
fdf0: 74 20 61 64 64 72 49 6e 73 4c 6f 6f 70 3b 20 20  t addrInsLoop;  
fe00: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
fe10: 6c 6f 6f 70 20 66 6f 72 20 69 6e 73 65 72 74 69  loop for inserti
fe20: 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  ng rows */.     
fe30: 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
fe40: 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
fe50: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
fe60: 68 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  he SELECT result
fe70: 73 20 2a 2f 0a 0a 20 20 20 20 20 20 72 65 67 59  s */..      regY
fe80: 69 65 6c 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ield = ++pParse-
fe90: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
fea0: 52 65 63 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Rec = ++pParse->
feb0: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52  nMem;.      regR
fec0: 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
fed0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73  >nMem;.      ass
fee0: 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62  ert(pParse->nTab
fef0: 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ==1);.      sqli
ff00: 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
ff10: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
ff20: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ff30: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
ff40: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
ff50: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
ff60: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
ff70: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53  5(v, OPFLAG_P2IS
ff80: 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61 72  REG);.      pPar
ff90: 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
ffa0: 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71      addrTop = sq
ffb0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
ffc0: 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 20  Addr(v) + 1;.   
ffd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ffe0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
fff0: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
10000 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  ld, 0, addrTop);
10010 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
10020 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
10030 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 20  ;.      pSelTab 
10040 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
10050 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
10060 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  e, pSelect);.   
10070 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d     if( pSelTab==
10080 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
10090 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
100a0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d  l==0 );.      p-
100b0 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
100c0 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e  >nCol;.      p->
100d0 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
100e0 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c  aCol;.      pSel
100f0 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
10100 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
10110 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ol = 0;.      sq
10120 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
10130 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20  (db, pSelTab);. 
10140 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
10150 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
10160 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
10170 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20   regYield);.    
10180 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
10190 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
101a0 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69   &dest);.      i
101b0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
101c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
101d0 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f  sqlite3VdbeEndCo
101e0 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 59 69  routine(v, regYi
101f0 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eld);.      sqli
10200 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
10210 76 2c 20 61 64 64 72 54 6f 70 20 2d 20 31 29 3b  v, addrTop - 1);
10220 0a 20 20 20 20 20 20 61 64 64 72 49 6e 73 4c 6f  .      addrInsLo
10230 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
10240 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
10250 6c 64 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d  ld, dest.iSDParm
10260 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
10270 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
10280 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10290 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
102a0 72 64 2c 20 64 65 73 74 2e 69 53 64 73 74 2c 20  rd, dest.iSdst, 
102b0 64 65 73 74 2e 6e 53 64 73 74 2c 20 72 65 67 52  dest.nSdst, regR
102c0 65 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ec);.      sqlit
102d0 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79 28  e3TableAffinity(
102e0 76 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  v, p, 0);.      
102f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10300 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
10310 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  , 1, regRowid);.
10320 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10330 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
10340 73 65 72 74 2c 20 31 2c 20 72 65 67 52 65 63 2c  sert, 1, regRec,
10350 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
10360 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
10370 6f 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70  o(v, addrInsLoop
10380 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10390 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
103a0 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20  addrInsLoop);.  
103b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
103c0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
103d0 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  e, 1);.    }..  
103e0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
103f0 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
10400 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  f the CREATE sta
10410 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66  tement */.    if
10420 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
10430 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74     zStmt = creat
10440 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70  eTableStmt(db, p
10450 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
10460 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32      Token *pEnd2
10470 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26 70 50   = tabOpts ? &pP
10480 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
10490 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e   : pEnd;.      n
104a0 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e   = (int)(pEnd2->
104b0 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d  z - pParse->sNam
104c0 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20  eToken.z);.     
104d0 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d   if( pEnd2->z[0]
104e0 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e  !=';' ) n += pEn
104f0 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74  d2->n;.      zSt
10500 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
10510 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20  ntf(db, .       
10520 20 20 20 22 43 52 45 41 54 45 20 25 73 20 25 2e     "CREATE %s %.
10530 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20  *s", zType2, n, 
10540 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
10550 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20  en.z.      );.  
10560 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c    }..    /* A sl
10570 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72  ot for the recor
10580 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  d has already be
10590 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  en allocated in 
105a0 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49  the .    ** SQLI
105b0 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
105c0 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74    We just need t
105d0 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c  o update that sl
105e0 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20  ot with all.    
105f0 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  ** the informati
10600 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74  on we've collect
10610 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
10620 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
10630 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
10640 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a  "UPDATE %Q.%s ".
10650 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74 79           "SET ty
10660 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51  pe='%s', name=%Q
10670 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72  , tbl_name=%Q, r
10680 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71 6c  ootpage=#%d, sql
10690 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57 48  =%Q ".       "WH
106a0 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a  ERE rowid=#%d",.
106b0 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
106c0 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53  b].zDbSName, MAS
106d0 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20  TER_NAME,.      
106e0 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zType,.      p->
106f0 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zName,.      p->
10700 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61  zName,.      pPa
10710 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20  rse->regRoot,.  
10720 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20      zStmt,.     
10730 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
10740 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  d.    );.    sql
10750 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
10760 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
10770 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
10780 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69  Parse, iDb);..#i
10790 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
107a0 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
107b0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
107c0 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  see if we need t
107d0 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  o create an sqli
107e0 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
107f0 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65  e for.    ** kee
10800 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75  ping track of au
10810 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73  toincrement keys
10820 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10830 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20   (p->tabFlags & 
10840 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
10850 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 44 62  )!=0 ){.      Db
10860 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
10870 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 61 73 73  [iDb];.      ass
10880 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
10890 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
108a0 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  iDb, 0) );.     
108b0 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
108c0 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b  a->pSeqTab==0 ){
108d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
108e0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
108f0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43  se,.          "C
10900 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73  REATE TABLE %Q.s
10910 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e  qlite_sequence(n
10920 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20  ame,seq)",.     
10930 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61       pDb->zDbSNa
10940 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  me.        );.  
10950 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
10960 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72  if..    /* Repar
10970 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f  se everything to
10980 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65   update our inte
10990 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74  rnal data struct
109a0 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ures */.    sqli
109b0 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53  te3VdbeAddParseS
109c0 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a  chemaOp(v, iDb,.
109d0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
109e0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 74  e3MPrintf(db, "t
109f0 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44  bl_name='%q' AND
10a00 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27   type!='trigger'
10a10 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  ", p->zName));. 
10a20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68   }...  /* Add th
10a30 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69  e table to the i
10a40 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
10a50 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
10a60 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
10a70 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
10a80 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  y ){.    Table *
10a90 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d 61  pOld;.    Schema
10aa0 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70   *pSchema = p->p
10ab0 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65  Schema;.    asse
10ac0 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
10ad0 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
10ae0 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 4f  Db, 0) );.    pO
10af0 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
10b00 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d  Insert(&pSchema-
10b10 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61  >tblHash, p->zNa
10b20 6d 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  me, p);.    if( 
10b30 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73  pOld ){.      as
10b40 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b  sert( p==pOld );
10b50 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
10b60 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73   have failed ins
10b70 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29  ide HashInsert()
10b80 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
10b90 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
10ba0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
10bb0 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70   }.    pParse->p
10bc0 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  NewTable = 0;.  
10bd0 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c    db->mDbFlags |
10be0 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43  = DBFLAG_SchemaC
10bf0 68 61 6e 67 65 3b 0a 0a 23 69 66 6e 64 65 66 20  hange;..#ifndef 
10c00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45  SQLITE_OMIT_ALTE
10c10 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21  RTABLE.    if( !
10c20 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  p->pSelect ){.  
10c30 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10c40 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
10c50 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e  har *)pParse->sN
10c60 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20  ameToken.z;.    
10c70 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20    int nName;.   
10c80 20 20 20 61 73 73 65 72 74 28 20 21 70 53 65 6c     assert( !pSel
10c90 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20  ect && pCons && 
10ca0 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66  pEnd );.      if
10cb0 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b  ( pCons->z==0 ){
10cc0 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d  .        pCons =
10cd0 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20   pEnd;.      }. 
10ce0 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e       nName = (in
10cf0 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  t)((const char *
10d00 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d  )pCons->z - zNam
10d10 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64  e);.      p->add
10d20 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b  ColOffset = 13 +
10d30 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61 72   sqlite3Utf8Char
10d40 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  Len(zName, nName
10d50 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
10d60 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
10d70 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
10d80 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  /*.** The parser
10d90 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
10da0 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ine in order to 
10db0 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45  create a new VIE
10dc0 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  W.*/.void sqlite
10dd0 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50  3CreateView(.  P
10de0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10df0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
10e00 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
10e10 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20  ken *pBegin,    
10e20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
10e30 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
10e40 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
10e50 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
10e60 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  1,     /* The to
10e70 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
10e80 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
10e90 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
10ea0 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54  pName2,     /* T
10eb0 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
10ec0 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
10ed0 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 45 78  the view */.  Ex
10ee0 70 72 4c 69 73 74 20 2a 70 43 4e 61 6d 65 73 2c  prList *pCNames,
10ef0 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 6c 69 73   /* Optional lis
10f00 74 20 6f 66 20 76 69 65 77 20 63 6f 6c 75 6d 6e  t of view column
10f10 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 53 65 6c 65   names */.  Sele
10f20 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f  ct *pSelect,   /
10f30 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65  * A SELECT state
10f40 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62  ment that will b
10f50 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69  ecome the new vi
10f60 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
10f70 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52  mp,        /* TR
10f80 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41  UE for a TEMPORA
10f90 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  RY view */.  int
10fa0 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20 20   noErr          
10fb0 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72 6f  /* Suppress erro
10fc0 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56 49  r messages if VI
10fd0 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  EW already exist
10fe0 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  s */.){.  Table 
10ff0 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  *p;.  int n;.  c
11000 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
11010 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62  Token sEnd;.  Db
11020 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f  Fixer sFix;.  To
11030 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a  ken *pName = 0;.
11040 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c    int iDb;.  sql
11050 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
11060 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e->db;..  if( pP
11070 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a  arse->nVar>0 ){.
11080 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11090 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72  Msg(pParse, "par
110a0 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20  ameters are not 
110b0 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73  allowed in views
110c0 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65  ");.    goto cre
110d0 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20  ate_view_fail;. 
110e0 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72   }.  sqlite3Star
110f0 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  tTable(pParse, p
11100 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69  Name1, pName2, i
11110 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45  sTemp, 1, 0, noE
11120 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  rr);.  p = pPars
11130 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
11140 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
11150 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
11160 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c  create_view_fail
11170 3b 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61  ;.  sqlite3TwoPa
11180 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
11190 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
111a0 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20  pName);.  iDb = 
111b0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
111c0 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68  ndex(db, p->pSch
111d0 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  ema);.  sqlite3F
111e0 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50  ixInit(&sFix, pP
111f0 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65 77  arse, iDb, "view
11200 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  ", pName);.  if(
11210 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63   sqlite3FixSelec
11220 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74  t(&sFix, pSelect
11230 29 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f  ) ) goto create_
11240 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a  view_fail;..  /*
11250 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Make a copy of 
11260 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43  the entire SELEC
11270 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
11280 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
11290 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c  w..  ** This wil
112a0 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20  l force all the 
112b0 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c  Expr.token.z val
112c0 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ues to be dynami
112d0 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  cally.  ** alloc
112e0 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e  ated rather than
112f0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e   point to the in
11300 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69  put string - whi
11310 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  ch means that.  
11320 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72  ** they will per
11330 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63  sist after the c
11340 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  urrent sqlite3_e
11350 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72  xec() call retur
11360 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53  ns..  */.  p->pS
11370 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
11380 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53 65  electDup(db, pSe
11390 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f 52 45  lect, EXPRDUP_RE
113a0 44 55 43 45 29 3b 0a 20 20 70 2d 3e 70 43 68 65  DUCE);.  p->pChe
113b0 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
113c0 4c 69 73 74 44 75 70 28 64 62 2c 20 70 43 4e 61  ListDup(db, pCNa
113d0 6d 65 73 2c 20 45 58 50 52 44 55 50 5f 52 45 44  mes, EXPRDUP_RED
113e0 55 43 45 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  UCE);.  if( db->
113f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
11400 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
11410 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61  fail;..  /* Loca
11420 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
11430 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
11440 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
11450 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
11460 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
11470 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
11480 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 61  >sLastToken;.  a
11490 73 73 65 72 74 28 20 73 45 6e 64 2e 7a 5b 30 5d  ssert( sEnd.z[0]
114a0 21 3d 30 20 7c 7c 20 73 45 6e 64 2e 6e 3d 3d 30  !=0 || sEnd.n==0
114b0 20 29 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a   );.  if( sEnd.z
114c0 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20  [0]!=';' ){.    
114d0 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e  sEnd.z += sEnd.n
114e0 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d  ;.  }.  sEnd.n =
114f0 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28   0;.  n = (int)(
11500 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d  sEnd.z - pBegin-
11510 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  >z);.  assert( n
11520 3e 30 20 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67  >0 );.  z = pBeg
11530 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
11540 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
11550 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d  [n-1]) ){ n--; }
11560 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
11570 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
11580 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c  1;..  /* Use sql
11590 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74  ite3EndTable() t
115a0 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
115b0 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
115c0 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
115d0 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70  qlite3EndTable(p
115e0 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c  Parse, 0, &sEnd,
115f0 20 30 2c 20 30 29 3b 0a 0a 63 72 65 61 74 65 5f   0, 0);..create_
11600 76 69 65 77 5f 66 61 69 6c 3a 0a 20 20 73 71 6c  view_fail:.  sql
11610 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
11620 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
11630 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
11640 44 65 6c 65 74 65 28 64 62 2c 20 70 43 4e 61 6d  Delete(db, pCNam
11650 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  es);.  return;.}
11660 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11670 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
11680 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
11690 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
116a0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
116b0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
116c0 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54  BLE)./*.** The T
116d0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  able structure p
116e0 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20  Table is really 
116f0 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e  a VIEW.  Fill in
11700 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a   the names of.**
11710 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
11720 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20  the view in the 
11730 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65  pTable structure
11740 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
11750 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
11760 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  s.  If an error 
11770 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e  is seen leave an
11780 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
11790 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
117a0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
117b0 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
117c0 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  mes(Parse *pPars
117d0 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  e, Table *pTable
117e0 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c  ){.  Table *pSel
117f0 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65  Tab;   /* A fake
11800 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63   table from whic
11810 68 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73  h we get the res
11820 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c  ult set */.  Sel
11830 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f  ect *pSel;     /
11840 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45  * Copy of the SE
11850 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d  LECT that implem
11860 65 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f  ents the view */
11870 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
11880 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11890 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
118a0 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ered */.  int n;
118b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
118c0 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73  emporarily holds
118d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
118e0 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20  ursors assigned 
118f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
11900 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
11910 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
11920 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f  ection for mallo
11930 63 20 65 72 72 6f 72 73 20 2a 2f 0a 23 69 66 6e  c errors */.#ifn
11940 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11950 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
11960 6e 74 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69  nt rc;.#endif.#i
11970 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11980 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
11990 20 20 73 71 6c 69 74 65 33 5f 78 61 75 74 68 20    sqlite3_xauth 
119a0 78 41 75 74 68 3b 20 20 20 20 20 20 20 2f 2a 20  xAuth;       /* 
119b0 53 61 76 65 64 20 78 41 75 74 68 20 70 6f 69 6e  Saved xAuth poin
119c0 74 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ter */.#endif.. 
119d0 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
119e0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
119f0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
11a00 41 42 4c 45 0a 20 20 64 62 2d 3e 6e 53 63 68 65  ABLE.  db->nSche
11a10 6d 61 4c 6f 63 6b 2b 2b 3b 0a 20 20 72 63 20 3d  maLock++;.  rc =
11a20 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c   sqlite3VtabCall
11a30 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20  Connect(pParse, 
11a40 70 54 61 62 6c 65 29 3b 0a 20 20 64 62 2d 3e 6e  pTable);.  db->n
11a50 53 63 68 65 6d 61 4c 6f 63 6b 2d 2d 3b 0a 20 20  SchemaLock--;.  
11a60 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
11a70 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
11a80 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
11a90 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  le) ) return 0;.
11aa0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
11ab0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
11ac0 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65  .  /* A positive
11ad0 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20   nCol means the 
11ae0 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f  columns names fo
11af0 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a  r this view are.
11b00 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f    ** already kno
11b10 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  wn..  */.  if( p
11b20 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20  Table->nCol>0 ) 
11b30 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
11b40 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20  A negative nCol 
11b50 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72  is a special mar
11b60 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ker meaning that
11b70 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   we are currentl
11b80 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f  y.  ** trying to
11b90 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c   compute the col
11ba0 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77  umn names.  If w
11bb0 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75  e enter this rou
11bc0 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61  tine with.  ** a
11bd0 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20   negative nCol, 
11be0 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20  it means two or 
11bf0 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20  more views form 
11c00 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69  a loop, like thi
11c10 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
11c20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65   CREATE VIEW one
11c30 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
11c40 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20  M two;.  **     
11c50 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20  CREATE VIEW two 
11c60 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
11c70 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20   one;.  **.  ** 
11c80 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72  Actually, the er
11c90 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77  ror above is now
11ca0 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f   caught prior to
11cb0 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 70   reaching this p
11cc0 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74  oint..  ** But t
11cd0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
11ce0 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72  t is still impor
11cf0 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20  tant as it does 
11d00 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20  come up.  ** in 
11d10 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20  the following:. 
11d20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52   ** .  **     CR
11d30 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e  EATE TABLE main.
11d40 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20  ex1(a);.  **    
11d50 20 43 52 45 41 54 45 20 54 45 4d 50 20 56 49 45   CREATE TEMP VIE
11d60 57 20 65 78 31 20 41 53 20 53 45 4c 45 43 54 20  W ex1 AS SELECT 
11d70 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a  a FROM ex1;.  **
11d80 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
11d90 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a  OM temp.ex1;.  *
11da0 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
11db0 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71  nCol<0 ){.    sq
11dc0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11dd0 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69  arse, "view %s i
11de0 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66  s circularly def
11df0 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  ined", pTable->z
11e00 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
11e10 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 1;.  }.  asser
11e20 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  t( pTable->nCol>
11e30 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  =0 );..  /* If w
11e40 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
11e50 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  it means we need
11e60 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
11e70 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  table names..  *
11e80 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
11e90 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52  call to sqlite3R
11ea0 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
11eb0 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
11ec0 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
11ed0 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75  ents in the resu
11ee0 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76  lts set of the v
11ef0 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73  iew and will ass
11f00 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  ign cursors.  **
11f10 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73   to the elements
11f20 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
11f30 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20  use.  But we do 
11f40 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63  not want these c
11f50 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  hanges.  ** to b
11f60 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f  e permanent.  So
11f70 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
11f80 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f   is done on a co
11f90 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
11fa0 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
11fb0 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
11fc0 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73   view..  */.  as
11fd0 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53  sert( pTable->pS
11fe0 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20  elect );.  pSel 
11ff0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
12000 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  up(db, pTable->p
12010 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
12020 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 6e 20  ( pSel ){.    n 
12030 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
12040 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
12050 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
12060 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53  pParse, pSel->pS
12070 72 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  rc);.    pTable-
12080 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20  >nCol = -1;.    
12090 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
120a0 69 73 61 62 6c 65 2b 2b 3b 0a 23 69 66 6e 64 65  isable++;.#ifnde
120b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
120c0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
120d0 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74  xAuth = db->xAut
120e0 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68  h;.    db->xAuth
120f0 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61   = 0;.    pSelTa
12100 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
12110 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
12120 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  rse, pSel);.    
12130 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74  db->xAuth = xAut
12140 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53 65  h;.#else.    pSe
12150 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
12160 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
12170 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23  pParse, pSel);.#
12180 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72 73 65  endif.    pParse
12190 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20  ->nTab = n;.    
121a0 69 66 28 20 70 54 61 62 6c 65 2d 3e 70 43 68 65  if( pTable->pChe
121b0 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  ck ){.      /* C
121c0 52 45 41 54 45 20 56 49 45 57 20 6e 61 6d 65 28  REATE VIEW name(
121d0 61 72 67 6c 69 73 74 29 20 41 53 20 2e 2e 2e 0a  arglist) AS ....
121e0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e 61 6d        ** The nam
121f0 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  es of the column
12200 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 61  s in the table a
12210 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 0a 20 20  re taken from.  
12220 20 20 20 20 2a 2a 20 61 72 67 6c 69 73 74 20 77      ** arglist w
12230 68 69 63 68 20 69 73 20 73 74 6f 72 65 64 20 69  hich is stored i
12240 6e 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b  n pTable->pCheck
12250 2e 20 20 54 68 65 20 70 43 68 65 63 6b 20 66 69  .  The pCheck fi
12260 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 72  eld.      ** nor
12270 6d 61 6c 6c 79 20 68 6f 6c 64 73 20 43 48 45 43  mally holds CHEC
12280 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e  K constraints on
12290 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62   an ordinary tab
122a0 6c 65 2c 20 62 75 74 20 66 6f 72 0a 20 20 20 20  le, but for.    
122b0 20 20 2a 2a 20 61 20 56 49 45 57 20 69 74 20 68    ** a VIEW it h
122c0 6f 6c 64 73 20 74 68 65 20 6c 69 73 74 20 6f 66  olds the list of
122d0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 0a 20   column names.. 
122e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
122f0 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d  lite3ColumnsFrom
12300 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
12310 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 2c   pTable->pCheck,
12320 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
12330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12340 20 20 20 26 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c     &pTable->nCol
12350 2c 20 26 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29  , &pTable->aCol)
12360 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
12370 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
12380 0a 20 20 20 20 20 20 20 26 26 20 70 50 61 72 73  .       && pPars
12390 65 2d 3e 6e 45 72 72 3d 3d 30 0a 20 20 20 20 20  e->nErr==0.     
123a0 20 20 26 26 20 70 54 61 62 6c 65 2d 3e 6e 43 6f    && pTable->nCo
123b0 6c 3d 3d 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2d  l==pSel->pEList-
123c0 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a  >nExpr.      ){.
123d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
123e0 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
123f0 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
12400 50 61 72 73 65 2c 20 70 54 61 62 6c 65 2c 20 70  Parse, pTable, p
12410 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sel);.      }.  
12420 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65 6c    }else if( pSel
12430 54 61 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Tab ){.      /* 
12440 43 52 45 41 54 45 20 56 49 45 57 20 6e 61 6d 65  CREATE VIEW name
12450 20 41 53 2e 2e 2e 20 20 77 69 74 68 6f 75 74 20   AS...  without 
12460 61 6e 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74  an argument list
12470 2e 20 20 43 6f 6e 73 74 72 75 63 74 0a 20 20 20  .  Construct.   
12480 20 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e     ** the column
12490 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65 20   names from the 
124a0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
124b0 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
124c0 65 20 76 69 65 77 2e 0a 20 20 20 20 20 20 2a 2f  e view..      */
124d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
124e0 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29  Table->aCol==0 )
124f0 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ;.      pTable->
12500 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  nCol = pSelTab->
12510 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61 62  nCol;.      pTab
12520 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54  le->aCol = pSelT
12530 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->aCol;.      
12540 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
12550 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  0;.      pSelTab
12560 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
12570 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12580 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
12590 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65 2d 3e  (db, 0, pTable->
125a0 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20  pSchema) );.    
125b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
125c0 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  ble->nCol = 0;. 
125d0 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
125e0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
125f0 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53  leteTable(db, pS
12600 65 6c 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69  elTab);.    sqli
12610 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
12620 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64  db, pSel);.    d
12630 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
12640 73 61 62 6c 65 2d 2d 3b 0a 20 20 7d 20 65 6c 73  sable--;.  } els
12650 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  e {.    nErr++;.
12660 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53    }.  pTable->pS
12670 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61  chema->schemaFla
12680 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74  gs |= DB_Unreset
12690 56 69 65 77 73 3b 0a 23 65 6e 64 69 66 20 2f 2a  Views;.#endif /*
126a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
126b0 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45  W */.  return nE
126c0 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f  rr;  .}.#endif /
126d0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
126e0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
126f0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
12700 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
12710 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  E) */..#ifndef S
12720 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
12730 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
12740 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
12750 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20  m every VIEW in 
12760 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f  database idx..*/
12770 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
12780 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
12790 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
127a0 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65   idx){.  HashEle
127b0 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74 28 20  m *i;.  assert( 
127c0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
127d0 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78 2c 20  exHeld(db, idx, 
127e0 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44 62 48  0) );.  if( !DbH
127f0 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  asProperty(db, i
12800 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
12810 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ews) ) return;. 
12820 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
12830 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b  hFirst(&db->aDb[
12840 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62  idx].pSchema->tb
12850 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69  lHash); i;i=sqli
12860 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
12870 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
12880 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
12890 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  (i);.    if( pTa
128a0 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
128b0 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
128c0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c  eColumnNames(db,
128d0 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54   pTab);.      pT
128e0 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
128f0 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
12900 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
12910 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
12920 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
12930 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c  setViews);.}.#el
12940 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69  se.# define sqli
12950 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41  teViewResetAll(A
12960 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ,B).#endif /* SQ
12970 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
12980 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
12990 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
129a0 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20   by the VDBE to 
129b0 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72  adjust the inter
129c0 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73  nal schema.** us
129d0 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65  ed by SQLite whe
129e0 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  n the btree laye
129f0 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20  r moves a table 
12a00 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a  root page. The.*
12a10 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  * root-page of a
12a20 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
12a30 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20  in database iDb 
12a40 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d  has changed from
12a50 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f   iFrom.** to iTo
12a60 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23  ..**.** Ticket #
12a70 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f  1728:  The symbo
12a80 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74  l table might st
12a90 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f  ill contain info
12aa0 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61  rmation.** on ta
12ab0 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69  bles and/or indi
12ac0 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65  ces that are the
12ad0 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
12ae0 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66  g deleted..** If
12af0 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79   you are unlucky
12b00 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64  , one of those d
12b10 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f  eleted indices o
12b20 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a  r tables might.*
12b30 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  * have the same 
12b40 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20  rootpage number 
12b50 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c  as the real tabl
12b60 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20  e or index that 
12b70 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65  is.** being move
12b80 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74  d.  So we cannot
12b90 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20   stop searching 
12ba0 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20  after the first 
12bb0 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73  match .** becaus
12bc0 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  e the first matc
12bd0 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f  h might be for o
12be0 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65  ne of the delete
12bf0 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20  d indices.** or 
12c00 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74  tables and not t
12c10 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74  he table/index t
12c20 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20  hat is actually 
12c30 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20  being moved..** 
12c40 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65  We must continue
12c50 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
12c60 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  ll tables and in
12c70 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f  dices with.** ro
12c80 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61  otpage==iFrom ha
12c90 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  ve been converte
12ca0 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74  d to have a root
12cb0 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69  page of iTo.** i
12cc0 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65  n order to be ce
12cd0 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f  rtain that we go
12ce0 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e  t the right one.
12cf0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
12d00 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
12d10 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  UM.void sqlite3R
12d20 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c  ootPageMoved(sql
12d30 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
12d40 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  b, int iFrom, in
12d50 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c  t iTo){.  HashEl
12d60 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
12d70 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20 2a  h *pHash;.  Db *
12d80 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
12d90 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
12da0 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
12db0 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  0) );.  pDb = &d
12dc0 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
12dd0 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63  Hash = &pDb->pSc
12de0 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20  hema->tblHash;. 
12df0 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
12e00 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68  eHashFirst(pHash
12e10 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
12e20 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
12e30 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
12e40 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
12e50 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
12e60 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74  .    if( pTab->t
12e70 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  num==iFrom ){.  
12e80 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d      pTab->tnum =
12e90 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iTo;.    }.  }.
12ea0 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
12eb0 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
12ec0 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
12ed0 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
12ee0 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
12ef0 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
12f00 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49  t(pElem)){.    I
12f10 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c  ndex *pIdx = sql
12f20 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
12f30 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  m);.    if( pIdx
12f40 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
12f50 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75  .      pIdx->tnu
12f60 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
12f70 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
12f80 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f  ** Write code to
12f90 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65   erase the table
12fa0 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
12fb0 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61  iTable from data
12fc0 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73  base iDb..** Als
12fd0 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20  o write code to 
12fe0 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74  modify the sqlit
12ff0 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
13000 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
13010 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d  ma.** if a root-
13020 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  page of another 
13030 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
13040 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65  y the btree-laye
13050 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73  r whilst.** eras
13060 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73  ing iTable (this
13070 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
13080 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
13090 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73  database)..*/ .s
130a0 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
130b0 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65  oyRootPage(Parse
130c0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
130d0 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  able, int iDb){.
130e0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
130f0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
13100 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  e);.  int r1 = s
13110 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
13120 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
13130 72 74 28 20 69 54 61 62 6c 65 3e 31 20 29 3b 0a  rt( iTable>1 );.
13140 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13150 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  Op3(v, OP_Destro
13160 79 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69  y, iTable, r1, i
13170 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61  Db);.  sqlite3Ma
13180 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
13190 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
131a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
131b0 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 73   /* OP_Destroy s
131c0 74 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e 74 65  tores an in inte
131d0 67 65 72 20 72 31 2e 20 49 66 20 74 68 69 73 20  ger r1. If this 
131e0 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20  integer.  ** is 
131f0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
13200 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  t is the root pa
13210 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74  ge number of a t
13220 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20  able moved to.  
13230 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62  ** location iTab
13240 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  le. The followin
13250 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20  g code modifies 
13260 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
13270 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20  r table to.  ** 
13280 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20  reflect this..  
13290 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e  **.  ** The "#NN
132a0 4e 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73  N" in the SQL is
132b0 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74   a special const
132c0 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ant that means w
132d0 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20  hatever value.  
132e0 2a 2a 20 69 73 20 69 6e 20 72 65 67 69 73 74 65  ** is in registe
132f0 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61 6d  r NNN.  See gram
13300 6d 61 72 20 72 75 6c 65 73 20 61 73 73 6f 63 69  mar rules associ
13310 61 74 65 64 20 77 69 74 68 20 74 68 65 20 54 4b  ated with the TK
13320 5f 52 45 47 49 53 54 45 52 0a 20 20 2a 2a 20 74  _REGISTER.  ** t
13330 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69 74 69 6f  oken for additio
13340 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
13350 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e  .  */.  sqlite3N
13360 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
13370 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54 45  e, .     "UPDATE
13380 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70   %Q.%s SET rootp
13390 61 67 65 3d 25 64 20 57 48 45 52 45 20 23 25 64  age=%d WHERE #%d
133a0 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25   AND rootpage=#%
133b0 64 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d  d",.     pParse-
133c0 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44  >db->aDb[iDb].zD
133d0 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e  bSName, MASTER_N
133e0 41 4d 45 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c  AME, iTable, r1,
133f0 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73   r1);.#endif.  s
13400 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
13410 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
13420 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
13430 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72   VDBE code to er
13440 61 73 65 20 74 61 62 6c 65 20 70 54 61 62 20 61  ase table pTab a
13450 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65  nd all associate
13460 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73  d indices on dis
13470 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70  k..** Code to up
13480 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f  date the sqlite_
13490 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e  master tables an
134a0 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  d internal schem
134b0 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a  a definitions.**
134c0 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d   in case a root-
134d0 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  page belonging t
134e0 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  o another table 
134f0 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20  is moved by the 
13500 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69  btree layer.** i
13510 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68  s also added (th
13520 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69  is can happen wi
13530 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  th an auto-vacuu
13540 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a  m database)..*/.
13550 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74  static void dest
13560 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a  royTable(Parse *
13570 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
13580 54 61 62 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68  Tab){.  /* If th
13590 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62  e database may b
135a0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61  e auto-vacuum ca
135b0 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45  pable (if SQLITE
135c0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
135d0 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66  .  ** is not def
135e0 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69  ined), then it i
135f0 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63  s important to c
13600 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f  all OP_Destroy o
13610 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65  n the.  ** table
13620 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d   and index root-
13630 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20  pages in order, 
13640 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68  starting with th
13650 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20  e numerically . 
13660 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74   ** largest root
13670 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68  -page number. Th
13680 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  is guarantees th
13690 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72  at none of the r
136a0 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74  oot-pages.  ** t
136b0 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 69  o be destroyed i
136c0 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61  s relocated by a
136d0 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73  n earlier OP_Des
136e0 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68  troy. i.e. if th
136f0 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  e.  ** following
13700 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a   were coded:.  *
13710 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f  *.  ** OP_Destro
13720 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20  y 4 0.  ** .... 
13730 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35   ** OP_Destroy 5
13740 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64   0.  **.  ** and
13750 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70   root page 5 hap
13760 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20  pened to be the 
13770 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
13780 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a  e number in the.
13790 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74    ** database, t
137a0 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20  hen root page 5 
137b0 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74  would be moved t
137c0 6f 20 70 61 67 65 20 34 20 62 79 20 74 68 65 20  o page 4 by the 
137d0 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f  .  ** "OP_Destro
137e0 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54  y 4 0" opcode. T
137f0 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f  he subsequent "O
13800 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20 77  P_Destroy 5 0" w
13810 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20  ould hit.  ** a 
13820 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a  free-list page..
13830 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20    */.  int iTab 
13840 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20  = pTab->tnum;.  
13850 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d  int iDestroyed =
13860 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20   0;..  while( 1 
13870 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
13880 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72  dx;.    int iLar
13890 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69  gest = 0;..    i
138a0 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30  f( iDestroyed==0
138b0 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f   || iTab<iDestro
138c0 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61  yed ){.      iLa
138d0 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20  rgest = iTab;.  
138e0 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78    }.    for(pIdx
138f0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
13900 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
13910 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
13920 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74  t iIdx = pIdx->t
13930 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  num;.      asser
13940 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61  t( pIdx->pSchema
13950 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
13960 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44  );.      if( (iD
13970 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28  estroyed==0 || (
13980 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29  iIdx<iDestroyed)
13990 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65  ) && iIdx>iLarge
139a0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c  st ){.        iL
139b0 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20  argest = iIdx;. 
139c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
139d0 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30   if( iLargest==0
139e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
139f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13a00 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
13a10 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
13a20 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
13a30 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
13a40 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3e      assert( iDb>
13a50 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72 73 65  =0 && iDb<pParse
13a60 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  ->db->nDb );.   
13a70 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61     destroyRootPa
13a80 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67  ge(pParse, iLarg
13a90 65 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  est, iDb);.     
13aa0 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c   iDestroyed = iL
13ab0 61 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20  argest;.    }.  
13ac0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  }.}../*.** Remov
13ad0 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74  e entries from t
13ae0 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20  he sqlite_statN 
13af0 74 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e  tables (for N in
13b00 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74   (1,2,3)).** aft
13b10 65 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20  er a DROP INDEX 
13b20 6f 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f  or DROP TABLE co
13b30 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  mmand..*/.static
13b40 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65   void sqlite3Cle
13b50 61 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20  arStatTables(.  
13b60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
13b70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
13b80 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
13b90 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20  .  int iDb,     
13ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13bb0 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
13bc0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
13bd0 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20   *zType,     /* 
13be0 22 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a  "idx" or "tbl" *
13bf0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
13c00 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61  zName      /* Na
13c10 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74  me of index or t
13c20 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
13c30 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
13c40 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61 72   *zDbName = pPar
13c50 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
13c60 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 66 6f 72  .zDbSName;.  for
13c70 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29  (i=1; i<=4; i++)
13c80 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62 5b  {.    char zTab[
13c90 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  24];.    sqlite3
13ca0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
13cb0 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c  (zTab),zTab,"sql
13cc0 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a  ite_stat%d",i);.
13cd0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
13ce0 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d  indTable(pParse-
13cf0 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61  >db, zTab, zDbNa
13d00 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  me) ){.      sql
13d10 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
13d20 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
13d30 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
13d40 25 73 20 57 48 45 52 45 20 25 73 3d 25 51 22 2c  %s WHERE %s=%Q",
13d50 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65  .        zDbName
13d60 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a  , zTab, zType, z
13d70 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  Name.      );.  
13d80 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
13d90 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
13da0 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a  o drop a table..
13db0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
13dc0 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72  odeDropTable(Par
13dd0 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
13de0 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44 62  e *pTab, int iDb
13df0 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20  , int isView){. 
13e00 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
13e10 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
13e20 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72 20  ->db;.  Trigger 
13e30 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62 20  *pTrigger;.  Db 
13e40 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
13e50 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  iDb];..  v = sql
13e60 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
13e70 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  se);.  assert( v
13e80 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
13e90 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
13ea0 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
13eb0 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
13ec0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
13ed0 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56  LTABLE.  if( IsV
13ee0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
13ef0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13f00 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67  ddOp0(v, OP_VBeg
13f10 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  in);.  }.#endif.
13f20 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74  .  /* Drop all t
13f30 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74  riggers associat
13f40 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
13f50 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
13f60 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67 65   Code.  ** is ge
13f70 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76  nerated to remov
13f80 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73  e entries from s
13f90 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64  qlite_master and
13fa0 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  /or.  ** sqlite_
13fb0 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72  temp_master if r
13fc0 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
13fd0 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74  pTrigger = sqlit
13fe0 65 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50  e3TriggerList(pP
13ff0 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 77  arse, pTab);.  w
14000 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29  hile( pTrigger )
14010 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
14020 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d  rigger->pSchema=
14030 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c  =pTab->pSchema |
14040 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72 69 67  | .        pTrig
14050 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62  ger->pSchema==db
14060 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
14070 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
14080 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50  ropTriggerPtr(pP
14090 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b  arse, pTrigger);
140a0 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20  .    pTrigger = 
140b0 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b  pTrigger->pNext;
140c0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
140d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
140e0 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d  CREMENT.  /* Rem
140f0 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  ove any entries 
14100 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  of the sqlite_se
14110 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73  quence table ass
14120 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 2a  ociated with.  *
14130 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * the table bein
14140 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20  g dropped. This 
14150 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74  is done before t
14160 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70  he table is drop
14170 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65 20  ped.  ** at the 
14180 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20  btree level, in 
14190 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  case the sqlite_
141a0 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e  sequence table n
141b0 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76  eeds to.  ** mov
141c0 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  e as a result of
141d0 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68   the drop (can h
141e0 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61  appen in auto-va
141f0 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f  cuum mode)..  */
14200 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62  .  if( pTab->tab
14210 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
14220 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  ncrement ){.    
14230 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
14240 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
14250 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
14260 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  .sqlite_sequence
14270 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
14280 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53  .      pDb->zDbS
14290 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
142a0 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e  e.    );.  }.#en
142b0 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61  dif..  /* Drop a
142c0 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ll SQLITE_MASTER
142d0 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
142e0 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65   entries that re
142f0 66 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  fer to the.  ** 
14300 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72  table. The progr
14310 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68  am name loops th
14320 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72  rough the master
14330 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74   table and delet
14340 65 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f  es.  ** every ro
14350 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  w that refers to
14360 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20   a table of the 
14370 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
14380 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20   one being.  ** 
14390 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72  dropped. Trigger
143a0 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  s are handled se
143b0 70 61 72 61 74 65 6c 79 20 62 65 63 61 75 73 65  parately because
143c0 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62   a trigger can b
143d0 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69  e.  ** created i
143e0 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  n the temp datab
143f0 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20  ase that refers 
14400 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e  to a table in an
14410 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62  other.  ** datab
14420 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ase..  */.  sqli
14430 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
14440 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44  Parse, .      "D
14450 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
14460 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d   WHERE tbl_name=
14470 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72  %Q and type!='tr
14480 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70  igger'",.      p
14490 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41  Db->zDbSName, MA
144a0 53 54 45 52 5f 4e 41 4d 45 2c 20 70 54 61 62 2d  STER_NAME, pTab-
144b0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21  >zName);.  if( !
144c0 69 73 56 69 65 77 20 26 26 20 21 49 73 56 69 72  isView && !IsVir
144d0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
144e0 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70    destroyTable(p
144f0 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
14500 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  }..  /* Remove t
14510 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66  he table entry f
14520 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74  rom SQLite's int
14530 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64  ernal schema and
14540 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65   modify.  ** the
14550 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a   schema cookie..
14560 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72    */.  if( IsVir
14570 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
14580 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14590 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72  Op4(v, OP_VDestr
145a0 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70  oy, iDb, 0, 0, p
145b0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
145c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
145d0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72  eAddOp4(v, OP_Dr
145e0 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c  opTable, iDb, 0,
145f0 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   0, pTab->zName,
14600 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 68   0);.  sqlite3Ch
14610 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
14620 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  e, iDb);.  sqlit
14630 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62  eViewResetAll(db
14640 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , iDb);.}../*.**
14650 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
14660 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68   called to do th
14670 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50  e work of a DROP
14680 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
14690 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68  ..** pName is th
146a0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
146b0 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65  ble to be droppe
146c0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
146d0 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  e3DropTable(Pars
146e0 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
146f0 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
14700 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72  sView, int noErr
14710 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
14720 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
14730 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
14740 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
14750 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d  Db;..  if( db->m
14760 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
14770 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14780 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61  p_table;.  }.  a
14790 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
147a0 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Err==0 );.  asse
147b0 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
147c0 3d 31 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  =1 );.  if( sqli
147d0 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
147e0 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69  arse) ) goto exi
147f0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
14800 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e  if( noErr ) db->
14810 73 75 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20  suppressErr++;. 
14820 20 61 73 73 65 72 74 28 20 69 73 56 69 65 77 3d   assert( isView=
14830 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 4c 4f  =0 || isView==LO
14840 43 41 54 45 5f 56 49 45 57 20 29 3b 0a 20 20 70  CATE_VIEW );.  p
14850 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
14860 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61  ateTableItem(pPa
14870 72 73 65 2c 20 69 73 56 69 65 77 2c 20 26 70 4e  rse, isView, &pN
14880 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69 66  ame->a[0]);.  if
14890 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75  ( noErr ) db->su
148a0 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20  ppressErr--;..  
148b0 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
148c0 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 73     if( noErr ) s
148d0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
148e0 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72  NamedSchema(pPar
148f0 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  se, pName->a[0].
14900 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
14910 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
14920 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20  able;.  }.  iDb 
14930 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
14940 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
14950 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73  >pSchema);.  ass
14960 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
14970 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20  Db<db->nDb );.. 
14980 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20 61   /* If pTab is a
14990 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
149a0 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75  call ViewGetColu
149b0 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73  mnNames() to ens
149c0 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69  ure.  ** it is i
149d0 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
149e0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
149f0 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74 65  (pTab) && sqlite
14a00 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
14a10 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
14a20 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
14a30 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
14a40 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
14a50 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
14a60 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
14a70 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74   code;.    const
14a80 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
14a90 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b  HEMA_TABLE(iDb);
14aa0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
14ab0 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
14ac0 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
14ad0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
14ae0 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rg2 = 0;.    if(
14af0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
14b00 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
14b10 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
14b20 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67  , zDb)){.      g
14b30 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
14b40 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
14b50 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
14b60 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
14b70 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
14b80 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
14b90 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
14ba0 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
14bb0 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
14bc0 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
14bd0 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  IEW;.      }.#if
14be0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14bf0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
14c00 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69    }else if( IsVi
14c10 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
14c20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
14c30 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a  TE_DROP_VTABLE;.
14c40 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20 73 71        zArg2 = sq
14c50 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
14c60 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e  b, pTab)->pMod->
14c70 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20  zName;.#endif.  
14c80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
14c90 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
14ca0 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
14cb0 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
14cc0 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
14cd0 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LE;.      }else{
14ce0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
14cf0 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c  SQLITE_DROP_TABL
14d00 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
14d10 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14d20 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
14d30 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e  , code, pTab->zN
14d40 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29  ame, zArg2, zDb)
14d50 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
14d60 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
14d70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
14d80 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
14d90 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
14da0 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  LETE, pTab->zNam
14db0 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
14dc0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
14dd0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
14de0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
14df0 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
14e00 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
14e10 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a  qlite_", 7)==0 .
14e20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
14e30 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
14e40 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  me, "sqlite_stat
14e50 22 2c 20 31 31 29 21 3d 30 20 29 7b 0a 20 20 20  ", 11)!=0 ){.   
14e60 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
14e70 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
14e80 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72  %s may not be dr
14e90 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  opped", pTab->zN
14ea0 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
14eb0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
14ec0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
14ed0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
14ee0 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54  /* Ensure DROP T
14ef0 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64  ABLE is not used
14f00 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20   on a view, and 
14f10 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74  DROP VIEW is not
14f20 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20   used.  ** on a 
14f30 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
14f40 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62  ( isView && pTab
14f50 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
14f60 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14f70 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65  Msg(pParse, "use
14f80 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64   DROP TABLE to d
14f90 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c  elete table %s",
14fa0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
14fb0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14fc0 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  p_table;.  }.  i
14fd0 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54  f( !isView && pT
14fe0 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
14ff0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15000 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
15010 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c  DROP VIEW to del
15020 65 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54  ete view %s", pT
15030 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
15040 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
15050 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  able;.  }.#endif
15060 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
15070 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
15080 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
15090 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20  e master table. 
150a0 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a   ** on disk..  *
150b0 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
150c0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
150d0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
150e0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
150f0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
15100 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
15110 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54  qlite3ClearStatT
15120 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44  ables(pParse, iD
15130 62 2c 20 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e  b, "tbl", pTab->
15140 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
15150 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 70  te3FkDropTable(p
15160 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54  Parse, pName, pT
15170 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ab);.    sqlite3
15180 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 70 50  CodeDropTable(pP
15190 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44 62 2c  arse, pTab, iDb,
151a0 20 69 73 56 69 65 77 29 3b 0a 20 20 7d 0a 0a 65   isView);.  }..e
151b0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a  xit_drop_table:.
151c0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
151d0 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65  Delete(db, pName
151e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
151f0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
15200 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
15210 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  ew foreign key o
15220 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63  n the table.** c
15230 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
15240 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46  onstruction.  pF
15250 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65  romCol determine
15260 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a  s which columns.
15270 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
15280 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f  t table point to
15290 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
152a0 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d  .  If pFromCol==
152b0 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63  0 then.** connec
152c0 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65  t the key to the
152d0 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73   last column ins
152e0 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74  erted.  pTo is t
152f0 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68  he name of.** th
15300 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64  e table referred
15310 20 74 6f 20 28 61 2e 6b 2e 61 20 74 68 65 20 22   to (a.k.a the "
15320 70 61 72 65 6e 74 22 20 74 61 62 6c 65 29 2e 20  parent" table). 
15330 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73   pToCol is a lis
15340 74 0a 2a 2a 20 6f 66 20 74 61 62 6c 65 73 20 69  t.** of tables i
15350 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 54 6f  n the parent pTo
15360 20 74 61 62 6c 65 2e 20 20 66 6c 61 67 73 20 63   table.  flags c
15370 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69  ontains all.** i
15380 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
15390 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65   the conflict re
153a0 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
153b0 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  hms specified.**
153c0 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54   in the ON DELET
153d0 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64  E, ON UPDATE and
153e0 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73   ON INSERT claus
153f0 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65  es..**.** An FKe
15400 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  y structure is c
15410 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64  reated and added
15420 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
15430 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72  rrently.** under
15440 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e   construction in
15450 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   the pParse->pNe
15460 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a  wTable field..**
15470 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20  .** The foreign 
15480 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49  key is set for I
15490 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73  MMEDIATE process
154a0 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65  ing.  A subseque
154b0 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71  nt call.** to sq
154c0 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
154d0 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61  nKey() might cha
154e0 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45  nge this to DEFE
154f0 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  RRED..*/.void sq
15500 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69  lite3CreateForei
15510 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  gnKey(.  Parse *
15520 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
15530 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
15540 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
15550 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f  pFromCol,  /* Co
15560 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61  lumns in this ta
15570 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ble that point t
15580 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  o other table */
15590 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20  .  Token *pTo,  
155a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
155b0 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  of the other tab
155c0 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
155d0 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20   *pToCol,    /* 
155e0 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  Columns in the o
155f0 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
15600 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
15610 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74       /* Conflict
15620 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
15630 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20  rithms. */.){.  
15640 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
15650 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65  arse->db;.#ifnde
15660 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
15670 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79  REIGN_KEY.  FKey
15680 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46   *pFKey = 0;.  F
15690 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20  Key *pNextTo;.  
156a0 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73  Table *p = pPars
156b0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
156c0 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
156d0 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a   i;.  int nCol;.
156e0 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73    char *z;..  as
156f0 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a  sert( pTo!=0 );.
15700 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e    if( p==0 || IN
15710 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20  _DECLARE_VTAB ) 
15720 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69  goto fk_end;.  i
15730 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
15740 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  {.    int iCol =
15750 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20   p->nCol-1;.    
15760 69 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30  if( NEVER(iCol<0
15770 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  ) ) goto fk_end;
15780 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  .    if( pToCol 
15790 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
157a0 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
157b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
157c0 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65  rse, "foreign ke
157d0 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20  y on %s".       
157e0 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72    " should refer
157f0 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f  ence only one co
15800 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54  lumn of table %T
15810 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61  ",.         p->a
15820 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c  Col[iCol].zName,
15830 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74   pTo);.      got
15840 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  o fk_end;.    }.
15850 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20      nCol = 1;.  
15860 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c  }else if( pToCol
15870 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
15880 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78  r!=pFromCol->nEx
15890 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
158a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
158b0 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65  ,.        "numbe
158c0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
158d0 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73  foreign key does
158e0 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e   not match the n
158f0 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20  umber of ".     
15900 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74     "columns in t
15910 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
15920 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ble");.    goto 
15930 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  fk_end;.  }else{
15940 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f  .    nCol = pFro
15950 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  mCol->nExpr;.  }
15960 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
15970 66 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f  f(*pFKey) + (nCo
15980 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65  l-1)*sizeof(pFKe
15990 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54  y->aCol[0]) + pT
159a0 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20  o->n + 1;.  if( 
159b0 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
159c0 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d  r(i=0; i<pToCol-
159d0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
159e0 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c      nByte += sql
159f0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f  ite3Strlen30(pTo
15a00 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
15a10 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
15a20 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65    pFKey = sqlite
15a30 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
15a40 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  , nByte );.  if(
15a50 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20   pFKey==0 ){.   
15a60 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
15a70 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d  }.  pFKey->pFrom
15a80 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70   = p;.  pFKey->p
15a90 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46  NextFrom = p->pF
15aa0 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72  Key;.  z = (char
15ab0 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e  *)&pFKey->aCol[n
15ac0 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a  Col];.  pFKey->z
15ad0 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79  To = z;.  memcpy
15ae0 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d  (z, pTo->z, pTo-
15af0 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d  >n);.  z[pTo->n]
15b00 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
15b10 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b  equote(z);.  z +
15b20 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
15b30 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  Key->nCol = nCol
15b40 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
15b50 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79  ==0 ){.    pFKey
15b60 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20  ->aCol[0].iFrom 
15b70 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d  = p->nCol-1;.  }
15b80 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
15b90 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
15ba0 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
15bb0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
15bc0 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
15bd0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
15be0 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c  3StrICmp(p->aCol
15bf0 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d  [j].zName, pFrom
15c00 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
15c10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
15c20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
15c30 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20  iFrom = j;.     
15c40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15c50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15c60 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43      if( j>=p->nC
15c70 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ol ){.        sq
15c80 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15c90 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
15ca0 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e   "unknown column
15cb0 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69   \"%s\" in forei
15cc0 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
15cd0 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  n", .          p
15ce0 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
15cf0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
15d00 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20  to fk_end;.     
15d10 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
15d20 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
15d30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
15d40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
15d50 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
15d60 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
15d70 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
15d80 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
15d90 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20  zCol = z;.      
15da0 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c  memcpy(z, pToCol
15db0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29  ->a[i].zName, n)
15dc0 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30  ;.      z[n] = 0
15dd0 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31  ;.      z += n+1
15de0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
15df0 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
15e00 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41  = 0;.  pFKey->aA
15e10 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28  ction[0] = (u8)(
15e20 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20 20  flags & 0xff);  
15e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20            /* ON 
15e40 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f  DELETE action */
15e50 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f  .  pFKey->aActio
15e60 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61  n[1] = (u8)((fla
15e70 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
15e80 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41  );    /* ON UPDA
15e90 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  TE action */..  
15ea0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
15eb0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
15ec0 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61  b, 0, p->pSchema
15ed0 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d  ) );.  pNextTo =
15ee0 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33   (FKey *)sqlite3
15ef0 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70  HashInsert(&p->p
15f00 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68  Schema->fkeyHash
15f10 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  , .      pFKey->
15f20 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b  zTo, (void *)pFK
15f30 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e  ey.  );.  if( pN
15f40 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a  extTo==pFKey ){.
15f50 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
15f60 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 67 6f 74  ult(db);.    got
15f70 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  o fk_end;.  }.  
15f80 69 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20  if( pNextTo ){. 
15f90 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 78 74     assert( pNext
15fa0 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29  To->pPrevTo==0 )
15fb0 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65  ;.    pFKey->pNe
15fc0 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a  xtTo = pNextTo;.
15fd0 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72      pNextTo->pPr
15fe0 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20  evTo = pFKey;.  
15ff0 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  }..  /* Link the
16000 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20   foreign key to 
16010 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65  the table as the
16020 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f   last step..  */
16030 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46  .  p->pFKey = pF
16040 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30  Key;.  pFKey = 0
16050 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c  ;..fk_end:.  sql
16060 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
16070 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  FKey);.#endif /*
16080 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
16090 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
160a0 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  Y) */.  sqlite3E
160b0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
160c0 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73  , pFromCol);.  s
160d0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
160e0 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29  lete(db, pToCol)
160f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
16100 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
16110 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41  d when an INITIA
16120 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72  LLY IMMEDIATE or
16130 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
16140 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73  RED.** clause is
16150 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66   seen as part of
16160 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64   a foreign key d
16170 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20  efinition.  The 
16180 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61  isDeferred.** pa
16190 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72  rameter is 1 for
161a0 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
161b0 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e  RED and 0 for IN
161c0 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
161d0 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69  E..** The behavi
161e0 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  or of the most r
161f0 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
16200 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61  foreign key is a
16210 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72  djusted.** accor
16220 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  dingly..*/.void 
16230 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
16240 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50  ignKey(Parse *pP
16250 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65  arse, int isDefe
16260 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53  rred){.#ifndef S
16270 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
16280 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a  GN_KEY.  Table *
16290 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46  pTab;.  FKey *pF
162a0 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62  Key;.  if( (pTab
162b0 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
162c0 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b  able)==0 || (pFK
162d0 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79  ey = pTab->pFKey
162e0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
162f0 20 61 73 73 65 72 74 28 20 69 73 44 65 66 65 72   assert( isDefer
16300 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65  red==0 || isDefe
16310 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56  rred==1 ); /* EV
16320 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20  : R-30323-21917 
16330 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65  */.  pFKey->isDe
16340 66 65 72 72 65 64 20 3d 20 28 75 38 29 69 73 44  ferred = (u8)isD
16350 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a  eferred;.#endif.
16360 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
16370 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
16380 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c   erase and refil
16390 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20  l index *pIdx.  
163a0 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20  This is.** used 
163b0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  to initialize a 
163c0 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e  newly created in
163d0 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70  dex or to recomp
163e0 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ute the.** conte
163f0 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69  nt of an index i
16400 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20  n response to a 
16410 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
16420 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f  .**.** if memRoo
16430 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67  tPage is not neg
16440 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20  ative, it means 
16450 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69  that the index i
16460 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74  s newly.** creat
16470 65 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65  ed.  The registe
16480 72 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d  r specified by m
16490 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61  emRootPage conta
164a0 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20  ins the.** root 
164b0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
164c0 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65  he index.  If me
164d0 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67  mRootPage is neg
164e0 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  ative, then.** t
164f0 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  he index already
16500 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74   exists and must
16510 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f   be cleared befo
16520 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65  re being refille
16530 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f  d and.** the roo
16540 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
16550 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61   the index is ta
16560 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d  ken from pIndex-
16570 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  >tnum..*/.static
16580 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66   void sqlite3Ref
16590 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a  illIndex(Parse *
165a0 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
165b0 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f  Index, int memRo
165c0 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65  otPage){.  Table
165d0 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
165e0 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65  >pTable;  /* The
165f0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69   table that is i
16600 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
16610 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
16620 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74  Tab++;     /* Bt
16630 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  ree cursor used 
16640 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e  for pTab */.  in
16650 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d  t iIdx = pParse-
16660 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20  >nTab++;     /* 
16670 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65  Btree cursor use
16680 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a  d for pIndex */.
16690 20 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20 20    int iSorter;  
166a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166b0 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 65   /* Cursor opene
166c0 64 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72 20  d by OpenSorter 
166d0 28 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20  (if in use) */. 
166e0 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
166f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16700 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f  /* Address of to
16710 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  p of loop */.  i
16720 6e 74 20 61 64 64 72 32 3b 20 20 20 20 20 20 20  nt addr2;       
16730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16740 20 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70   Address to jump
16750 20 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74 65   to for next ite
16760 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
16770 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  tnum;           
16780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
16790 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78  ot page of index
167a0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74 49   */.  int iPartI
167b0 64 78 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20  dxLabel;        
167c0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20       /* Jump to 
167d0 74 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73 6b  this label to sk
167e0 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20 56 64  ip a row */.  Vd
167f0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
16800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16810 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
16820 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  to this virtual 
16830 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79  machine */.  Key
16840 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20  Info *pKey;     
16850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
16860 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78  eyInfo for index
16870 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
16880 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ord;            
16890 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
168a0 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c   holding assembl
168b0 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  ed index record 
168c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
168d0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
168e0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
168f0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
16900 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71  /.  int iDb = sq
16910 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
16920 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70  ex(db, pIndex->p
16930 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
16940 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
16950 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66  THORIZATION.  if
16960 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
16970 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
16980 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65  E_REINDEX, pInde
16990 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20  x->zName, 0,.   
169a0 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
169b0 7a 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a 20 20  zDbSName ) ){.  
169c0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
169d0 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69  ndif..  /* Requi
169e0 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  re a write-lock 
169f0 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  on the table to 
16a00 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70 65  perform this ope
16a10 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  ration */.  sqli
16a20 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
16a30 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
16a40 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a  tnum, 1, pTab->z
16a50 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71  Name);..  v = sq
16a60 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
16a70 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
16a80 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
16a90 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20   memRootPage>=0 
16aa0 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65  ){.    tnum = me
16ab0 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c  mRootPage;.  }el
16ac0 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70  se{.    tnum = p
16ad0 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d  Index->tnum;.  }
16ae0 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  .  pKey = sqlite
16af0 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
16b00 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b  pParse, pIndex);
16b10 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 21  .  assert( pKey!
16b20 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
16b30 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
16b40 2d 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 2f 2a 20  ->nErr );..  /* 
16b50 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20  Open the sorter 
16b60 63 75 72 73 6f 72 20 69 66 20 77 65 20 61 72 65  cursor if we are
16b70 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a   to use one. */.
16b80 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72    iSorter = pPar
16b90 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71  se->nTab++;.  sq
16ba0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
16bb0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  v, OP_SorterOpen
16bc0 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70 49  , iSorter, 0, pI
16bd0 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28  ndex->nKeyCol, (
16be0 63 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20 20  char*).         
16bf0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
16c00 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
16c10 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  y), P4_KEYINFO);
16c20 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
16c30 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f  table. Loop thro
16c40 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20  ugh all rows of 
16c50 74 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65 72  the table, inser
16c60 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20  ting index.  ** 
16c70 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65  records into the
16c80 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71   sorter. */.  sq
16c90 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
16ca0 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62  Parse, iTab, iDb
16cb0 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
16cc0 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  ead);.  addr1 = 
16cd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16ce0 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
16cf0 69 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43 6f  iTab, 0); VdbeCo
16d00 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65 67  verage(v);.  reg
16d10 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
16d20 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
16d30 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65  e);..  sqlite3Ge
16d40 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70  nerateIndexKey(p
16d50 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69 54 61  Parse,pIndex,iTa
16d60 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c 26 69  b,regRecord,0,&i
16d70 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30  PartIdxLabel,0,0
16d80 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16d90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
16da0 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f 72 74  terInsert, iSort
16db0 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  er, regRecord);.
16dc0 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
16dd0 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61  PartIdxLabel(pPa
16de0 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c 61 62  rse, iPartIdxLab
16df0 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  el);.  sqlite3Vd
16e00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
16e10 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31  ext, iTab, addr1
16e20 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +1); VdbeCoverag
16e30 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
16e40 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
16e50 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d  ddr1);.  if( mem
16e60 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c  RootPage<0 ) sql
16e70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16e80 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d  , OP_Clear, tnum
16e90 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
16ea0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
16eb0 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64  P_OpenWrite, iId
16ec0 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20  x, tnum, iDb, . 
16ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ee0 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c     (char *)pKey,
16ef0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
16f00 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
16f10 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55  eP5(v, OPFLAG_BU
16f20 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50  LKCSR|((memRootP
16f30 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50  age>=0)?OPFLAG_P
16f40 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61  2ISREG:0));..  a
16f50 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
16f60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
16f70 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f 72 74  orterSort, iSort
16f80 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  er, 0); VdbeCove
16f90 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20 49  rage(v);.  if( I
16fa0 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e  sUniqueIndex(pIn
16fb0 64 65 78 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  dex) ){.    int 
16fc0 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j2 = sqlite3Vdbe
16fd0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
16fe0 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   3;.    sqlite3V
16ff0 64 62 65 47 6f 74 6f 28 76 2c 20 6a 32 29 3b 0a  dbeGoto(v, j2);.
17000 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
17010 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
17020 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
17030 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
17040 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70  v, OP_SorterComp
17050 61 72 65 2c 20 69 53 6f 72 74 65 72 2c 20 6a 32  are, iSorter, j2
17060 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20 20  , regRecord,.   
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17080 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 4b        pIndex->nK
17090 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65  eyCol); VdbeCove
170a0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
170b0 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72  ite3UniqueConstr
170c0 61 69 6e 74 28 70 50 61 72 73 65 2c 20 4f 45 5f  aint(pParse, OE_
170d0 41 62 6f 72 74 2c 20 70 49 6e 64 65 78 29 3b 0a  Abort, pIndex);.
170e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
170f0 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
17100 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
17110 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
17120 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
17130 72 74 65 72 44 61 74 61 2c 20 69 53 6f 72 74 65  rterData, iSorte
17140 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 69 49  r, regRecord, iI
17150 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dx);.  sqlite3Vd
17160 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53  beAddOp1(v, OP_S
17170 65 65 6b 45 6e 64 2c 20 69 49 64 78 29 3b 0a 20  eekEnd, iIdx);. 
17180 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17190 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
171a0 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52 65 63  rt, iIdx, regRec
171b0 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
171c0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
171d0 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
171e0 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ULT);.  sqlite3R
171f0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
17200 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
17210 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
17220 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
17230 65 72 4e 65 78 74 2c 20 69 53 6f 72 74 65 72 2c  erNext, iSorter,
17240 20 61 64 64 72 32 29 3b 20 56 64 62 65 43 6f 76   addr2); VdbeCov
17250 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
17260 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
17270 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 73 71  v, addr1);..  sq
17280 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
17290 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61  v, OP_Close, iTa
172a0 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b);.  sqlite3Vdb
172b0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
172c0 6f 73 65 2c 20 69 49 64 78 29 3b 0a 20 20 73 71  ose, iIdx);.  sq
172d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
172e0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f  v, OP_Close, iSo
172f0 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rter);.}../*.** 
17300 41 6c 6c 6f 63 61 74 65 20 68 65 61 70 20 73 70  Allocate heap sp
17310 61 63 65 20 74 6f 20 68 6f 6c 64 20 61 6e 20 49  ace to hold an I
17320 6e 64 65 78 20 6f 62 6a 65 63 74 20 77 69 74 68  ndex object with
17330 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a   nCol columns..*
17340 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68  *.** Increase th
17350 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a  e allocation siz
17360 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20  e to provide an 
17370 65 78 74 72 61 20 6e 45 78 74 72 61 20 62 79 74  extra nExtra byt
17380 65 73 0a 2a 2a 20 6f 66 20 38 2d 62 79 74 65 20  es.** of 8-byte 
17390 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 66  aligned space af
173a0 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62  ter the Index ob
173b0 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ject and return 
173c0 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20  a.** pointer to 
173d0 74 68 69 73 20 65 78 74 72 61 20 73 70 61 63 65  this extra space
173e0 20 69 6e 20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f   in *ppExtra..*/
173f0 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 41  .Index *sqlite3A
17400 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65  llocateIndexObje
17410 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ct(.  sqlite3 *d
17420 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  b,         /* Da
17430 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
17440 6e 20 2a 2f 0a 20 20 69 31 36 20 6e 43 6f 6c 2c  n */.  i16 nCol,
17450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17460 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63  otal number of c
17470 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
17480 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  dex */.  int nEx
17490 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  tra,          /*
174a0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
174b0 20 6f 66 20 65 78 74 72 61 20 73 70 61 63 65 20   of extra space 
174c0 74 6f 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68  to alloc */.  ch
174d0 61 72 20 2a 2a 70 70 45 78 74 72 61 20 20 20 20  ar **ppExtra    
174e0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
174f0 20 74 68 65 20 22 65 78 74 72 61 22 20 73 70 61   the "extra" spa
17500 63 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  ce */.){.  Index
17510 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
17520 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 69 6e 64  /* Allocated ind
17530 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  ex object */.  i
17540 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
17550 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
17560 73 70 61 63 65 20 66 6f 72 20 49 6e 64 65 78 20  space for Index 
17570 6f 62 6a 65 63 74 20 2b 20 61 72 72 61 79 73 20  object + arrays 
17580 2a 2f 0a 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f  */..  nByte = RO
17590 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65  UND8(sizeof(Inde
175a0 78 29 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  x)) +           
175b0 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75     /* Index stru
175c0 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20  cture  */.      
175d0 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f      ROUND8(sizeo
175e0 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b  f(char*)*nCol) +
175f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
17600 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a  x.azColl     */.
17610 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38            ROUND8
17620 28 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a  (sizeof(LogEst)*
17630 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 2f  (nCol+1) +     /
17640 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 4c 6f 67  * Index.aiRowLog
17650 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  Est   */.       
17660 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
17670 28 69 31 36 29 2a 6e 43 6f 6c 20 2b 20 20 20 20  (i16)*nCol +    
17680 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
17690 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20  .aiColumn   */. 
176a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176b0 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 29  sizeof(u8)*nCol)
176c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
176d0 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65   Index.aSortOrde
176e0 72 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74  r */.  p = sqlit
176f0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
17700 62 2c 20 6e 42 79 74 65 20 2b 20 6e 45 78 74 72  b, nByte + nExtr
17710 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  a);.  if( p ){. 
17720 20 20 20 63 68 61 72 20 2a 70 45 78 74 72 61 20     char *pExtra 
17730 3d 20 28 28 63 68 61 72 2a 29 70 29 2b 52 4f 55  = ((char*)p)+ROU
17740 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78  ND8(sizeof(Index
17750 29 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f 6c  ));.    p->azCol
17760 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
17770 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74 72 61  *)pExtra; pExtra
17780 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f   += ROUND8(sizeo
17790 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a  f(char*)*nCol);.
177a0 20 20 20 20 70 2d 3e 61 69 52 6f 77 4c 6f 67 45      p->aiRowLogE
177b0 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 45  st = (LogEst*)pE
177c0 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20  xtra; pExtra += 
177d0 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28  sizeof(LogEst)*(
177e0 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e  nCol+1);.    p->
177f0 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a  aiColumn = (i16*
17800 29 70 45 78 74 72 61 3b 20 20 20 20 20 20 20 70  )pExtra;       p
17810 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
17820 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70  i16)*nCol;.    p
17830 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
17840 75 38 2a 29 70 45 78 74 72 61 3b 0a 20 20 20 20  u8*)pExtra;.    
17850 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f  p->nColumn = nCo
17860 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f  l;.    p->nKeyCo
17870 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  l = nCol - 1;.  
17880 20 20 2a 70 70 45 78 74 72 61 20 3d 20 28 28 63    *ppExtra = ((c
17890 68 61 72 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b  har*)p) + nByte;
178a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
178b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
178c0 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72   a new index for
178d0 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20   an SQL table.  
178e0 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73  pName1.pName2 is
178f0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
17900 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70   index .** and p
17910 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e  TblList is the n
17920 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
17930 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
17940 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69  ndexed.  Both wi
17950 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66  ll .** be NULL f
17960 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  or a primary key
17970 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61   or an index tha
17980 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20  t is created to 
17990 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49  satisfy a.** UNI
179a0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
179b0 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70   If pTable and p
179c0 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20  Index are NULL, 
179d0 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  use pParse->pNew
179e0 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20  Table.** as the 
179f0 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
17a00 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e  xed.  pParse->pN
17a10 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62  ewTable is a tab
17a20 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75  le that is.** cu
17a30 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
17a40 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43  nstructed by a C
17a50 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
17a60 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69  ement..**.** pLi
17a70 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
17a80 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
17a90 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69  dexed.  pList wi
17aa0 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
17ab0 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61  is.** is a prima
17ac0 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65  ry key or unique
17ad0 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74  -constraint on t
17ae0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
17af0 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74  olumn added.** t
17b00 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
17b10 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
17b20 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76  truction.  .*/.v
17b30 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
17b40 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  eIndex(.  Parse 
17b50 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
17b60 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  All information 
17b70 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65  about this parse
17b80 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
17b90 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73  me1,     /* Firs
17ba0 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20  t part of index 
17bb0 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c  name. May be NUL
17bc0 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  L */.  Token *pN
17bd0 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63  ame2,     /* Sec
17be0 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65  ond part of inde
17bf0 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
17c00 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ULL */.  SrcList
17c10 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54   *pTblName, /* T
17c20 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55  able to index. U
17c30 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
17c40 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45  able if 0 */.  E
17c50 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
17c60 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63    /* A list of c
17c70 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
17c80 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
17c90 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20  Error,       /* 
17ca0 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e  OE_Abort, OE_Ign
17cb0 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c  ore, OE_Replace,
17cc0 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20   or OE_None */. 
17cd0 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20   Token *pStart, 
17ce0 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
17cf0 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
17d00 69 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d 65  ins this stateme
17d10 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50  nt */.  Expr *pP
17d20 49 57 68 65 72 65 2c 20 20 20 20 2f 2a 20 57 48  IWhere,    /* WH
17d30 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 70  ERE clause for p
17d40 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20 2a  artial indices *
17d50 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
17d60 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f  r,     /* Sort o
17d70 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20  rder of primary 
17d80 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d  key when pList==
17d90 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66  NULL */.  int if
17da0 4e 6f 74 45 78 69 73 74 2c 20 20 20 20 2f 2a 20  NotExist,    /* 
17db0 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e  Omit error if in
17dc0 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
17dd0 74 73 20 2a 2f 0a 20 20 75 38 20 69 64 78 54 79  ts */.  u8 idxTy
17de0 70 65 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  pe         /* Th
17df0 65 20 69 6e 64 65 78 20 74 79 70 65 20 2a 2f 0a  e index type */.
17e00 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
17e10 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62   = 0;     /* Tab
17e20 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
17e30 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
17e40 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  dex = 0;   /* Th
17e50 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72  e index to be cr
17e60 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  eated */.  char 
17e70 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  *zName = 0;     
17e80 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
17e90 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  ndex */.  int nN
17ea0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
17eb0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
17ec0 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20  acters in zName 
17ed0 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  */.  int i, j;. 
17ee0 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
17ef0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73        /* For ass
17f00 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  igning database 
17f10 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20  names to pTable 
17f20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
17f30 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74  erMask;   /* 1 t
17f40 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20  o honor DESC in 
17f50 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e  index.  0 to ign
17f60 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ore. */.  sqlite
17f70 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
17f80 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  db;.  Db *pDb;  
17f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17fa0 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65  e specific table
17fb0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
17fc0 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65  indexed database
17fd0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
17fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
17ff0 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
18000 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e  ase that is bein
18010 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54  g written */.  T
18020 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
18030 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
18040 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  ed name of the i
18050 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a  ndex to create *
18060 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
18070 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49  ist_item *pListI
18080 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  tem; /* For loop
18090 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a  ing over pList *
180a0 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d  /.  int nExtra =
180b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
180c0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c       /* Space al
180d0 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 45 78 74  located for zExt
180e0 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ra[] */.  int nE
180f0 78 74 72 61 43 6f 6c 3b 20 20 20 20 20 20 20 20  xtraCol;        
18100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
18110 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 63 6f  mber of extra co
18120 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a  lumns needed */.
18130 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20 3d    char *zExtra =
18140 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
18150 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63     /* Extra spac
18160 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65  e after the Inde
18170 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e  x object */.  In
18180 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20  dex *pPk = 0;   
18190 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45     /* PRIMARY KE
181a0 59 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54 48  Y index for WITH
181b0 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73  OUT ROWID tables
181c0 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d   */..  if( db->m
181d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
181e0 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b  Parse->nErr>0 ){
181f0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
18200 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
18210 0a 20 20 69 66 28 20 49 4e 5f 44 45 43 4c 41 52  .  if( IN_DECLAR
18220 45 5f 56 54 41 42 20 26 26 20 69 64 78 54 79 70  E_VTAB && idxTyp
18230 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e!=SQLITE_IDXTYP
18240 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 7b 0a  E_PRIMARYKEY ){.
18250 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
18260 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
18270 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
18280 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
18290 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
182a0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
182b0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  te_index;.  }.. 
182c0 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
182d0 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
182e0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
182f0 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20  Return early if 
18300 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a  not found..  */.
18310 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d    if( pTblName!=
18320 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65  0 ){..    /* Use
18330 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e   the two-part in
18340 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  dex name to dete
18350 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61  rmine the databa
18360 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65  se .    ** to se
18370 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62  arch for the tab
18380 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61  le. 'Fix' the ta
18390 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73  ble name to this
183a0 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72   db.    ** befor
183b0 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65  e looking up the
183c0 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
183d0 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
183e0 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20  1 && pName2 );. 
183f0 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
18400 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
18410 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
18420 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20  e2, &pName);.   
18430 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74   if( iDb<0 ) got
18440 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18450 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dex;.    assert(
18460 20 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d   pName && pName-
18470 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  >z );..#ifndef S
18480 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44  QLITE_OMIT_TEMPD
18490 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  B.    /* If the 
184a0 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75  index name was u
184b0 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63  nqualified, chec
184c0 6b 20 69 66 20 74 68 65 20 74 61 62 6c 65 0a 20  k if the table. 
184d0 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20     ** is a temp 
184e0 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65  table. If so, se
184f0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  t the database t
18500 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74  o 1. Do not do t
18510 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e  his.    ** if in
18520 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74  itialising a dat
18530 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20  abase schema..  
18540 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62    */.    if( !db
18550 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
18560 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69       pTab = sqli
18570 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70  te3SrcListLookup
18580 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d  (pParse, pTblNam
18590 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  e);.      if( pN
185a0 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54  ame2->n==0 && pT
185b0 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68  ab && pTab->pSch
185c0 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e  ema==db->aDb[1].
185d0 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
185e0 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20     iDb = 1;.    
185f0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
18600 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 78  ..    sqlite3Fix
18610 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72  Init(&sFix, pPar
18620 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22  se, iDb, "index"
18630 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , pName);.    if
18640 28 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c  ( sqlite3FixSrcL
18650 69 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e  ist(&sFix, pTblN
18660 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ame) ){.      /*
18670 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72   Because the par
18680 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70  ser constructs p
18690 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73  TblName from a s
186a0 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72  ingle identifier
186b0 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  ,.      ** sqlit
186c0 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e  e3FixSrcList can
186d0 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a   never fail. */.
186e0 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
186f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20  .    }.    pTab 
18700 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
18710 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
18720 20 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61   0, &pTblName->a
18730 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [0]);.    assert
18740 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
18750 65 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30  ed==0 || pTab==0
18760 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62   );.    if( pTab
18770 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
18780 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18790 20 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26 20    if( iDb==1 && 
187a0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
187b0 68 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63 68  hema!=pTab->pSch
187c0 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ema ){.      sql
187d0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
187e0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
187f0 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20   "cannot create 
18800 61 20 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20  a TEMP index on 
18810 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c  non-TEMP table \
18820 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  "%s\"",.        
18830 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b     pTab->zName);
18840 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
18850 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18860 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 48 61     }.    if( !Ha
18870 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 70  sRowid(pTab) ) p
18880 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
18890 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
188a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
188b0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30  assert( pName==0
188c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
188d0 70 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20  pStart==0 );.   
188e0 20 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   pTab = pParse->
188f0 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69  pNewTable;.    i
18900 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20  f( !pTab ) goto 
18910 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18920 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  x;.    iDb = sql
18930 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
18940 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
18950 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20  ema);.  }.  pDb 
18960 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
18970 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ..  assert( pTab
18980 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
18990 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
189a0 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
189b0 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
189c0 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
189d0 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20  , 7)==0 .       
189e0 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  && db->init.busy
189f0 3d 3d 30 0a 23 69 66 20 53 51 4c 49 54 45 5f 55  ==0.#if SQLITE_U
18a00 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
18a10 4f 4e 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  ON.       && sql
18a20 69 74 65 33 55 73 65 72 41 75 74 68 54 61 62 6c  ite3UserAuthTabl
18a30 65 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d  e(pTab->zName)==
18a40 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  0.#endif.       
18a50 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
18a60 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b  mp(&pTab->zName[
18a70 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39  7],"altertab_",9
18a80 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
18a90 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
18aa0 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
18ab0 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
18ac0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
18ad0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
18ae0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
18af0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18b00 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20  OMIT_VIEW.  if( 
18b10 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
18b20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
18b30 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
18b40 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  ews may not be i
18b50 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f  ndexed");.    go
18b60 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18b70 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ndex;.  }.#endif
18b80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18b90 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
18ba0 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  E.  if( IsVirtua
18bb0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  l(pTab) ){.    s
18bc0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
18bd0 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20  Parse, "virtual 
18be0 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62  tables may not b
18bf0 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20  e indexed");.   
18c00 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18c10 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e  e_index;.  }.#en
18c20 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  dif..  /*.  ** F
18c30 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ind the name of 
18c40 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65  the index.  Make
18c50 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
18c60 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68  ot already anoth
18c70 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  er.  ** index or
18c80 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
18c90 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a  same name.  .  *
18ca0 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e  *.  ** Exception
18cb0 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61  :  If we are rea
18cc0 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f  ding the names o
18cd0 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69  f permanent indi
18ce0 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ces from the.  *
18cf0 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
18d00 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73  table (because s
18d10 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
18d20 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63  s changed the sc
18d30 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f  hema) and.  ** o
18d40 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ne of the index 
18d50 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77  names collides w
18d60 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ith the name of 
18d70 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
18d80 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c  e or.  ** index,
18d90 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f   then we will co
18da0 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73  ntinue to proces
18db0 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20  s this index..  
18dc0 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65  **.  ** If pName
18dd0 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ==0 it means tha
18de0 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65  t we are.  ** de
18df0 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69  aling with a pri
18e00 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51  mary key or UNIQ
18e10 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
18e20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e  We have to inven
18e30 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e  t our.  ** own n
18e40 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
18e50 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  pName ){.    zNa
18e60 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
18e70 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
18e80 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  ame);.    if( zN
18e90 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
18ea0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18eb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
18ec0 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  me->z!=0 );.    
18ed0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
18ee0 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
18ef0 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
18f00 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ame) ){.      go
18f10 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18f20 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
18f30 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
18f40 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  sy ){.      if( 
18f50 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
18f60 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d  (db, zName, 0)!=
18f70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
18f80 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
18f90 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
18fa0 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e  lready a table n
18fb0 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29  amed %s", zName)
18fc0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
18fd0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18fe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18ff0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
19000 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
19010 6d 65 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  me, pDb->zDbSNam
19020 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)!=0 ){.      i
19030 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29  f( !ifNotExist )
19040 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
19050 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
19060 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65  , "index %s alre
19070 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61  ady exists", zNa
19080 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
19090 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
190a0 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
190b0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
190c0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
190d0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
190e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
190f0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19100 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
19110 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
19120 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f  ;.    Index *pLo
19130 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f  op;.    for(pLoo
19140 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20  p=pTab->pIndex, 
19150 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  n=1; pLoop; pLoo
19160 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20  p=pLoop->pNext, 
19170 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65  n++){}.    zName
19180 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
19190 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 75  f(db, "sqlite_au
191a0 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20  toindex_%s_%d", 
191b0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b  pTab->zName, n);
191c0 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
191d0 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
191e0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
191f0 78 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  x;.    }..    /*
19200 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   Automatic index
19210 20 6e 61 6d 65 73 20 67 65 6e 65 72 61 74 65 64   names generated
19220 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 73 71 6c   from within sql
19230 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
19240 62 28 29 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20  b().    ** must 
19250 68 61 76 65 20 6e 61 6d 65 73 20 74 68 61 74 20  have names that 
19260 61 72 65 20 64 69 73 74 69 6e 63 74 20 66 72 6f  are distinct fro
19270 6d 20 6e 6f 72 6d 61 6c 20 61 75 74 6f 6d 61 74  m normal automat
19280 69 63 20 69 6e 64 65 78 20 6e 61 6d 65 73 2e 0a  ic index names..
19290 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
192a0 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 63  wing statement c
192b0 6f 6e 76 65 72 74 73 20 22 73 71 6c 69 74 65 33  onverts "sqlite3
192c0 5f 61 75 74 6f 69 6e 64 65 78 2e 2e 2e 22 20 69  _autoindex..." i
192d0 6e 74 6f 0a 20 20 20 20 2a 2a 20 22 73 71 6c 69  nto.    ** "sqli
192e0 74 65 33 5f 62 75 74 6f 69 6e 64 65 78 2e 2e 2e  te3_butoindex...
192f0 22 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  " in order to ma
19300 6b 65 20 74 68 65 20 6e 61 6d 65 73 20 64 69 73  ke the names dis
19310 74 69 6e 63 74 2e 0a 20 20 20 20 2a 2a 20 54 68  tinct..    ** Th
19320 65 20 22 76 74 61 62 5f 65 72 72 2e 74 65 73 74  e "vtab_err.test
19330 22 20 74 65 73 74 20 64 65 6d 6f 6e 73 74 72 61  " test demonstra
19340 74 65 73 20 74 68 65 20 6e 65 65 64 20 6f 66 20  tes the need of 
19350 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 2e 20  this statement. 
19360 2a 2f 0a 20 20 20 20 69 66 28 20 49 4e 5f 44 45  */.    if( IN_DE
19370 43 4c 41 52 45 5f 56 54 41 42 20 29 20 7a 4e 61  CLARE_VTAB ) zNa
19380 6d 65 5b 37 5d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  me[7]++;.  }..  
19390 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74  /* Check for aut
193a0 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72  horization to cr
193b0 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20  eate an index.. 
193c0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
193d0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
193e0 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f  ATION.  {.    co
193f0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
19400 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 3b 0a 20  pDb->zDbSName;. 
19410 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
19420 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
19430 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
19440 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
19450 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
19460 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
19470 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
19480 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f  .    i = SQLITE_
19490 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20  CREATE_INDEX;.  
194a0 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
194b0 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69  DB && iDb==1 ) i
194c0 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
194d0 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
194e0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
194f0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c  Check(pParse, i,
19500 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e   zName, pTab->zN
19510 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
19520 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
19530 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
19540 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
19550 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69  * If pList==0, i
19560 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75  t means this rou
19570 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20  tine was called 
19580 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72  to make a primar
19590 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f  y.  ** key out o
195a0 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  f the last colum
195b0 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  n added to the t
195c0 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
195d0 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f  ruction..  ** So
195e0 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c   create a fake l
195f0 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  ist to simulate 
19600 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  this..  */.  if(
19610 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
19620 20 54 6f 6b 65 6e 20 70 72 65 76 43 6f 6c 3b 0a   Token prevCol;.
19630 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c      Column *pCol
19640 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 70   = &pTab->aCol[p
19650 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20  Tab->nCol-1];.  
19660 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
19670 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51   |= COLFLAG_UNIQ
19680 55 45 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  UE;.    sqlite3T
19690 6f 6b 65 6e 49 6e 69 74 28 26 70 72 65 76 43 6f  okenInit(&prevCo
196a0 6c 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  l, pCol->zName);
196b0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
196c0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
196d0 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20  nd(pParse, 0,.  
196e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
196f0 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
19700 20 54 4b 5f 49 44 2c 20 26 70 72 65 76 43 6f 6c   TK_ID, &prevCol
19710 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70  , 0));.    if( p
19720 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
19730 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19740 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
19750 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  ist->nExpr==1 );
19760 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
19770 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72  ListSetSortOrder
19780 28 70 4c 69 73 74 2c 20 73 6f 72 74 4f 72 64 65  (pList, sortOrde
19790 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
197a0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
197b0 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72  CheckLength(pPar
197c0 73 65 2c 20 70 4c 69 73 74 2c 20 22 69 6e 64 65  se, pList, "inde
197d0 78 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  x");.  }..  /* F
197e0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
197f0 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ny bytes of spac
19800 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  e are required t
19810 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74  o store explicit
19820 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65  ly.  ** specifie
19830 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
19840 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f  ence names..  */
19850 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
19860 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
19870 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
19880 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
19890 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
198a0 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  t( pExpr!=0 );. 
198b0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
198c0 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a  ==TK_COLLATE ){.
198d0 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20        nExtra += 
198e0 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c  (1 + sqlite3Strl
198f0 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54  en30(pExpr->u.zT
19900 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20  oken));.    }.  
19910 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c  }..  /* .  ** Al
19920 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
19930 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a   structure. .  *
19940 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  nName = sqli
19950 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
19960 65 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20  e);.  nExtraCol 
19970 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65  = pPk ? pPk->nKe
19980 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70 49 6e 64  yCol : 1;.  pInd
19990 65 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f  ex = sqlite3Allo
199a0 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  cateIndexObject(
199b0 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  db, pList->nExpr
199c0 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20   + nExtraCol,.  
199d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199f0 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74      nName + nExt
19a00 72 61 20 2b 20 31 2c 20 26 7a 45 78 74 72 61 29  ra + 1, &zExtra)
19a10 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
19a20 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
19a30 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19a40 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73  _index;.  }.  as
19a50 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
19a60 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65  _ALIGNMENT(pInde
19a70 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 29 20  x->aiRowLogEst) 
19a80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
19a90 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
19aa0 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  T(pIndex->azColl
19ab0 29 20 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a  ) );.  pIndex->z
19ac0 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20  Name = zExtra;. 
19ad0 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65   zExtra += nName
19ae0 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70   + 1;.  memcpy(p
19af0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Index->zName, zN
19b00 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20  ame, nName+1);. 
19b10 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20   pIndex->pTable 
19b20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78  = pTab;.  pIndex
19b30 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38 29  ->onError = (u8)
19b40 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65  onError;.  pInde
19b50 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d  x->uniqNotNull =
19b60 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e   onError!=OE_Non
19b70 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 64 78  e;.  pIndex->idx
19b80 54 79 70 65 20 3d 20 69 64 78 54 79 70 65 3b 0a  Type = idxType;.
19b90 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d    pIndex->pSchem
19ba0 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
19bb0 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e 64  .pSchema;.  pInd
19bc0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c  ex->nKeyCol = pL
19bd0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66  ist->nExpr;.  if
19be0 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20 20  ( pPIWhere ){.  
19bf0 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
19c00 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50  SelfReference(pP
19c10 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 50  arse, pTab, NC_P
19c20 61 72 74 49 64 78 2c 20 70 50 49 57 68 65 72 65  artIdx, pPIWhere
19c30 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65 78  , 0);.    pIndex
19c40 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 20  ->pPartIdxWhere 
19c50 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20 20  = pPIWhere;.    
19c60 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  pPIWhere = 0;.  
19c70 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  }.  assert( sqli
19c80 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
19c90 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
19ca0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
19cb0 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c   see if we shoul
19cc0 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71  d honor DESC req
19cd0 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63  uests on index c
19ce0 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66  olumns.  */.  if
19cf0 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
19d00 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
19d10 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
19d20 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48  ask = -1;   /* H
19d30 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d  onor DESC */.  }
19d40 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72  else{.    sortOr
19d50 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  derMask = 0;    
19d60 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a  /* Ignore DESC *
19d70 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c  /.  }..  /* Anal
19d80 79 7a 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20  yze the list of 
19d90 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
19da0 20 66 6f 72 6d 20 74 68 65 20 74 65 72 6d 73 20   form the terms 
19db0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
19dc0 0a 20 20 2a 2a 20 72 65 70 6f 72 74 20 61 6e 79  .  ** report any
19dd0 20 65 72 72 6f 72 73 2e 20 20 49 6e 20 74 68 65   errors.  In the
19de0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
19df0 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  re the expressio
19e00 6e 20 69 73 20 65 78 61 63 74 6c 79 0a 20 20 2a  n is exactly.  *
19e10 2a 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  * a table column
19e20 2c 20 73 74 6f 72 65 20 74 68 61 74 20 63 6f 6c  , store that col
19e30 75 6d 6e 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b  umn in aiColumn[
19e40 5d 2e 20 20 46 6f 72 20 67 65 6e 65 72 61 6c 20  ].  For general 
19e50 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 20 20 2a  expressions,.  *
19e60 2a 20 70 6f 70 75 6c 61 74 65 20 70 49 6e 64 65  * populate pInde
19e70 78 2d 3e 61 43 6f 6c 45 78 70 72 20 61 6e 64 20  x->aColExpr and 
19e80 73 74 6f 72 65 20 58 4e 5f 45 58 50 52 20 28 2d  store XN_EXPR (-
19e90 32 29 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d  2) in aiColumn[]
19ea0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f  ..  **.  ** TODO
19eb0 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e  : Issue a warnin
19ec0 67 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  g if two or more
19ed0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
19ee0 69 6e 64 65 78 20 61 72 65 20 69 64 65 6e 74 69  index are identi
19ef0 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20  cal..  ** TODO: 
19f00 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20  Issue a warning 
19f10 69 66 20 74 68 65 20 74 61 62 6c 65 20 70 72 69  if the table pri
19f20 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73 65 64  mary key is used
19f30 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   as part of the.
19f40 20 20 2a 2a 20 69 6e 64 65 78 20 6b 65 79 2e 0a    ** index key..
19f50 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
19f60 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d  pListItem=pList-
19f70 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  >a; i<pList->nEx
19f80 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74  pr; i++, pListIt
19f90 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
19fa0 2a 70 43 45 78 70 72 3b 20 20 20 20 20 20 20 20  *pCExpr;        
19fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19fc0 20 69 2d 74 68 20 69 6e 64 65 78 20 65 78 70 72   i-th index expr
19fd0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e  ession */.    in
19fe0 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  t requestedSortO
19ff0 72 64 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  rder;        /* 
1a000 41 53 43 20 6f 72 20 44 45 53 43 20 6f 6e 20 74  ASC or DESC on t
1a010 68 65 20 69 2d 74 68 20 65 78 70 72 65 73 73 69  he i-th expressi
1a020 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  on */.    const 
1a030 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20  char *zColl;    
1a040 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
1a050 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
1a060 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69  ame */..    sqli
1a070 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70 4c  te3StringToId(pL
1a080 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  istItem->pExpr);
1a090 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
1a0a0 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65  lveSelfReference
1a0b0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e  (pParse, pTab, N
1a0c0 43 5f 49 64 78 45 78 70 72 2c 20 70 4c 69 73 74  C_IdxExpr, pList
1a0d0 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b  Item->pExpr, 0);
1a0e0 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
1a0f0 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69  >nErr ) goto exi
1a100 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1a110 20 20 20 20 70 43 45 78 70 72 20 3d 20 73 71 6c      pCExpr = sql
1a120 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
1a130 61 74 65 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70  ate(pListItem->p
1a140 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
1a150 43 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  CExpr->op!=TK_CO
1a160 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69 66  LUMN ){.      if
1a170 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e  ( pTab==pParse->
1a180 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20  pNewTable ){.   
1a190 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1a1a0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65 78  rMsg(pParse, "ex
1a1b0 70 72 65 73 73 69 6f 6e 73 20 70 72 6f 68 69 62  pressions prohib
1a1c0 69 74 65 64 20 69 6e 20 50 52 49 4d 41 52 59 20  ited in PRIMARY 
1a1d0 4b 45 59 20 61 6e 64 20 22 0a 20 20 20 20 20 20  KEY and ".      
1a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1f0 20 20 20 20 20 20 20 20 20 20 22 55 4e 49 51 55            "UNIQU
1a200 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b  E constraints");
1a210 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
1a220 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1a230 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1a240 66 28 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45  f( pIndex->aColE
1a250 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  xpr==0 ){.      
1a260 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 6f 70    ExprList *pCop
1a270 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
1a280 69 73 74 44 75 70 28 64 62 2c 20 70 4c 69 73 74  istDup(db, pList
1a290 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 49  , 0);.        pI
1a2a0 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 3d  ndex->aColExpr =
1a2b0 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20   pCopy;.        
1a2c0 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
1a2d0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
1a2e0 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 70 79     assert( pCopy
1a2f0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
1a300 20 70 4c 69 73 74 49 74 65 6d 20 3d 20 26 70 43   pListItem = &pC
1a310 6f 70 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  opy->a[i];.     
1a320 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1a330 20 20 20 6a 20 3d 20 58 4e 5f 45 58 50 52 3b 0a     j = XN_EXPR;.
1a340 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69        pIndex->ai
1a350 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 45  Column[i] = XN_E
1a360 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65  XPR;.      pInde
1a370 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d  x->uniqNotNull =
1a380 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1a390 20 20 20 20 20 6a 20 3d 20 70 43 45 78 70 72 2d       j = pCExpr-
1a3a0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
1a3b0 61 73 73 65 72 74 28 20 6a 3c 3d 30 78 37 66 66  assert( j<=0x7ff
1a3c0 66 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  f );.      if( j
1a3d0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20  <0 ){.        j 
1a3e0 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
1a3f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1a400 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74  Tab->aCol[j].not
1a410 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Null==0 ){.     
1a420 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e     pIndex->uniqN
1a430 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  otNull = 0;.    
1a440 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78    }.      pIndex
1a450 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
1a460 28 69 31 36 29 6a 3b 0a 20 20 20 20 7d 0a 20 20  (i16)j;.    }.  
1a470 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20    zColl = 0;.   
1a480 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e   if( pListItem->
1a490 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
1a4a0 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  LLATE ){.      i
1a4b0 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  nt nColl;.      
1a4c0 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65  zColl = pListIte
1a4d0 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  m->pExpr->u.zTok
1a4e0 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20  en;.      nColl 
1a4f0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1a500 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20  0(zColl) + 1;.  
1a510 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74      assert( nExt
1a520 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20  ra>=nColl );.   
1a530 20 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61     memcpy(zExtra
1a540 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b  , zColl, nColl);
1a550 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a  .      zColl = z
1a560 45 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78  Extra;.      zEx
1a570 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20  tra += nColl;.  
1a580 20 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43      nExtra -= nC
1a590 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oll;.    }else i
1a5a0 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( j>=0 ){.     
1a5b0 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61   zColl = pTab->a
1a5c0 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[j].zColl;.  
1a5d0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 43 6f    }.    if( !zCo
1a5e0 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  ll ) zColl = sql
1a5f0 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20  ite3StrBINARY;. 
1a600 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
1a610 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69 74 65  .busy && !sqlite
1a620 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
1a630 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Parse, zColl) ){
1a640 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1a650 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1a660 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
1a670 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f  >azColl[i] = zCo
1a680 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65  ll;.    requeste
1a690 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69  dSortOrder = pLi
1a6a0 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  stItem->sortOrde
1a6b0 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73  r & sortOrderMas
1a6c0 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  k;.    pIndex->a
1a6d0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28  SortOrder[i] = (
1a6e0 75 38 29 72 65 71 75 65 73 74 65 64 53 6f 72 74  u8)requestedSort
1a6f0 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Order;.  }..  /*
1a700 20 41 70 70 65 6e 64 20 74 68 65 20 74 61 62 6c   Append the tabl
1a710 65 20 6b 65 79 20 74 6f 20 74 68 65 20 65 6e 64  e key to the end
1a720 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
1a730 46 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  For WITHOUT ROWI
1a740 44 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 28 77  D.  ** tables (w
1a750 68 65 6e 20 70 50 6b 21 3d 30 29 20 74 68 69 73  hen pPk!=0) this
1a760 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64 65 63   will be the dec
1a770 6c 61 72 65 64 20 50 52 49 4d 41 52 59 20 4b 45  lared PRIMARY KE
1a780 59 2e 20 20 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72  Y.  For.  ** nor
1a790 6d 61 6c 20 74 61 62 6c 65 73 20 28 77 68 65 6e  mal tables (when
1a7a0 20 70 50 6b 3d 3d 30 29 20 74 68 69 73 20 77 69   pPk==0) this wi
1a7b0 6c 6c 20 62 65 20 74 68 65 20 72 6f 77 69 64 2e  ll be the rowid.
1a7c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 6b 20  .  */.  if( pPk 
1a7d0 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ){.    for(j=0; 
1a7e0 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  j<pPk->nKeyCol; 
1a7f0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  j++){.      int 
1a800 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  x = pPk->aiColum
1a810 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  n[j];.      asse
1a820 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20  rt( x>=0 );.    
1a830 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28    if( hasColumn(
1a840 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1a850 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  , pIndex->nKeyCo
1a860 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20 20 20 20  l, x) ){.       
1a870 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
1a880 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73 65  --; .      }else
1a890 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
1a8a0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
1a8b0 78 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  x;.        pInde
1a8c0 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70  x->azColl[i] = p
1a8d0 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20  Pk->azColl[j];. 
1a8e0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
1a8f0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
1a900 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  Pk->aSortOrder[j
1a910 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  ];.        i++;.
1a920 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a930 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 6e    assert( i==pIn
1a940 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  dex->nColumn );.
1a950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
1a960 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
1a970 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20   = XN_ROWID;.   
1a980 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1a990 69 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  i] = sqlite3StrB
1a9a0 49 4e 41 52 59 3b 0a 20 20 7d 0a 20 20 73 71 6c  INARY;.  }.  sql
1a9b0 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
1a9c0 74 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28  t(pIndex);.  if(
1a9d0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
1a9e0 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d 61 74 65  le==0 ) estimate
1a9f0 49 6e 64 65 78 57 69 64 74 68 28 70 49 6e 64 65  IndexWidth(pInde
1aa00 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  x);..  /* If thi
1aa10 73 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73  s index contains
1aa20 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66   every column of
1aa30 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68 65 6e   its table, then
1aa40 20 6d 61 72 6b 0a 20 20 2a 2a 20 69 74 20 61 73   mark.  ** it as
1aa50 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
1aa60 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 48  x */.  assert( H
1aa70 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 0a 20  asRowid(pTab) . 
1aa80 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 69 50       || pTab->iP
1aa90 4b 65 79 3c 30 20 7c 7c 20 73 71 6c 69 74 65 33  Key<0 || sqlite3
1aaa0 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
1aab0 6e 64 65 78 2c 20 70 54 61 62 2d 3e 69 50 4b 65  ndex, pTab->iPKe
1aac0 79 29 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  y)>=0 );.  if( p
1aad0 54 62 6c 4e 61 6d 65 21 3d 30 20 26 26 20 70 49  TblName!=0 && pI
1aae0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70  ndex->nColumn>=p
1aaf0 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
1ab00 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72   pIndex->isCover
1ab10 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72  ing = 1;.    for
1ab20 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
1ab30 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
1ab40 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b  if( j==pTab->iPK
1ab50 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ey ) continue;. 
1ab60 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1ab70 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
1ab80 6e 64 65 78 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e  ndex,j)>=0 ) con
1ab90 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 49 6e  tinue;.      pIn
1aba0 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  dex->isCovering 
1abb0 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
1abc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1abd0 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d  f( pTab==pParse-
1abe0 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20  >pNewTable ){.  
1abf0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
1ac00 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  e has been calle
1ac10 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61  d to create an a
1ac20 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61  utomatic index a
1ac30 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  s a.    ** resul
1ac40 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b  t of a PRIMARY K
1ac50 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
1ac60 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20  use on a column 
1ac70 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20  definition, or. 
1ac80 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20     ** a PRIMARY 
1ac90 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
1aca0 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ause following t
1acb0 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69  he column defini
1acc0 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e  tions..    ** i.
1acd0 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a  e. one of:.    *
1ace0 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  *.    ** CREATE 
1acf0 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52  TABLE t(x PRIMAR
1ad00 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a  Y KEY, y);.    *
1ad10 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
1ad20 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c  (x, y, UNIQUE(x,
1ad30 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20   y));.    **.   
1ad40 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20   ** Either way, 
1ad50 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
1ad60 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
1ad70 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e  y has such an in
1ad80 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73  dex. If.    ** s
1ad90 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20  o, don't bother 
1ada0 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e  creating this on
1adb0 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70  e. This only app
1adc0 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61  lies to.    ** a
1add0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65  utomatically cre
1ade0 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73  ated indices. Us
1adf0 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68  ers can do as th
1ae00 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20  ey wish with.   
1ae10 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64   ** explicit ind
1ae20 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ices..    **.   
1ae30 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f   ** Two UNIQUE o
1ae40 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
1ae50 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f  nstraints are co
1ae60 6e 73 69 64 65 72 65 64 20 65 71 75 69 76 61 6c  nsidered equival
1ae70 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20  ent.    ** (and 
1ae80 74 68 75 73 20 73 75 70 70 72 65 73 73 69 6e 67  thus suppressing
1ae90 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29   the second one)
1aea0 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 68 61   even if they ha
1aeb0 76 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20  ve different.   
1aec0 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e   ** sort orders.
1aed0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1aee0 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66  f there are diff
1aef0 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20  erent collating 
1af00 73 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20  sequences or if 
1af10 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20  the columns of. 
1af20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72     ** the constr
1af30 61 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69  aint occur in di
1af40 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20  fferent orders, 
1af50 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61  then the constra
1af60 69 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  ints are.    ** 
1af70 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74 69  considered disti
1af80 6e 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73  nct and both res
1af90 75 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65 20  ult in separate 
1afa0 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a  indices..    */.
1afb0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
1afc0 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
1afd0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
1afe0 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
1aff0 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  xt){.      int k
1b000 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1b010 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
1b020 64 78 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  dx) );.      ass
1b030 65 72 74 28 20 70 49 64 78 2d 3e 69 64 78 54 79  ert( pIdx->idxTy
1b040 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe!=SQLITE_IDXTY
1b050 50 45 5f 41 50 50 44 45 46 20 29 3b 0a 20 20 20  PE_APPDEF );.   
1b060 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e 69     assert( IsUni
1b070 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  queIndex(pIndex)
1b080 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70   );..      if( p
1b090 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49  Idx->nKeyCol!=pI
1b0a0 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20  ndex->nKeyCol ) 
1b0b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1b0c0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d  for(k=0; k<pIdx-
1b0d0 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a  >nKeyCol; k++){.
1b0e0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1b0f0 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20  ar *z1;.        
1b100 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a  const char *z2;.
1b110 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1b120 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
1b130 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ]>=0 );.        
1b140 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
1b150 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61  mn[k]!=pIndex->a
1b160 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65  iColumn[k] ) bre
1b170 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d  ak;.        z1 =
1b180 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d   pIdx->azColl[k]
1b190 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70  ;.        z2 = p
1b1a0 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d  Index->azColl[k]
1b1b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
1b1c0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c  lite3StrICmp(z1,
1b1d0 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20   z2) ) break;.  
1b1e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1b1f0 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  k==pIdx->nKeyCol
1b200 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1b210 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70  pIdx->onError!=p
1b220 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29  Index->onError )
1b230 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
1b240 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  his constraint c
1b250 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20  reates the same 
1b260 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69  index as a previ
1b270 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ous.          **
1b280 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63   constraint spec
1b290 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20  ified somewhere 
1b2a0 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41  in the CREATE TA
1b2b0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  BLE statement.. 
1b2c0 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65           ** Howe
1b2d0 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c  ver the ON CONFL
1b2e0 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20  ICT clauses are 
1b2f0 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f  different. If bo
1b300 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  th this .       
1b310 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
1b320 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75   and the previou
1b330 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e  s equivalent con
1b340 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70  straint have exp
1b350 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20  licit.          
1b360 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ** ON CONFLICT c
1b370 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61  lauses this is a
1b380 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69  n error. Otherwi
1b390 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20  se, use the.    
1b3a0 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69        ** explici
1b3b0 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65  tly specified be
1b3c0 68 61 76 69 6f 72 20 66 6f 72 20 74 68 65 20 69  havior for the i
1b3d0 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20  ndex..          
1b3e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1b3f0 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72   !(pIdx->onError
1b400 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20  ==OE_Default || 
1b410 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
1b420 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a  =OE_Default) ){.
1b430 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1b440 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1b450 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
1b460 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e       "conflictin
1b470 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  g ON CONFLICT cl
1b480 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22  auses specified"
1b490 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1b4a0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
1b4b0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
1b4c0 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  E_Default ){.   
1b4d0 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f           pIdx->o
1b4e0 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d  nError = pIndex-
1b4f0 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  >onError;.      
1b500 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1b510 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78 54          if( idxT
1b520 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54  ype==SQLITE_IDXT
1b530 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29  YPE_PRIMARYKEY )
1b540 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 20 3d   pIdx->idxType =
1b550 20 69 64 78 54 79 70 65 3b 0a 20 20 20 20 20 20   idxType;.      
1b560 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1b570 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
1b580 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1b590 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49  * Link the new I
1b5a0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74  ndex structure t
1b5b0 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20  o its table and 
1b5c0 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a  to the other.  *
1b5d0 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
1b5e0 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e  base structures.
1b5f0 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   .  */.  assert(
1b600 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
1b610 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   );.  if( db->in
1b620 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49  it.busy ){.    I
1b630 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 61 73 73  ndex *p;.    ass
1b640 65 72 74 28 20 21 49 4e 5f 44 45 43 4c 41 52 45  ert( !IN_DECLARE
1b650 5f 56 54 41 42 20 29 3b 0a 20 20 20 20 61 73 73  _VTAB );.    ass
1b660 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
1b670 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
1b680 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  0, pIndex->pSche
1b690 6d 61 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73  ma) );.    p = s
1b6a0 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
1b6b0 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  (&pIndex->pSchem
1b6c0 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20  a->idxHash, .   
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6e0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
1b6f0 4e 61 6d 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20  Name, pIndex);. 
1b700 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
1b710 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e    assert( p==pIn
1b720 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  dex );  /* Mallo
1b730 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
1b740 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ed */.      sqli
1b750 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
1b760 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1b770 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1b780 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 44 62     }.    db->mDb
1b790 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f  Flags |= DBFLAG_
1b7a0 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20  SchemaChange;.  
1b7b0 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d    if( pTblName!=
1b7c0 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  0 ){.      pInde
1b7d0 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  x->tnum = db->in
1b7e0 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20  it.newTnum;.    
1b7f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
1b800 68 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69  his is the initi
1b810 61 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  al CREATE INDEX 
1b820 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 43 52  statement (or CR
1b830 45 41 54 45 20 54 41 42 4c 45 20 69 66 20 74 68  EATE TABLE if th
1b840 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20  e.  ** index is 
1b850 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78  an implied index
1b860 20 66 6f 72 20 61 20 55 4e 49 51 55 45 20 6f 72   for a UNIQUE or
1b870 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
1b880 73 74 72 61 69 6e 74 29 20 74 68 65 6e 0a 20 20  straint) then.  
1b890 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20 74 6f 20  ** emit code to 
1b8a0 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  allocate the ind
1b8b0 65 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64  ex rootpage on d
1b8c0 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20  isk and make an 
1b8d0 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 74  entry for.  ** t
1b8e0 68 65 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20  he index in the 
1b8f0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
1b900 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ble and populate
1b910 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 0a   the index with.
1b920 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 42    ** content.  B
1b930 75 74 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  ut, do not do th
1b940 69 73 20 69 66 20 77 65 20 61 72 65 20 73 69 6d  is if we are sim
1b950 70 6c 79 20 72 65 61 64 69 6e 67 20 74 68 65 20  ply reading the 
1b960 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20  sqlite_master.  
1b970 2a 2a 20 74 61 62 6c 65 20 74 6f 20 70 61 72 73  ** table to pars
1b980 65 20 74 68 65 20 73 63 68 65 6d 61 2c 20 6f 72  e the schema, or
1b990 20 69 66 20 74 68 69 73 20 69 6e 64 65 78 20 69   if this index i
1b9a0 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  s the PRIMARY KE
1b9b0 59 20 69 6e 64 65 78 0a 20 20 2a 2a 20 6f 66 20  Y index.  ** of 
1b9c0 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
1b9d0 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  table..  **.  **
1b9e0 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   If pTblName==0 
1b9f0 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e  it means this in
1ba00 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64  dex is generated
1ba10 20 61 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 50   as an implied P
1ba20 52 49 4d 41 52 59 20 4b 45 59 0a 20 20 2a 2a 20  RIMARY KEY.  ** 
1ba30 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20  or UNIQUE index 
1ba40 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
1ba50 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69  E statement.  Si
1ba60 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  nce the table.  
1ba70 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ** has just been
1ba80 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e   created, it con
1ba90 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e  tains no data an
1baa0 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74  d the index init
1bab0 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
1bac0 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70  step can be skip
1bad0 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  ped..  */.  else
1bae0 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
1baf0 61 62 29 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 21  ab) || pTblName!
1bb00 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =0 ){.    Vdbe *
1bb10 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  v;.    char *zSt
1bb20 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d  mt;.    int iMem
1bb30 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1bb40 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  m;..    v = sqli
1bb50 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1bb60 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
1bb70 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
1bb80 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20  ate_index;..    
1bb90 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
1bba0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
1bbb0 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 20 20 20  e, 1, iDb);..   
1bbc0 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72   /* Create the r
1bbd0 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20  ootpage for the 
1bbe0 69 6e 64 65 78 20 75 73 69 6e 67 20 43 72 65 61  index using Crea
1bbf0 74 65 49 6e 64 65 78 2e 20 42 75 74 20 62 65 66  teIndex. But bef
1bc00 6f 72 65 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67  ore.    ** doing
1bc10 20 73 6f 2c 20 63 6f 64 65 20 61 20 4e 6f 6f 70   so, code a Noop
1bc20 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64   instruction and
1bc30 20 73 74 6f 72 65 20 69 74 73 20 61 64 64 72 65   store its addre
1bc40 73 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 49 6e  ss in .    ** In
1bc50 64 65 78 2e 74 6e 75 6d 2e 20 54 68 69 73 20 69  dex.tnum. This i
1bc60 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63 61  s required in ca
1bc70 73 65 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  se this index is
1bc80 20 61 63 74 75 61 6c 6c 79 20 61 20 0a 20 20 20   actually a .   
1bc90 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
1bca0 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 69 73  and the table is
1bcb0 20 61 63 74 75 61 6c 6c 79 20 61 20 57 49 54 48   actually a WITH
1bcc0 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e  OUT ROWID table.
1bcd0 20 49 6e 20 0a 20 20 20 20 2a 2a 20 74 68 61 74   In .    ** that
1bce0 20 63 61 73 65 20 74 68 65 20 63 6f 6e 76 65 72   case the conver
1bcf0 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54  tToWithoutRowidT
1bd00 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 20 77  able() routine w
1bd10 69 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20 20 20  ill replace.    
1bd20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69 74 68  ** the Noop with
1bd30 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20   a Goto to jump 
1bd40 6f 76 65 72 20 74 68 65 20 56 44 42 45 20 63 6f  over the VDBE co
1bd50 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 65 6c  de generated bel
1bd60 6f 77 2e 20 2a 2f 0a 20 20 20 20 70 49 6e 64 65  ow. */.    pInde
1bd70 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65  x->tnum = sqlite
1bd80 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
1bd90 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 73 71 6c  P_Noop);.    sql
1bda0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1bdb0 2c 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65  , OP_CreateBtree
1bdc0 2c 20 69 44 62 2c 20 69 4d 65 6d 2c 20 42 54 52  , iDb, iMem, BTR
1bdd0 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a 0a 20 20  EE_BLOBKEY);..  
1bde0 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20    /* Gather the 
1bdf0 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
1be00 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
1be10 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f  X statement into
1be20 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d  .    ** the zStm
1be30 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  t variable.    *
1be40 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  /.    if( pStart
1be50 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   ){.      int n 
1be60 3d 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e  = (int)(pParse->
1be70 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70  sLastToken.z - p
1be80 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73  Name->z) + pPars
1be90 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b  e->sLastToken.n;
1bea0 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65  .      if( pName
1beb0 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20  ->z[n-1]==';' ) 
1bec0 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20  n--;.      /* A 
1bed0 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68  named index with
1bee0 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45   an explicit CRE
1bef0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
1bf00 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  ent */.      zSt
1bf10 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
1bf20 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54 45 25  ntf(db, "CREATE%
1bf30 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20  s INDEX %.*s",. 
1bf40 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d         onError==
1bf50 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22  OE_None ? "" : "
1bf60 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20 70 4e 61   UNIQUE", n, pNa
1bf70 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  me->z);.    }els
1bf80 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61  e{.      /* An a
1bf90 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63  utomatic index c
1bfa0 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d  reated by a PRIM
1bfb0 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
1bfc0 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  E constraint */.
1bfd0 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d        /* zStmt =
1bfe0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1bff0 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ""); */.      zS
1c000 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  tmt = 0;.    }..
1c010 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e      /* Add an en
1c020 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61  try in sqlite_ma
1c030 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e  ster for this in
1c040 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  dex.    */.    s
1c050 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
1c060 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
1c070 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
1c080 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e  %Q.%s VALUES('in
1c090 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25  dex',%Q,%Q,#%d,%
1c0a0 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62  Q);",.        db
1c0b0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
1c0c0 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45  ame, MASTER_NAME
1c0d0 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ,.        pIndex
1c0e0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
1c0f0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
1c100 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20        iMem,.    
1c110 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b      zStmt.    );
1c120 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1c130 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a  ee(db, zStmt);..
1c140 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20      /* Fill the 
1c150 69 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20  index with data 
1c160 61 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20  and reparse the 
1c170 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20  schema. Code an 
1c180 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a 2a  OP_Expire.    **
1c190 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61   to invalidate a
1c1a0 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20  ll pre-compiled 
1c1b0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20  statements..    
1c1c0 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e  */.    if( pTblN
1c1d0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ame ){.      sql
1c1e0 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
1c1f0 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
1c200 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  iMem);.      sql
1c210 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
1c220 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
1c230 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c240 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70  AddParseSchemaOp
1c250 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  (v, iDb,.       
1c260 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
1c270 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20  (db, "name='%q' 
1c280 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27  AND type='index'
1c290 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ", pIndex->zName
1c2a0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
1c2b0 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
1c2c0 50 5f 45 78 70 69 72 65 29 3b 0a 20 20 20 20 7d  P_Expire);.    }
1c2d0 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
1c2e0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
1c2f0 64 65 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 7d 0a  dex->tnum);.  }.
1c300 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e  .  /* When addin
1c310 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68  g an index to th
1c320 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65  e list of indice
1c330 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d  s for a table, m
1c340 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c  ake.  ** sure al
1c350 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65  l indices labele
1c360 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d  d OE_Replace com
1c370 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73  e after all thos
1c380 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f  e labeled.  ** O
1c390 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20  E_Ignore.  This 
1c3a0 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
1c3b0 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6e   the correct con
1c3c0 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a 20 20  straint check.  
1c3d0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 28 69  ** processing (i
1c3e0 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74  n sqlite3Generat
1c3f0 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b  eConstraintCheck
1c400 73 28 29 29 20 61 73 20 70 61 72 74 20 6f 66 0a  s()) as part of.
1c410 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e 64 20    ** UPDATE and 
1c420 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
1c430 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  s.  .  */.  if( 
1c440 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
1c450 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a   pTblName==0 ){.
1c460 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21      if( onError!
1c470 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70  =OE_Replace || p
1c480 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20  Tab->pIndex==0. 
1c490 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d          || pTab-
1c4a0 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  >pIndex->onError
1c4b0 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20  ==OE_Replace){. 
1c4c0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
1c4d0 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  xt = pTab->pInde
1c4e0 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70  x;.      pTab->p
1c4f0 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
1c500 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c510 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d   Index *pOther =
1c520 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
1c530 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68       while( pOth
1c540 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74  er->pNext && pOt
1c550 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72  her->pNext->onEr
1c560 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
1c570 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65  ){.        pOthe
1c580 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  r = pOther->pNex
1c590 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1c5a0 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
1c5b0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
1c5c0 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e        pOther->pN
1c5d0 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  ext = pIndex;.  
1c5e0 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20 3d    }.    pIndex =
1c5f0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c   0;.  }..  /* Cl
1c600 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78  ean up before ex
1c610 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72  iting */.exit_cr
1c620 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66  eate_index:.  if
1c630 28 20 70 49 6e 64 65 78 20 29 20 66 72 65 65 49  ( pIndex ) freeI
1c640 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
1c650 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
1c660 65 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68 65  elete(db, pPIWhe
1c670 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  re);.  sqlite3Ex
1c680 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
1c690 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74   pList);.  sqlit
1c6a0 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
1c6b0 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  db, pTblName);. 
1c6c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1c6d0 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  b, zName);.}../*
1c6e0 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64  .** Fill the Ind
1c6f0 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72  ex.aiRowEst[] ar
1c700 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74  ray with default
1c710 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69   information - i
1c720 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f  nformation.** to
1c730 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65   be used when we
1c740 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68   have not run th
1c750 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e  e ANALYZE comman
1c760 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73  d..**.** aiRowEs
1c770 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 64  t[0] is supposed
1c780 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1c790 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
1c7a0 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ts in the index.
1c7b0 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20  .** Since we do 
1c7c0 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20  not know, guess 
1c7d0 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f  1 million.  aiRo
1c7e0 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73  wEst[1] is an es
1c7f0 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a  timate of the.**
1c800 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1c810 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  in the table tha
1c820 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
1c830 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20  icular value of 
1c840 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c  the.** first col
1c850 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
1c860 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69  .  aiRowEst[2] i
1c870 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
1c880 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
1c890 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63  f rows that matc
1c8a0 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  h any particular
1c8b0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
1c8c0 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75  the first 2 colu
1c8d0 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e  mns.** of the in
1c8e0 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  dex.  And so for
1c8f0 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77  th.  It must alw
1c900 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20  ays be the case 
1c910 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20  that.*.**       
1c920 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c      aiRowEst[N]<
1c930 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a  =aiRowEst[N-1].*
1c940 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
1c950 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a  wEst[N]>=1.**.**
1c960 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74   Apart from that
1c970 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65  , we have little
1c980 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65   to go on beside
1c990 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74  s intuition as t
1c9a0 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73  o.** how aiRowEs
1c9b0 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  t[] should be in
1c9c0 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20  itialized.  The 
1c9d0 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65  numbers generate
1c9e0 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61  d here.** are ba
1c9f0 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76  sed on typical v
1ca00 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61  alues found in a
1ca10 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a  ctual indices..*
1ca20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
1ca30 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65  faultRowEst(Inde
1ca40 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20  x *pIdx){.  /*  
1ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 30                10
1ca60 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c 20 20 36  ,  9,  8,  7,  6
1ca70 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56 61   */.  LogEst aVa
1ca80 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20  l[] = { 33, 32, 
1ca90 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20  30, 28, 26 };.  
1caa0 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70 49 64 78  LogEst *a = pIdx
1cab0 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  ->aiRowLogEst;. 
1cac0 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e   int nCopy = MIN
1cad0 28 41 72 72 61 79 53 69 7a 65 28 61 56 61 6c 29  (ArraySize(aVal)
1cae0 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29  , pIdx->nKeyCol)
1caf0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  ;.  int i;..  /*
1cb00 20 49 6e 64 65 78 65 73 20 77 69 74 68 20 64 65   Indexes with de
1cb10 66 61 75 6c 74 20 72 6f 77 20 65 73 74 69 6d 61  fault row estima
1cb20 74 65 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68  tes should not h
1cb30 61 76 65 20 73 74 61 74 31 20 64 61 74 61 20 2a  ave stat1 data *
1cb40 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 49 64  /.  assert( !pId
1cb50 78 2d 3e 68 61 73 53 74 61 74 31 20 29 3b 0a 0a  x->hasStat1 );..
1cb60 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72    /* Set the fir
1cb70 73 74 20 65 6e 74 72 79 20 28 6e 75 6d 62 65 72  st entry (number
1cb80 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1cb90 69 6e 64 65 78 29 20 74 6f 20 74 68 65 20 65 73  index) to the es
1cba0 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e 75  timated .  ** nu
1cbb0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
1cbc0 74 68 65 20 74 61 62 6c 65 2c 20 6f 72 20 68 61  the table, or ha
1cbd0 6c 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  lf the number of
1cbe0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
1cbf0 6c 65 0a 20 20 2a 2a 20 66 6f 72 20 61 20 70 61  le.  ** for a pa
1cc00 72 74 69 61 6c 20 69 6e 64 65 78 2e 20 20 20 42  rtial index.   B
1cc10 75 74 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68  ut do not let th
1cc20 65 20 65 73 74 69 6d 61 74 65 20 64 72 6f 70 20  e estimate drop 
1cc30 62 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20 20 61  below 10. */.  a
1cc40 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  [0] = pIdx->pTab
1cc50 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a  le->nRowLogEst;.
1cc60 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72    if( pIdx->pPar
1cc70 74 49 64 78 57 68 65 72 65 21 3d 30 20 29 20 61  tIdxWhere!=0 ) a
1cc80 5b 30 5d 20 2d 3d 20 31 30 3b 20 20 61 73 73 65  [0] -= 10;  asse
1cc90 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 10==sqlite3L
1cca0 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 69 66  ogEst(2) );.  if
1ccb0 28 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d  ( a[0]<33 ) a[0]
1ccc0 20 3d 20 33 33 3b 20 20 20 20 20 20 20 20 20 20   = 33;          
1ccd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1cce0 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  33==sqlite3LogEs
1ccf0 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45  t(10) );..  /* E
1cd00 73 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b 31  stimate that a[1
1cd10 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69 73  ] is 10, a[2] is
1cd20 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20 61   9, a[3] is 8, a
1cd30 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20 69  [4] is 7, a[5] i
1cd40 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61 63  s.  ** 6 and eac
1cd50 68 20 73 75 62 73 65 71 75 65 6e 74 20 76 61 6c  h subsequent val
1cd60 75 65 20 28 69 66 20 61 6e 79 29 20 69 73 20 35  ue (if any) is 5
1cd70 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26  .  */.  memcpy(&
1cd80 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70  a[1], aVal, nCop
1cd90 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29  y*sizeof(LogEst)
1cda0 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79  );.  for(i=nCopy
1cdb0 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65  +1; i<=pIdx->nKe
1cdc0 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
1cdd0 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20 20  a[i] = 23;      
1cde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1cdf0 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74 65  sert( 23==sqlite
1ce00 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20 20  3LogEst(5) );.  
1ce10 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  }..  assert( 0==
1ce20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29  sqlite3LogEst(1)
1ce30 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71   );.  if( IsUniq
1ce40 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 20  ueIndex(pIdx) ) 
1ce50 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d  a[pIdx->nKeyCol]
1ce60 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
1ce70 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1ce80 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
1ce90 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
1cea0 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
1ceb0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
1cec0 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
1ced0 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
1cee0 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61  ite3DropIndex(Pa
1cef0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
1cf00 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
1cf10 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e   ifExists){.  In
1cf20 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56  dex *pIndex;.  V
1cf30 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
1cf40 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1cf50 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
1cf60 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1cf70 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f  ->nErr==0 );   /
1cf80 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77  * Never called w
1cf90 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73  ith prior errors
1cfa0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
1cfb0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1cfc0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1cfd0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73  _index;.  }.  as
1cfe0 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
1cff0 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51  c==1 );.  if( SQ
1d000 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
1d010 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
1d020 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  e) ){.    goto e
1d030 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1d040 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
1d050 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
1d060 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  db, pName->a[0].
1d070 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
1d080 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
1d090 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
1d0a0 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69  {.    if( !ifExi
1d0b0 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  sts ){.      sql
1d0c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1d0d0 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  rse, "no such in
1d0e0 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c  dex: %S", pName,
1d0f0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1d100 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
1d110 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
1d120 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  ma(pParse, pName
1d130 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
1d140 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
1d150 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
1d160 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65   = 1;.    goto e
1d170 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1d180 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78    }.  if( pIndex
1d190 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54  ->idxType!=SQLIT
1d1a0 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46  E_IDXTYPE_APPDEF
1d1b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1d1c0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1d1d0 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65  "index associate
1d1e0 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a  d with UNIQUE ".
1d1f0 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52        "or PRIMAR
1d200 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
1d210 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70   cannot be dropp
1d220 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74  ed", 0);.    got
1d230 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1d240 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  x;.  }.  iDb = s
1d250 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
1d260 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e  dex(db, pIndex->
1d270 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65  pSchema);.#ifnde
1d280 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1d290 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
1d2a0 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53      int code = S
1d2b0 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58  QLITE_DROP_INDEX
1d2c0 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
1d2d0 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  b = pIndex->pTab
1d2e0 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
1d2f0 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
1d300 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
1d310 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1d320 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
1d330 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69  ABLE(iDb);.    i
1d340 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1d350 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1d360 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
1d370 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
1d380 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1d390 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
1d3a0 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
1d3b0 44 42 20 26 26 20 69 44 62 20 29 20 63 6f 64 65  DB && iDb ) code
1d3c0 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
1d3d0 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
1d3e0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1d3f0 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
1d400 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
1d410 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
1d420 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
1d430 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1d440 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1d450 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
1d460 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
1d470 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66   the index and f
1d480 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
1d490 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71  able */.  v = sq
1d4a0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1d4b0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
1d4c0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
1d4d0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
1d4e0 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
1d4f0 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
1d500 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
1d510 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
1d520 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
1d530 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79 70 65  name=%Q AND type
1d540 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20 20 20 20  ='index'",.     
1d550 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
1d560 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f  DbSName, MASTER_
1d570 4e 41 4d 45 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  NAME, pIndex->zN
1d580 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  ame.    );.    s
1d590 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54  qlite3ClearStatT
1d5a0 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44  ables(pParse, iD
1d5b0 62 2c 20 22 69 64 78 22 2c 20 70 49 6e 64 65 78  b, "idx", pIndex
1d5c0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
1d5d0 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
1d5e0 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
1d5f0 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
1d600 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64  age(pParse, pInd
1d610 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ex->tnum, iDb);.
1d620 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d630 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70  ddOp4(v, OP_Drop
1d640 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30  Index, iDb, 0, 0
1d650 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
1d660 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64   0);.  }..exit_d
1d670 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c  rop_index:.  sql
1d680 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
1d690 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a  e(db, pName);.}.
1d6a0 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73  ./*.** pArray is
1d6b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
1d6c0 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   array of object
1d6d0 73 2e 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69  s. Each object i
1d6e0 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69  n the.** array i
1d6f0 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20  s szEntry bytes 
1d700 69 6e 20 73 69 7a 65 2e 20 54 68 69 73 20 72 6f  in size. This ro
1d710 75 74 69 6e 65 20 75 73 65 73 20 73 71 6c 69 74  utine uses sqlit
1d720 65 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a  e3DbRealloc().**
1d730 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 61   to extend the a
1d740 72 72 61 79 20 73 6f 20 74 68 61 74 20 74 68 65  rray so that the
1d750 72 65 20 69 73 20 73 70 61 63 65 20 66 6f 72 20  re is space for 
1d760 61 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 74 20  a new object at 
1d770 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57  the end..**.** W
1d780 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1d790 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e  n is called, *pn
1d7a0 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 74  Entry contains t
1d7b0 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
1d7c0 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20  of.** the array 
1d7d0 28 69 6e 20 65 6e 74 72 69 65 73 20 2d 20 73 6f  (in entries - so
1d7e0 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
1d7f0 69 73 20 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a  is ((*pnEntry) *
1d800 20 73 7a 45 6e 74 72 79 29 20 62 79 74 65 73 0a   szEntry) bytes.
1d810 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a  ** in total)..**
1d820 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 61 6c 6c  .** If the reall
1d830 6f 63 28 29 20 69 73 20 73 75 63 63 65 73 73 66  oc() is successf
1d840 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f  ul (i.e. if no O
1d850 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63  OM condition occ
1d860 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61  urs), the.** spa
1d870 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
1d880 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
1d890 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e  is zeroed, *pnEn
1d8a0 74 72 79 20 75 70 64 61 74 65 64 20 74 6f 0a 2a  try updated to.*
1d8b0 2a 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65  * reflect the ne
1d8c0 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72  w size of the ar
1d8d0 72 61 79 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  ray and a pointe
1d8e0 72 20 74 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c  r to the new all
1d8f0 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72  ocation.** retur
1d900 6e 65 64 2e 20 2a 70 49 64 78 20 69 73 20 73 65  ned. *pIdx is se
1d910 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
1d920 66 20 74 68 65 20 6e 65 77 20 61 72 72 61 79 20  f the new array 
1d930 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20 63 61  entry in this ca
1d940 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  se..**.** Otherw
1d950 69 73 65 2c 20 69 66 20 74 68 65 20 72 65 61 6c  ise, if the real
1d960 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a 70 49  loc() fails, *pI
1d970 64 78 20 69 73 20 73 65 74 20 74 6f 20 2d 31 2c  dx is set to -1,
1d980 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e   *pnEntry remain
1d990 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61  s.** unchanged a
1d9a0 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 70 41 72  nd a copy of pAr
1d9b0 72 61 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  ray returned..*/
1d9c0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72  .void *sqlite3Ar
1d9d0 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73  rayAllocate(.  s
1d9e0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1d9f0 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74   /* Connection t
1da00 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c  o notify of mall
1da10 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20  oc failures */. 
1da20 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20   void *pArray,  
1da30 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f     /* Array of o
1da40 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62  bjects.  Might b
1da50 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  e reallocated */
1da60 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20  .  int szEntry, 
1da70 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1da80 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74  each object in t
1da90 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  he array */.  in
1daa0 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20  t *pnEntry,     
1dab0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a  /* Number of obj
1dac0 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ects currently i
1dad0 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  n use */.  int *
1dae0 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20  pIdx         /* 
1daf0 57 72 69 74 65 20 74 68 65 20 69 6e 64 65 78 20  Write the index 
1db00 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65  of a new slot he
1db10 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  re */.){.  char 
1db20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70  *z;.  int n = *p
1db30 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28 20 28 6e  nEntry;.  if( (n
1db40 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (n-1))==0 ){.
1db50 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 28 6e 3d      int sz = (n=
1db60 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20  =0) ? 1 : 2*n;. 
1db70 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20     void *pNew = 
1db80 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1db90 28 64 62 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a  (db, pArray, sz*
1dba0 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66  szEntry);.    if
1dbb0 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
1dbc0 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20     *pIdx = -1;. 
1dbd0 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72       return pArr
1dbe0 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41  ay;.    }.    pA
1dbf0 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  rray = pNew;.  }
1dc00 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41  .  z = (char*)pA
1dc10 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26  rray;.  memset(&
1dc20 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20  z[n * szEntry], 
1dc30 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a  0, szEntry);.  *
1dc40 70 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70  pIdx = n;.  ++*p
1dc50 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e  nEntry;.  return
1dc60 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a   pArray;.}../*.*
1dc70 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65  * Append a new e
1dc80 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69  lement to the gi
1dc90 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65  ven IdList.  Cre
1dca0 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74  ate a new IdList
1dcb0 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a   if.** need be..
1dcc0 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69  **.** A new IdLi
1dcd0 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
1dce0 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f  or NULL if mallo
1dcf0 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64  c() fails..*/.Id
1dd00 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
1dd10 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65  istAppend(sqlite
1dd20 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
1dd30 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
1dd40 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ken){.  int i;. 
1dd50 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
1dd60 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
1dd70 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
1dd80 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69  (db, sizeof(IdLi
1dd90 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
1dda0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1ddb0 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d   0;.  }.  pList-
1ddc0 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  >a = sqlite3Arra
1ddd0 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
1dde0 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73 74   db,.      pList
1ddf0 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f  ->a,.      sizeo
1de00 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a  f(pList->a[0]),.
1de10 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49        &pList->nI
1de20 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b  d,.      &i.  );
1de30 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20  .  if( i<0 ){.  
1de40 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1de50 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
1de60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1de70 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69    }.  pList->a[i
1de80 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
1de90 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1dea0 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65  b, pToken);.  re
1deb0 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
1dec0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49  *.** Delete an I
1ded0 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dList..*/.void s
1dee0 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1def0 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
1df00 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  IdList *pList){.
1df10 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1df20 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1df30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1df40 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
1df50 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1df60 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  ee(db, pList->a[
1df70 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
1df80 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1df90 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  b, pList->a);.  
1dfa0 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
1dfb0 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
1dfc0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1dfd0 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f  index in pList o
1dfe0 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
1dff0 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74   named zId.  Ret
1e000 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74  urn -1.** if not
1e010 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
1e020 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
1e030 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  x(IdList *pList,
1e040 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1e050 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
1e060 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1e070 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28  eturn -1;.  for(
1e080 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
1e090 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
1e0a0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1e0b0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1e0c0 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
1e0d0 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
1e0e0 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
1e0f0 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20 73 70  ** Expand the sp
1e100 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
1e110 72 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  r the given SrcL
1e120 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a  ist object by.**
1e130 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61   creating nExtra
1e140 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e   new slots begin
1e150 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20  ning at iStart. 
1e160 20 69 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20   iStart is zero 
1e170 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c  based..** New sl
1e180 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ots are zeroed..
1e190 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1e1a0 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53 72 63  e, suppose a Src
1e1b0 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63  List initially c
1e1c0 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72  ontains two entr
1e1d0 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20  ies: A,B..** To 
1e1e0 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74  append 3 new ent
1e1f0 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e  ries onto the en
1e200 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a  d, do this:.**.*
1e210 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  *    sqlite3SrcL
1e220 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
1e230 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a  Srclist, 3, 2);.
1e240 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
1e250 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f  call above it wo
1e260 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c  uld contain:  A,
1e270 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69   B, nil, nil, ni
1e280 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74  l..** If the iSt
1e290 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64  art argument had
1e2a0 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20   been 1 instead 
1e2b0 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72  of 2, then the r
1e2c0 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68  esult.** would h
1e2d0 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69  ave been:  A, ni
1e2e0 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20  l, nil, nil, B. 
1e2f0 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20   To prepend the 
1e300 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68  new slots,.** th
1e310 65 20 69 53 74 61 72 74 20 76 61 6c 75 65 20 77  e iStart value w
1e320 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20  ould be 0.  The 
1e330 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c  result then woul
1e340 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69  d.** be: nil, ni
1e350 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a  l, nil, A, B..**
1e360 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
1e370 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
1e380 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 73 20   the SrcList is 
1e390 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 65 0a  unchanged.  The.
1e3a0 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ** db->mallocFai
1e3b0 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20 62 65  led flag will be
1e3c0 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f   set to true..*/
1e3d0 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
1e3e0 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
1e3f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1e400 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1e410 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
1e420 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72  notify of OOM er
1e430 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73  rors */.  SrcLis
1e440 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20  t *pSrc,     /* 
1e450 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62  The SrcList to b
1e460 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20  e enlarged */.  
1e470 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
1e480 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e490 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64  new slots to add
1e4a0 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f   to pSrc->a[] */
1e4b0 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20 20 20  .  int iStart   
1e4c0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
1e4d0 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66  n pSrc->a[] of f
1e4e0 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f  irst new slot */
1e4f0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  .){.  int i;..  
1e500 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
1e510 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61  ng on calling pa
1e520 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73  rameters */.  as
1e530 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20  sert( iStart>=0 
1e540 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78  );.  assert( nEx
1e550 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  tra>=1 );.  asse
1e560 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
1e570 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c   assert( iStart<
1e580 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a  =pSrc->nSrc );..
1e590 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64    /* Allocate ad
1e5a0 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65 20 69  ditional space i
1e5b0 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66  f needed */.  if
1e5c0 28 20 28 75 33 32 29 70 53 72 63 2d 3e 6e 53 72  ( (u32)pSrc->nSr
1e5d0 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e  c+nExtra>pSrc->n
1e5e0 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63  Alloc ){.    Src
1e5f0 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
1e600 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72  int nAlloc = pSr
1e610 63 2d 3e 6e 53 72 63 2a 32 2b 6e 45 78 74 72 61  c->nSrc*2+nExtra
1e620 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a  ;.    int nGot;.
1e630 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1e640 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
1e650 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  pSrc,.          
1e660 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72       sizeof(*pSr
1e670 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a  c) + (nAlloc-1)*
1e680 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
1e690 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ]) );.    if( pN
1e6a0 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ew==0 ){.      a
1e6b0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
1e6c0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
1e6d0 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20   return pSrc;.  
1e6e0 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70    }.    pSrc = p
1e6f0 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20  New;.    nGot = 
1e700 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  (sqlite3DbMalloc
1e710 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d  Size(db, pNew) -
1e720 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f   sizeof(*pSrc))/
1e730 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
1e740 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e  ])+1;.    pSrc->
1e750 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a 20  nAlloc = nGot;. 
1e760 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78   }..  /* Move ex
1e770 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68 61  isting slots tha
1e780 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65  t come after the
1e790 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64 20   newly inserted 
1e7a0 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f  slots.  ** out o
1e7b0 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20 66  f the way */.  f
1e7c0 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d  or(i=pSrc->nSrc-
1e7d0 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d  1; i>=iStart; i-
1e7e0 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b  -){.    pSrc->a[
1e7f0 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72 63  i+nExtra] = pSrc
1e800 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53  ->a[i];.  }.  pS
1e810 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45 78 74  rc->nSrc += nExt
1e820 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74  ra;..  /* Zero t
1e830 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  he newly allocat
1e840 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65  ed slots */.  me
1e850 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b 69 53  mset(&pSrc->a[iS
1e860 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  tart], 0, sizeof
1e870 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78  (pSrc->a[0])*nEx
1e880 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53  tra);.  for(i=iS
1e890 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e  tart; i<iStart+n
1e8a0 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20  Extra; i++){.   
1e8b0 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72   pSrc->a[i].iCur
1e8c0 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  sor = -1;.  }.. 
1e8d0 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69   /* Return a poi
1e8e0 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e 6c 61  nter to the enla
1e8f0 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a  rged SrcList */.
1e900 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d    return pSrc;.}
1e910 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  .../*.** Append 
1e920 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  a new table name
1e930 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72   to the given Sr
1e940 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  cList.  Create a
1e950 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a   new SrcList if.
1e960 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e  ** need be.  A n
1e970 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61  ew entry is crea
1e980 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69  ted in the SrcLi
1e990 73 74 20 65 76 65 6e 20 69 66 20 70 54 61 62 6c  st even if pTabl
1e9a0 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  e is NULL..**.**
1e9b0 20 41 20 53 72 63 4c 69 73 74 20 69 73 20 72 65   A SrcList is re
1e9c0 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
1e9d0 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
1e9e0 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65 20 72  OM error.  The r
1e9f0 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69  eturned.** SrcLi
1ea00 73 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  st might be the 
1ea10 73 61 6d 65 20 61 73 20 74 68 65 20 53 72 63 4c  same as the SrcL
1ea20 69 73 74 20 74 68 61 74 20 77 61 73 20 69 6e 70  ist that was inp
1ea30 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62  ut or it might b
1ea40 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20  e.** a new one. 
1ea50 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
1ea60 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74 68   does occurs, th
1ea70 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61 6c  en the prior val
1ea80 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74  ue of pList.** t
1ea90 68 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f 20  hat is input to 
1eaa0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1eab0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72  automatically fr
1eac0 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  eed..**.** If pD
1ead0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e  atabase is not n
1eae0 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ull, it means th
1eaf0 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  at the table has
1eb00 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20   an optional.** 
1eb10 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72  database name pr
1eb20 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73  efix.  Like this
1eb30 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62  :  "database.tab
1eb40 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62  le".  The pDatab
1eb50 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ase.** points to
1eb60 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
1eb70 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70  and the pTable p
1eb80 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74  oints to the dat
1eb90 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54  abase name..** T
1eba0 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  he SrcList.a[].z
1ebb0 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69  Name field is fi
1ebc0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61  lled with the ta
1ebd0 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d  ble name which m
1ebe0 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f  ight.** come fro
1ebf0 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61  m pTable (if pDa
1ec00 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20  tabase is NULL) 
1ec10 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73  or from pDatabas
1ec20 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e  e.  .** SrcList.
1ec30 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73  a[].zDatabase is
1ec40 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
1ec50 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66   database name f
1ec60 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f  rom pTable,.** o
1ec70 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e  r with NULL if n
1ec80 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70  o database is sp
1ec90 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ecified..**.** I
1eca0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
1ecb0 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73  f call like this
1ecc0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1ecd0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1ece0 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a  pend(D,A,B,0);.*
1ecf0 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61  *.** Then B is a
1ed00 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
1ed10 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1ed20 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64  e is unspecified
1ed30 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20  .  If called.** 
1ed40 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1ed50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ed60 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
1ed70 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,C);.**.** Th
1ed80 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c  en C is the tabl
1ed90 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20  e name and B is 
1eda0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1edb0 65 2e 20 20 49 66 20 43 20 69 73 20 64 65 66 69  e.  If C is defi
1edc0 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69  ned.** then so i
1edd0 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  s B.  In other w
1ede0 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72 20 68  ords, we never h
1edf0 61 76 65 20 61 20 63 61 73 65 20 77 68 65 72 65  ave a case where
1ee00 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1ee10 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1ee20 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a  pend(D,A,0,C);.*
1ee30 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c 65  *.** Both pTable
1ee40 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 20 61   and pDatabase a
1ee50 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65  re assumed to be
1ee60 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79 20 61   quoted.  They a
1ee70 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62  re dequoted.** b
1ee80 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64 64 65  efore being adde
1ee90 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74  d to the SrcList
1eea0 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
1eeb0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1eec0 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  nd(.  sqlite3 *d
1eed0 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  b,        /* Con
1eee0 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
1eef0 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  y of malloc fail
1ef00 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ures */.  SrcLis
1ef10 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
1ef20 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20   Append to this 
1ef30 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72  SrcList. NULL cr
1ef40 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c  eates a new SrcL
1ef50 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ist */.  Token *
1ef60 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20  pTable,      /* 
1ef70 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20  Table to append 
1ef80 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
1ef90 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61  abase    /* Data
1efa0 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c  base of the tabl
1efb0 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  e */.){.  struct
1efc0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1efd0 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20  Item;.  assert( 
1efe0 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20  pDatabase==0 || 
1eff0 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a  pTable!=0 );  /*
1f000 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43 20 77   Cannot have C w
1f010 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20 61 73  ithout B */.  as
1f020 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
1f030 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
1f040 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
1f050 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
1f060 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72 63  N(db, sizeof(Src
1f070 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
1f080 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1f090 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
1f0a0 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 20  >nAlloc = 1;.   
1f0b0 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 3d 20 31   pList->nSrc = 1
1f0c0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4c  ;.    memset(&pL
1f0d0 69 73 74 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73 69  ist->a[0], 0, si
1f0e0 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
1f0f0 29 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  ));.    pList->a
1f100 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [0].iCursor = -1
1f110 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1f120 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 53 72  List = sqlite3Sr
1f130 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
1f140 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69 73 74   pList, 1, pList
1f150 2d 3e 6e 53 72 63 29 3b 0a 20 20 7d 0a 20 20 69  ->nSrc);.  }.  i
1f160 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1f170 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
1f180 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
1f190 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
1f1a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1f1b0 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
1f1c0 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d  a[pList->nSrc-1]
1f1d0 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  ;.  if( pDatabas
1f1e0 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e  e && pDatabase->
1f1f0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74  z==0 ){.    pDat
1f200 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  abase = 0;.  }. 
1f210 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 29   if( pDatabase )
1f220 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  {.    pItem->zNa
1f230 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
1f240 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44  FromToken(db, pD
1f250 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 49  atabase);.    pI
1f260 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
1f270 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1f280 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
1f290 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1f2a0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
1f2b0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1f2c0 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ken(db, pTable);
1f2d0 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74  .    pItem->zDat
1f2e0 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  abase = 0;.  }. 
1f2f0 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
1f300 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56  ../*.** Assign V
1f310 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20  dbeCursor index 
1f320 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74  numbers to all t
1f330 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69  ables in a SrcLi
1f340 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  st.*/.void sqlit
1f350 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
1f360 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50  ursors(Parse *pP
1f370 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
1f380 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
1f390 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1f3a0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1f3b0 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20  assert(pList || 
1f3c0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
1f3d0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
1f3e0 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
1f3f0 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(i=0, pItem=pL
1f400 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
1f410 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
1f420 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
1f430 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d  pItem->iCursor>=
1f440 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
1f450 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20   pItem->iCursor 
1f460 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
1f470 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
1f480 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
1f490 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
1f4a0 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
1f4b0 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  s(pParse, pItem-
1f4c0 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b  >pSelect->pSrc);
1f4d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f4e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
1f4f0 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63  te an entire Src
1f500 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61  List including a
1f510 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74  ll its substruct
1f520 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
1f530 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
1f540 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  e(sqlite3 *db, S
1f550 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
1f560 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1f570 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1f580 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
1f590 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
1f5a0 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
1f5b0 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
1f5c0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
1f5d0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
1f5e0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1f5f0 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
1f600 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1f610 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
1f620 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
1f630 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
1f640 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
1f650 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69   if( pItem->fg.i
1f660 73 49 6e 64 65 78 65 64 42 79 20 29 20 73 71 6c  sIndexedBy ) sql
1f670 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1f680 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  Item->u1.zIndexe
1f690 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49  dBy);.    if( pI
1f6a0 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
1f6b0 63 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 4c  c ) sqlite3ExprL
1f6c0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  istDelete(db, pI
1f6d0 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
1f6e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
1f6f0 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 49  leteTable(db, pI
1f700 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
1f710 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
1f720 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
1f730 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c  Select);.    sql
1f740 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1f750 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a  b, pItem->pOn);.
1f760 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1f770 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  tDelete(db, pIte
1f780 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a  m->pUsing);.  }.
1f790 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
1f7a0 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  N(db, pList);.}.
1f7b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1f7c0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
1f7d0 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61   the parser to a
1f7e0 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f  dd a new term to
1f7f0 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61   the.** end of a
1f800 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c   growing FROM cl
1f810 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70  ause.  The "p" p
1f820 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
1f830 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46  part of.** the F
1f840 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20  ROM clause that 
1f850 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1f860 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22   constructed.  "
1f870 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66  p" is NULL.** if
1f880 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1f890 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  st term of the F
1f8a0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61  ROM clause.  pTa
1f8b0 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
1f8c0 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d  e.** are the nam
1f8d0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  e of the table a
1f8e0 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  nd database name
1f8f0 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
1f900 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44  ause term..** pD
1f910 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20  atabase is NULL 
1f920 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1f930 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69  name qualifier i
1f940 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a  s missing - the.
1f950 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20  ** usual case.  
1f960 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20  If the term has 
1f970 61 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70  an alias, then p
1f980 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20  Alias points to 
1f990 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b  the.** alias tok
1f9a0 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d  en.  If the term
1f9b0 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20   is a subquery, 
1f9c0 74 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69  then pSubquery i
1f9d0 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20  s the.** SELECT 
1f9e0 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74  statement that t
1f9f0 68 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f  he subquery enco
1fa00 64 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65  des.  The pTable
1fa10 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73   and.** pDatabas
1fa20 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  e parameters are
1fa30 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65   NULL for subque
1fa40 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61  ries.  The pOn a
1fa50 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72  nd pUsing.** par
1fa60 61 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20  ameters are the 
1fa70 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f  content of the O
1fa80 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
1fa90 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ses..**.** Retur
1faa0 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  n a new SrcList 
1fab0 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73  which encodes is
1fac0 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74   the FROM with t
1fad0 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61  he new.** term a
1fae0 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  dded..*/.SrcList
1faf0 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
1fb00 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a  AppendFromTerm(.
1fb10 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1fb20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
1fb30 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1fb40 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20    SrcList *p,   
1fb50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1fb60 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68   left part of th
1fb70 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c  e FROM clause al
1fb80 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20  ready seen */.  
1fb90 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
1fba0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1fbb0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
1fbc0 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20  add to the FROM 
1fbd0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65  clause */.  Toke
1fbe0 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20  n *pDatabase,   
1fbf0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1fc00 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
1fc10 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f  aining pTable */
1fc20 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73  .  Token *pAlias
1fc30 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
1fc40 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
1fc50 65 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65  e of the AS sube
1fc60 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53  xpression */.  S
1fc70 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79  elect *pSubquery
1fc80 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71  ,      /* A subq
1fc90 75 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61  uery used in pla
1fca0 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61  ce of a table na
1fcb0 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  me */.  Expr *pO
1fcc0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
1fcd0 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65  /* The ON clause
1fce0 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20   of a join */.  
1fcf0 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20  IdList *pUsing  
1fd00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55          /* The U
1fd10 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61  SING clause of a
1fd20 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74   join */.){.  st
1fd30 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1fd40 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
1fd50 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1fd60 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26  ->db;.  if( !p &
1fd70 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67  & (pOn || pUsing
1fd80 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
1fd90 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1fda0 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20   "a JOIN clause 
1fdb0 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  is required befo
1fdc0 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28  re %s", .      (
1fdd0 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53  pOn ? "ON" : "US
1fde0 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20  ING").    );.   
1fdf0 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f   goto append_fro
1fe00 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  m_error;.  }.  p
1fe10 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
1fe20 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70  tAppend(db, p, p
1fe30 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65  Table, pDatabase
1fe40 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
1fe50 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64  .    goto append
1fe60 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d  _from_error;.  }
1fe70 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53  .  assert( p->nS
1fe80 72 63 3e 30 20 29 3b 0a 20 20 70 49 74 65 6d 20  rc>0 );.  pItem 
1fe90 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
1fea0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 41  1];.  assert( pA
1feb0 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66 28  lias!=0 );.  if(
1fec0 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20   pAlias->n ){.  
1fed0 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20    pItem->zAlias 
1fee0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1fef0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61  mToken(db, pAlia
1ff00 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  s);.  }.  pItem-
1ff10 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71  >pSelect = pSubq
1ff20 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70  uery;.  pItem->p
1ff30 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65  On = pOn;.  pIte
1ff40 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69  m->pUsing = pUsi
1ff50 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ng;.  return p;.
1ff60 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  . append_from_er
1ff70 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70  ror:.  assert( p
1ff80 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
1ff90 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1ffa0 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64  On);.  sqlite3Id
1ffb0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1ffc0 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  Using);.  sqlite
1ffd0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
1ffe0 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20  , pSubquery);.  
1fff0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
20000 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45  ** Add an INDEXE
20010 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45  D BY or NOT INDE
20020 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68  XED clause to th
20030 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
20040 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e  added .** elemen
20050 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d  t of the source-
20060 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
20070 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
20080 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
20090 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65  te3SrcListIndexe
200a0 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  dBy(Parse *pPars
200b0 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54  e, SrcList *p, T
200c0 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79  oken *pIndexedBy
200d0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ){.  assert( pIn
200e0 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20 20  dexedBy!=0 );.  
200f0 69 66 28 20 70 20 26 26 20 70 49 6e 64 65 78 65  if( p && pIndexe
20100 64 42 79 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  dBy->n>0 ){.    
20110 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
20120 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
20130 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 72 63 3e  assert( p->nSrc>
20140 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d  0 );.    pItem =
20150 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31   &p->a[p->nSrc-1
20160 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
20170 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65  Item->fg.notInde
20180 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  xed==0 );.    as
20190 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e  sert( pItem->fg.
201a0 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29  isIndexedBy==0 )
201b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
201c0 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
201d0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  c==0 );.    if( 
201e0 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31  pIndexedBy->n==1
201f0 20 26 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d   && !pIndexedBy-
20200 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  >z ){.      /* A
20210 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63   "NOT INDEXED" c
20220 6c 61 75 73 65 20 77 61 73 20 73 75 70 70 6c 69  lause was suppli
20230 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20  ed. See parse.y 
20240 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72  .      ** constr
20250 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74  uct "indexed_opt
20260 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a  " for details. *
20270 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66  /.      pItem->f
20280 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31  g.notIndexed = 1
20290 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
202a0 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e     pItem->u1.zIn
202b0 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65  dexedBy = sqlite
202c0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
202d0 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65  Parse->db, pInde
202e0 78 65 64 42 79 29 3b 0a 20 20 20 20 20 20 70 49  xedBy);.      pI
202f0 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
20300 64 42 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  dBy = 1;.    }. 
20310 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
20320 74 68 65 20 6c 69 73 74 20 6f 66 20 66 75 6e 63  the list of func
20330 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74  tion arguments t
20340 6f 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 6e  o the SrcList en
20350 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62  try for a.** tab
20360 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 69  le-valued-functi
20370 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
20380 74 65 33 53 72 63 4c 69 73 74 46 75 6e 63 41 72  te3SrcListFuncAr
20390 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  gs(Parse *pParse
203a0 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 45 78  , SrcList *p, Ex
203b0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
203c0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
203d0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
203e0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
203f0 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
20400 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
20410 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  >fg.notIndexed==
20420 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
20430 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
20440 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20  exedBy==0 );.   
20450 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
20460 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20  fg.isTabFunc==0 
20470 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 31  );.    pItem->u1
20480 2e 70 46 75 6e 63 41 72 67 20 3d 20 70 4c 69 73  .pFuncArg = pLis
20490 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  t;.    pItem->fg
204a0 2e 69 73 54 61 62 46 75 6e 63 20 3d 20 31 3b 0a  .isTabFunc = 1;.
204b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
204c0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
204d0 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
204e0 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  List);.  }.}../*
204f0 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e  .** When buildin
20500 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75  g up a FROM clau
20510 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  se in the parser
20520 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  , the join opera
20530 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61  tor.** is initia
20540 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f 20  lly attached to 
20550 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
20560 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65 20  .  But the code 
20570 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70  generator.** exp
20580 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ects the join op
20590 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20  erator to be on 
205a0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
205b0 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
205c0 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a  .** Shifts all j
205d0 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72  oin operators fr
205e0 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
205f0 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46   for an entire F
20600 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a  ROM.** clause..*
20610 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75  *.** Example: Su
20620 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69  ppose the join i
20630 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
20640 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20 6e  **           A n
20650 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69  atural cross joi
20660 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  n B.**.** The op
20670 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72  erator is "natur
20680 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20  al cross join". 
20690 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65   The A and B ope
206a0 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64  rands are stored
206b0 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61  .** in p->a[0] a
206c0 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70  nd p->a[1], resp
206d0 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70  ectively.  The p
206e0 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20  arser initially 
206f0 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70  stores the.** op
20700 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20  erator with A.  
20710 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69  This routine shi
20720 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f  fts that operato
20730 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a  r over to B..*/.
20740 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
20750 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65  istShiftJoinType
20760 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20  (SrcList *p){.  
20770 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
20780 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d   i;.    for(i=p-
20790 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d  >nSrc-1; i>0; i-
207a0 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69  -){.      p->a[i
207b0 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  ].fg.jointype = 
207c0 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f 69  p->a[i-1].fg.joi
207d0 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20  ntype;.    }.   
207e0 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69 6e   p->a[0].fg.join
207f0 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  type = 0;.  }.}.
20800 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
20810 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20  VDBE code for a 
20820 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e  BEGIN statement.
20830 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20840 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  BeginTransaction
20850 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
20860 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c  int type){.  sql
20870 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
20880 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20   *v;.  int i;.. 
20890 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
208a0 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  =0 );.  db = pPa
208b0 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
208c0 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
208d0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
208e0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
208f0 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
20900 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b  BEGIN", 0, 0) ){
20910 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
20920 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
20930 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
20940 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e   if( !v ) return
20950 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b  ;.  if( type!=TK
20960 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20  _DEFERRED ){.   
20970 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
20980 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
20990 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
209a0 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  p2(v, OP_Transac
209b0 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d  tion, i, (type==
209c0 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29  TK_EXCLUSIVE)+1)
209d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
209e0 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
209f0 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  i);.    }.  }.  
20a00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20a10 30 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  0(v, OP_AutoComm
20a20 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  it);.}../*.** Ge
20a30 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
20a40 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72   for a COMMIT or
20a50 20 52 4f 4c 4c 42 41 43 4b 20 73 74 61 74 65 6d   ROLLBACK statem
20a60 65 6e 74 2e 0a 2a 2a 20 43 6f 64 65 20 66 6f 72  ent..** Code for
20a70 20 52 4f 4c 4c 42 41 43 4b 20 69 73 20 67 65 6e   ROLLBACK is gen
20a80 65 72 61 74 65 64 20 69 66 20 65 54 79 70 65 3d  erated if eType=
20a90 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20 4f  =TK_ROLLBACK.  O
20aa0 74 68 65 72 77 69 73 65 0a 2a 2a 20 63 6f 64 65  therwise.** code
20ab0 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 6f   is generated fo
20ac0 72 20 61 20 43 4f 4d 4d 49 54 2e 0a 2a 2f 0a 76  r a COMMIT..*/.v
20ad0 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 72  oid sqlite3EndTr
20ae0 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
20af0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 54 79  *pParse, int eTy
20b00 70 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  pe){.  Vdbe *v;.
20b10 20 20 69 6e 74 20 69 73 52 6f 6c 6c 62 61 63 6b    int isRollback
20b20 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
20b30 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
20b40 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d  rt( pParse->db!=
20b50 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  0 );.  assert( e
20b60 54 79 70 65 3d 3d 54 4b 5f 43 4f 4d 4d 49 54 20  Type==TK_COMMIT 
20b70 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 45 4e 44  || eType==TK_END
20b80 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f   || eType==TK_RO
20b90 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 69 73 52 6f  LLBACK );.  isRo
20ba0 6c 6c 62 61 63 6b 20 3d 20 65 54 79 70 65 3d 3d  llback = eType==
20bb0 54 4b 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 69  TK_ROLLBACK;.  i
20bc0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
20bd0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
20be0 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
20bf0 0a 20 20 20 20 20 20 20 69 73 52 6f 6c 6c 62 61  .       isRollba
20c00 63 6b 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 22 20  ck ? "ROLLBACK" 
20c10 3a 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  : "COMMIT", 0, 0
20c20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
20c30 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74  .  }.  v = sqlit
20c40 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
20c50 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
20c60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20c70 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op2(v, OP_AutoCo
20c80 6d 6d 69 74 2c 20 31 2c 20 69 73 52 6f 6c 6c 62  mmit, 1, isRollb
20c90 61 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ack);.  }.}../*.
20ca0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
20cb0 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
20cc0 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74  e parser when it
20cd0 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e   parses a comman
20ce0 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20  d to create,.** 
20cf0 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
20d00 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70  ack an SQL savep
20d10 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  oint. .*/.void s
20d20 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28  qlite3Savepoint(
20d30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
20d40 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e  nt op, Token *pN
20d50 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
20d60 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
20d70 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
20d80 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  e->db, pName);. 
20d90 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
20da0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
20db0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
20dc0 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
20dd0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
20de0 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63  ATION.    static
20df0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f   const char * co
20e00 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45  nst az[] = { "BE
20e10 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c  GIN", "RELEASE",
20e20 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20   "ROLLBACK" };. 
20e30 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56 45     assert( !SAVE
20e40 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53  POINT_BEGIN && S
20e50 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
20e60 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54  ==1 && SAVEPOINT
20e70 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a  _ROLLBACK==2 );.
20e80 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21  #endif.    if( !
20e90 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68  v || sqlite3Auth
20ea0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
20eb0 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20  LITE_SAVEPOINT, 
20ec0 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30  az[op], zName, 0
20ed0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
20ee0 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
20ef0 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >db, zName);.   
20f00 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
20f10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
20f20 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76  AddOp4(v, OP_Sav
20f30 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30  epoint, op, 0, 0
20f40 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41  , zName, P4_DYNA
20f50 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  MIC);.  }.}../*.
20f60 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
20f70 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69   TEMP database i
20f80 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c  s open and avail
20f90 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52  able for use.  R
20fa0 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
20fb0 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
20fc0 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
20fd0 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20  messages in the 
20fe0 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
20ff0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21000 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
21010 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
21020 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
21030 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
21040 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  f( db->aDb[1].pB
21050 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  t==0 && !pParse-
21060 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
21070 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65  int rc;.    Btre
21080 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74  e *pBt;.    stat
21090 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61  ic const int fla
210a0 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  gs = .          
210b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
210c0 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20  WRITE |.        
210d0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
210e0 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
210f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
21100 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20  LUSIVE |.       
21110 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
21120 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
21130 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
21140 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20  OPEN_TEMP_DB;.. 
21150 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
21160 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66  treeOpen(db->pVf
21170 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20  s, 0, db, &pBt, 
21180 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  0, flags);.    i
21190 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
211a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
211b0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
211c0 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  , "unable to ope
211d0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61  n a temporary da
211e0 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20  tabase ".       
211f0 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69   "file for stori
21200 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
21210 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61  les");.      pPa
21220 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
21230 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
21240 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b    }.    db->aDb[
21250 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  1].pBt = pBt;.  
21260 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
21270 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
21280 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
21290 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72  OMEM==sqlite3Btr
212a0 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 42  eeSetPageSize(pB
212b0 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73  t, db->nextPages
212c0 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20  ize, -1, 0) ){. 
212d0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
212e0 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20  ault(db);.      
212f0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
21300 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
21310 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  }../*.** Record 
21320 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
21330 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
21340 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  will need to be 
21350 76 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20  verified.** for 
21360 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 20 54  database iDb.  T
21370 68 65 20 63 6f 64 65 20 74 6f 20 61 63 74 75 61  he code to actua
21380 6c 6c 79 20 76 65 72 69 66 79 20 74 68 65 20 73  lly verify the s
21390 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20  chema cookie.** 
213a0 77 69 6c 6c 20 6f 63 63 75 72 20 61 74 20 74 68  will occur at th
213b0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 6f 70  e end of the top
213c0 2d 6c 65 76 65 6c 20 56 44 42 45 20 61 6e 64 20  -level VDBE and 
213d0 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
213e0 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20 73  d.** later, by s
213f0 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
21400 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ng()..*/.void sq
21410 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
21420 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61  chema(Parse *pPa
21430 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  rse, int iDb){. 
21440 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
21450 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
21460 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
21470 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  ;..  assert( iDb
21480 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72 73  >=0 && iDb<pPars
21490 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  e->db->nDb );.  
214a0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
214b0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
214c0 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b  !=0 || iDb==1 );
214d0 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 53  .  assert( iDb<S
214e0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
214f0 45 44 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74  ED+2 );.  assert
21500 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
21510 75 74 65 78 48 65 6c 64 28 70 50 61 72 73 65 2d  utexHeld(pParse-
21520 3e 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  >db, iDb, 0) );.
21530 20 20 69 66 28 20 44 62 4d 61 73 6b 54 65 73 74    if( DbMaskTest
21540 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b  (pToplevel->cook
21550 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
21560 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74  ){.    DbMaskSet
21570 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b  (pToplevel->cook
21580 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20  ieMask, iDb);.  
21590 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
215a0 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
215b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
215c0 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 54  nTempDatabase(pT
215d0 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a  oplevel);.    }.
215e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
215f0 61 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20  argument zDb is 
21600 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20  NULL, then call 
21610 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
21620 79 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61  ySchema() for ea
21630 63 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20  ch .** attached 
21640 64 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77  database. Otherw
21650 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66  ise, invoke it f
21660 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
21670 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a  named zDb only..
21680 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
21690 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
216a0 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
216b0 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
216c0 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  zDb){.  sqlite3 
216d0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
216e0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
216f0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
21700 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
21710 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
21720 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
21730 42 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30  Bt && (!zDb || 0
21740 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
21750 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e  (zDb, pDb->zDbSN
21760 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 20 20 73  ame)) ){.      s
21770 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
21780 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
21790 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
217a0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
217b0 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72  DBE code that pr
217c0 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67  epares for doing
217d0 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68   an operation th
217e0 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
217f0 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ge the database.
21800 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
21810 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77  ine starts a new
21820 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
21830 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61  we are not alrea
21840 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74  dy within.** a t
21850 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
21860 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77  we are already w
21870 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
21880 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63  ion, then a chec
21890 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74  kpoint.** is set
218a0 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65   if the setState
218b0 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69  ment parameter i
218c0 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b  s true.  A check
218d0 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  point should.** 
218e0 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61  be set for opera
218f0 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74  tions that might
21900 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20   fail (due to a 
21910 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74  constraint) part
21920 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74   of.** the way t
21930 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68  hrough and which
21940 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e   will need to un
21950 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77  do some writes w
21960 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
21970 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  .** rollback the
21980 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69   whole transacti
21990 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69  on.  For operati
219a0 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f  ons where all co
219b0 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e  nstraints.** can
219c0 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f   be checked befo
219d0 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61  re any changes a
219e0 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
219f0 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e  atabase, it is n
21a00 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72  ever.** necessar
21a10 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74  y to undo a writ
21a20 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70  e and the checkp
21a30 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  oint should not 
21a40 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  be set..*/.void 
21a50 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
21a60 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65  eOperation(Parse
21a70 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65   *pParse, int se
21a80 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20  tStatement, int 
21a90 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  iDb){.  Parse *p
21aa0 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
21ab0 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
21ac0 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
21ad0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
21ae0 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
21af0 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f  .  DbMaskSet(pTo
21b00 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73  plevel->writeMas
21b10 6b 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c  k, iDb);.  pTopl
21b20 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69  evel->isMultiWri
21b30 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d 65  te |= setStateme
21b40 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64  nt;.}../*.** Ind
21b50 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 73  icate that the s
21b60 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74  tatement current
21b70 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
21b80 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72 69 74  ction might writ
21b90 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f  e.** more than o
21ba0 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d 70 6c  ne entry (exampl
21bb0 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20  e: deleting one 
21bc0 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72 74 69  row then inserti
21bd0 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69  ng another,.** i
21be0 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c  nserting multipl
21bf0 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62 6c  e rows in a tabl
21c00 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20  e, or inserting 
21c10 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78 20  a row and index 
21c20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20  entries.).** If 
21c30 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72 73 20  an abort occurs 
21c40 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20 74 68  after some of th
21c50 65 73 65 20 77 72 69 74 65 73 20 68 61 76 65 20  ese writes have 
21c60 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e 20  completed, then 
21c70 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65  it will.** be ne
21c80 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
21c90 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20 77 72  the completed wr
21ca0 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ites..*/.void sq
21cb0 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28  lite3MultiWrite(
21cc0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
21cd0 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
21ce0 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
21cf0 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
21d00 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
21d10 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d 20 31  isMultiWrite = 1
21d20 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20  ;.}../* .** The 
21d30 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63  code generator c
21d40 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
21d50 65 20 69 66 20 69 73 20 64 69 73 63 6f 76 65 72  e if is discover
21d60 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20  s that it is.** 
21d70 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62 6f 72  possible to abor
21d80 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 70 72  t a statement pr
21d90 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f  ior to completio
21da0 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  n.  In order to 
21db0 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 69 73  .** perform this
21dc0 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74 20 63   abort without c
21dd0 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20 64 61  orrupting the da
21de0 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65 64 20  tabase, we need 
21df0 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20  to make.** sure 
21e00 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
21e10 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65 64 20  nt is protected 
21e20 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  by a statement t
21e30 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
21e40 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77  * Technically, w
21e50 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73  e only need to s
21e60 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72 74 20  et the mayAbort 
21e70 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a 20 69  flag if the.** i
21e80 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c 61 67  sMultiWrite flag
21e90 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
21ea0 73 65 74 2e 20 20 54 68 65 72 65 20 69 73 20 61  set.  There is a
21eb0 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79   time dependency
21ec0 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20 74 68  .** such that th
21ed0 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f 63 63  e abort must occ
21ee0 75 72 20 61 66 74 65 72 20 74 68 65 20 6d 75 6c  ur after the mul
21ef0 74 69 77 72 69 74 65 2e 20 20 54 68 69 73 20 6d  tiwrite.  This m
21f00 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61  akes.** some sta
21f10 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e  tements involvin
21f20 67 20 74 68 65 20 52 45 50 4c 41 43 45 20 63 6f  g the REPLACE co
21f30 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
21f40 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67  n algorithm.** g
21f50 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74 65  o a little faste
21f60 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67 20 61  r.  But taking a
21f70 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69 73  dvantage of this
21f80 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79   time dependency
21f90 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72  .** makes it mor
21fa0 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 70  e difficult to p
21fb0 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 63 6f  rove that the co
21fc0 64 65 20 69 73 20 63 6f 72 72 65 63 74 20 28 69  de is correct (i
21fd0 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72  n .** particular
21fe0 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20 75 73  , it prevents us
21ff0 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e   from writing an
22000 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d   effective.** im
22010 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
22020 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79  sqlite3AssertMay
22030 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73 6f 20  Abort()) and so 
22040 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a  we have chosen.*
22050 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20 73 61  * to take the sa
22060 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73 6b 69  fe route and ski
22070 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  p the optimizati
22080 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
22090 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72 73  te3MayAbort(Pars
220a0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61  e *pParse){.  Pa
220b0 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
220c0 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
220d0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
220e0 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41   pToplevel->mayA
220f0 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  bort = 1;.}../*.
22100 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61  ** Code an OP_Ha
22110 6c 74 20 74 68 61 74 20 63 61 75 73 65 73 20 74  lt that causes t
22120 68 65 20 76 64 62 65 20 74 6f 20 72 65 74 75 72  he vdbe to retur
22130 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n an SQLITE_CONS
22140 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e  TRAINT.** error.
22150 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61 72   The onError par
22160 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65  ameter determine
22170 73 20 77 68 69 63 68 20 28 69 66 20 61 6e 79 29  s which (if any)
22180 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
22190 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72  t.** and/or curr
221a0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
221b0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
221c0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 48  */.void sqlite3H
221d0 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  altConstraint(. 
221e0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
221f0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
22200 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65  ntext */.  int e
22210 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20  rrCode,      /* 
22220 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63  extended error c
22230 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  ode */.  int onE
22240 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f  rror,      /* Co
22250 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f  nstraint type */
22260 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20 20 20  .  char *p4,    
22270 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65       /* Error me
22280 73 73 61 67 65 20 2a 2f 0a 20 20 69 38 20 70 34  ssage */.  i8 p4
22290 74 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  type,        /* 
222a0 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50 34 5f  P4_STATIC or P4_
222b0 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75  TRANSIENT */.  u
222c0 38 20 70 35 45 72 72 6d 73 67 20 20 20 20 20 20  8 p5Errmsg      
222d0 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20 74 79   /* P5_ErrMsg ty
222e0 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  pe */.){.  Vdbe 
222f0 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
22300 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
22310 73 73 65 72 74 28 20 28 65 72 72 43 6f 64 65 26  ssert( (errCode&
22320 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
22330 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20 20 69 66  NSTRAINT );.  if
22340 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62  ( onError==OE_Ab
22350 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ort ){.    sqlit
22360 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
22370 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
22380 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
22390 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c  P_Halt, errCode,
223a0 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c   onError, 0, p4,
223b0 20 70 34 74 79 70 65 29 3b 0a 20 20 73 71 6c 69   p4type);.  sqli
223c0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
223d0 76 2c 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a  v, p5Errmsg);.}.
223e0 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
223f0 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 55 4e  P_Halt due to UN
22400 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20  IQUE or PRIMARY 
22410 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  KEY constraint v
22420 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  iolation..*/.voi
22430 64 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43  d sqlite3UniqueC
22440 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
22450 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
22460 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
22470 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  t */.  int onErr
22480 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73  or,      /* Cons
22490 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20  traint type */. 
224a0 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
224b0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
224c0 74 68 61 74 20 74 72 69 67 67 65 72 73 20 74 68  that triggers th
224d0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
224e0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  ){.  char *zErr;
224f0 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41  .  int j;.  StrA
22500 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54  ccum errMsg;.  T
22510 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64  able *pTab = pId
22520 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71  x->pTable;..  sq
22530 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
22540 74 28 26 65 72 72 4d 73 67 2c 20 70 50 61 72 73  t(&errMsg, pPars
22550 65 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 32 30 30  e->db, 0, 0, 200
22560 29 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 61  );.  if( pIdx->a
22570 43 6f 6c 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ColExpr ){.    s
22580 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 65  qlite3XPrintf(&e
22590 72 72 4d 73 67 2c 20 22 69 6e 64 65 78 20 27 25  rrMsg, "index '%
225a0 71 27 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  q'", pIdx->zName
225b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
225c0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  for(j=0; j<pIdx-
225d0 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  >nKeyCol; j++){.
225e0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
225f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
22600 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
22610 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 7a 43  ]>=0 );.      zC
22620 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
22630 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
22640 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  ]].zName;.      
22650 69 66 28 20 6a 20 29 20 73 71 6c 69 74 65 33 53  if( j ) sqlite3S
22660 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 65  trAccumAppend(&e
22670 72 72 4d 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b  rrMsg, ", ", 2);
22680 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74  .      sqlite3St
22690 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28  rAccumAppendAll(
226a0 26 65 72 72 4d 73 67 2c 20 70 54 61 62 2d 3e 7a  &errMsg, pTab->z
226b0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
226c0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
226d0 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2e 22 2c  nd(&errMsg, ".",
226e0 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
226f0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
22700 41 6c 6c 28 26 65 72 72 4d 73 67 2c 20 7a 43 6f  All(&errMsg, zCo
22710 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  l);.    }.  }.  
22720 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 53 74  zErr = sqlite3St
22730 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 65 72  rAccumFinish(&er
22740 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
22750 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
22760 50 61 72 73 65 2c 20 0a 20 20 20 20 49 73 50 72  Parse, .    IsPr
22770 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
22780 64 78 29 20 3f 20 53 51 4c 49 54 45 5f 43 4f 4e  dx) ? SQLITE_CON
22790 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
227a0 45 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY .            
227b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227c0 3a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  : SQLITE_CONSTRA
227d0 49 4e 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20  INT_UNIQUE,.    
227e0 6f 6e 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50  onError, zErr, P
227f0 34 5f 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f  4_DYNAMIC, P5_Co
22800 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b  nstraintUnique);
22810 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  .}.../*.** Code 
22820 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74  an OP_Halt due t
22830 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77  o non-unique row
22840 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  id..*/.void sqli
22850 74 65 33 52 6f 77 69 64 43 6f 6e 73 74 72 61 69  te3RowidConstrai
22860 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
22870 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
22880 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
22890 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
228a0 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
228b0 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
228c0 68 6d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  hm */.  Table *p
228d0 54 61 62 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Tab       /* The
228e0 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
228f0 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64  non-unique rowid
22900 20 2a 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a   */ .){.  char *
22910 7a 4d 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  zMsg;.  int rc;.
22920 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
22930 79 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67  y>=0 ){.    zMsg
22940 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
22950 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25  f(pParse->db, "%
22960 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s.%s", pTab->zNa
22970 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
22980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
22990 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69  ab->aCol[pTab->i
229a0 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  PKey].zName);.  
229b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
229c0 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59  NSTRAINT_PRIMARY
229d0 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KEY;.  }else{.  
229e0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
229f0 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
22a00 64 62 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c 20  db, "%s.rowid", 
22a10 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
22a20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
22a30 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a  NSTRAINT_ROWID;.
22a40 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 6c    }.  sqlite3Hal
22a50 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
22a60 73 65 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c  se, rc, onError,
22a70 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
22a80 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  C,.             
22a90 20 20 20 20 20 20 20 20 20 20 20 50 35 5f 43 6f             P5_Co
22aa0 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b  nstraintUnique);
22ab0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
22ac0 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65 78  to see if pIndex
22ad0 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74   uses the collat
22ae0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
22af0 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  ll.  Return.** t
22b00 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 20 61  rue if it does a
22b10 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74 20 64  nd false if it d
22b20 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e  oes not..*/.#ifn
22b30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22b40 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69  REINDEX.static i
22b50 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63  nt collationMatc
22b60 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  h(const char *zC
22b70 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  oll, Index *pInd
22b80 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ex){.  int i;.  
22b90 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30  assert( zColl!=0
22ba0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
22bb0 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  <pIndex->nColumn
22bc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
22bd0 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64  t char *z = pInd
22be0 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  ex->azColl[i];. 
22bf0 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20     assert( z!=0 
22c00 7c 7c 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  || pIndex->aiCol
22c10 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20  umn[i]<0 );.    
22c20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  if( pIndex->aiCo
22c30 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d  lumn[i]>=0 && 0=
22c40 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
22c50 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  z, zColl) ){.   
22c60 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
22c70 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
22c80 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
22c90 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c  ** Recompute all
22ca0 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
22cb0 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63 6f   that use the co
22cc0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
22cd0 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43   pColl..** If pC
22ce0 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
22cf0 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
22d00 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69  s of pTab..*/.#i
22d10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22d20 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
22d30 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62   void reindexTab
22d40 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
22d50 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  , Table *pTab, c
22d60 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
22d70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
22d80 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
22d90 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
22da0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
22db0 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64  b */..  for(pInd
22dc0 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  ex=pTab->pIndex;
22dd0 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d   pIndex; pIndex=
22de0 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a  pIndex->pNext){.
22df0 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30      if( zColl==0
22e00 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74   || collationMat
22e10 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78  ch(zColl, pIndex
22e20 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
22e30 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
22e40 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
22e50 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
22e60 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ema);.      sqli
22e70 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
22e80 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
22e90 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
22ea0 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
22eb0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
22ec0 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   -1);.    }.  }.
22ed0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
22ee0 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
22ef0 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62  dices of all tab
22f00 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  les in all datab
22f10 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a  ases where the.*
22f20 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68  * indices use th
22f30 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
22f40 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20  ence pColl.  If 
22f50 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
22f60 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69  compute.** all i
22f70 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72  ndices everywher
22f80 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
22f90 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
22fa0 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  X.static void re
22fb0 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50  indexDatabases(P
22fc0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68  arse *pParse, ch
22fd0 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29  ar const *zColl)
22fe0 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  {.  Db *pDb;    
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23000 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61  /* A single data
23010 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  base */.  int iD
23020 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
23030 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
23040 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
23050 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
23060 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
23070 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
23080 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
23090 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b  /.  HashElem *k;
230a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230b0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
230c0 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44  ver tables in pD
230d0 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  b */.  Table *pT
230e0 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
230f0 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
23100 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
23110 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
23120 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c  te3BtreeHoldsAll
23130 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 20 20  Mutexes(db) );  
23140 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73 63  /* Needed for sc
23150 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a 20  hema access */. 
23160 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d   for(iDb=0, pDb=
23170 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d  db->aDb; iDb<db-
23180 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62  >nDb; iDb++, pDb
23190 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
231a0 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66   pDb!=0 );.    f
231b0 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46  or(k=sqliteHashF
231c0 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65  irst(&pDb->pSche
231d0 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b  ma->tblHash);  k
231e0 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; k=sqliteHashNe
231f0 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54  xt(k)){.      pT
23200 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c  ab = (Table*)sql
23210 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a  iteHashData(k);.
23220 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62        reindexTab
23230 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
23240 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20   zColl);.    }. 
23250 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
23260 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
23270 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58   for the REINDEX
23280 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
23290 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
232a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232b0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a            -- 1.*
232c0 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
232d0 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20    <collation>   
232e0 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32              -- 2
232f0 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
23300 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  EX  ?<database>.
23310 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d  ?<tablename>  --
23320 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   3.**        REI
23330 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65  NDEX  ?<database
23340 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20  >.?<indexname>  
23350 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20  -- 4.**.** Form 
23360 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64  1 causes all ind
23370 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61  ices in all atta
23380 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74  ched databases t
23390 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a  o be rebuilt..**
233a0 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73   Form 2 rebuilds
233b0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20   all indices in 
233c0 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74 68  all databases th
233d0 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64  at use the named
233e0 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  .** collating fu
233f0 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33  nction.  Forms 3
23400 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74   and 4 rebuild t
23410 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f  he named index o
23420 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73  r all.** indices
23430 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
23440 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
23450 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
23460 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
23470 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69  .void sqlite3Rei
23480 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
23490 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
234a0 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  1, Token *pName2
234b0 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
234c0 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
234d0 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
234e0 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69  quence to be rei
234f0 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  ndexed, or NULL 
23500 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20  */.  char *z;   
23510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23520 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61   /* Name of a ta
23530 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a  ble or index */.
23540 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
23550 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b;            /*
23560 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
23570 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65  abase */.  Table
23580 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
23590 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c         /* A tabl
235a0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
235b0 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
235c0 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
235d0 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61     /* An index a
235e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
235f0 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  Tab */.  int iDb
23600 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23610 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
23620 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65  base index numbe
23630 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
23640 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
23650 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
23660 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
23670 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61  .  Token *pObjNa
23680 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
23690 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
236a0 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20  ble or index to 
236b0 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a  be reindexed */.
236c0 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64  .  /* Read the d
236d0 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
236e0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
236f0 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
23700 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20  or message.  ** 
23710 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72  and code in pPar
23720 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  se and return NU
23730 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  LL. */.  if( SQL
23740 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
23750 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
23760 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
23770 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d  .  }..  if( pNam
23780 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69  e1==0 ){.    rei
23790 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
237a0 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65  arse, 0);.    re
237b0 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  turn;.  }else if
237c0 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d  ( NEVER(pName2==
237d0 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d  0) || pName2->z=
237e0 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
237f0 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72  zColl;.    asser
23800 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a  t( pName1->z );.
23810 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69      zColl = sqli
23820 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
23830 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
23840 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  me1);.    if( !z
23850 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20  Coll ) return;. 
23860 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
23870 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
23880 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
23890 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , 0);.    if( pC
238a0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69  oll ){.      rei
238b0 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
238c0 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  arse, zColl);.  
238d0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
238e0 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
238f0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
23900 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
23910 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
23920 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
23930 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
23940 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
23950 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65  Name2, &pObjName
23960 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29  );.  if( iDb<0 )
23970 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73   return;.  z = s
23980 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
23990 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65  ken(db, pObjName
239a0 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
239b0 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20  return;.  zDb = 
239c0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
239d0 53 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20  SName;.  pTab = 
239e0 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
239f0 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20  (db, z, zDb);.  
23a00 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
23a10 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61  reindexTable(pPa
23a20 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20  rse, pTab, 0);. 
23a30 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
23a40 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74  (db, z);.    ret
23a50 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65  urn;.  }.  pInde
23a60 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
23a70 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29  ndex(db, z, zDb)
23a80 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
23a90 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20  e(db, z);.  if( 
23aa0 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71  pIndex ){.    sq
23ab0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
23ac0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
23ad0 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   0, iDb);.    sq
23ae0 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
23af0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
23b00 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
23b10 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
23b20 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
23b30 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74  "unable to ident
23b40 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74  ify the object t
23b50 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29  o be reindexed")
23b60 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
23b70 2a 20 52 65 74 75 72 6e 20 61 20 4b 65 79 49 6e  * Return a KeyIn
23b80 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
23b90 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  t is appropriate
23ba0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 49   for the given I
23bb0 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ndex..**.** The 
23bc0 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 69 6e  caller should in
23bd0 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b 65 79 49  voke sqlite3KeyI
23be0 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e 20 74 68  nfoUnref() on th
23bf0 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63  e returned objec
23c00 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73  t.** when it has
23c10 20 66 69 6e 69 73 68 65 64 20 75 73 69 6e 67 20   finished using 
23c20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a  it..*/.KeyInfo *
23c30 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
23c40 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
23c50 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  rse, Index *pIdx
23c60 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
23c70 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e  t nCol = pIdx->n
23c80 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 4b  Column;.  int nK
23c90 65 79 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43  ey = pIdx->nKeyC
23ca0 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ol;.  KeyInfo *p
23cb0 4b 65 79 3b 0a 20 20 69 66 28 20 70 50 61 72 73  Key;.  if( pPars
23cc0 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
23cd0 20 30 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e   0;.  if( pIdx->
23ce0 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20  uniqNotNull ){. 
23cf0 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65     pKey = sqlite
23d00 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50  3KeyInfoAlloc(pP
23d10 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20  arse->db, nKey, 
23d20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20 7d 65  nCol-nKey);.  }e
23d30 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20  lse{.    pKey = 
23d40 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
23d50 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
23d60 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  nCol, 0);.  }.  
23d70 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
23d80 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
23d90 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
23da0 65 28 70 4b 65 79 29 20 29 3b 0a 20 20 20 20 66  e(pKey) );.    f
23db0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
23dc0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  i++){.      cons
23dd0 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20  t char *zColl = 
23de0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b  pIdx->azColl[i];
23df0 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f  .      pKey->aCo
23e00 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3d 3d 73  ll[i] = zColl==s
23e10 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 20  qlite3StrBINARY 
23e20 3f 20 30 20 3a 0a 20 20 20 20 20 20 20 20 20 20  ? 0 :.          
23e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
23e40 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
23e50 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  eq(pParse, zColl
23e60 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61  );.      pKey->a
23e70 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
23e80 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
23e90 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  i];.    }.    if
23ea0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
23eb0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
23ec0 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49  pParse->rc==SQLI
23ed0 54 45 5f 45 52 52 4f 52 5f 4d 49 53 53 49 4e 47  TE_ERROR_MISSING
23ee0 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20 20 20  _COLLSEQ );.    
23ef0 20 20 69 66 28 20 70 49 64 78 2d 3e 62 4e 6f 51    if( pIdx->bNoQ
23f00 75 65 72 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  uery==0 ){.     
23f10 20 20 20 2f 2a 20 44 65 61 63 74 69 76 61 74 65     /* Deactivate
23f20 20 74 68 65 20 69 6e 64 65 78 20 62 65 63 61 75   the index becau
23f30 73 65 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61  se it contains a
23f40 6e 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 6c 61 74  n unknown collat
23f50 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  ing.        ** s
23f60 65 71 75 65 6e 63 65 2e 20 20 54 68 65 20 6f 6e  equence.  The on
23f70 6c 79 20 77 61 79 20 74 6f 20 72 65 61 63 74 69  ly way to reacti
23f80 76 65 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  ve the index is 
23f90 74 6f 20 72 65 6c 6f 61 64 20 74 68 65 0a 20 20  to reload the.  
23fa0 20 20 20 20 20 20 2a 2a 20 73 63 68 65 6d 61 2e        ** schema.
23fb0 20 20 41 64 64 69 6e 67 20 74 68 65 20 6d 69 73    Adding the mis
23fc0 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6e 67 20 73  sing collating s
23fd0 65 71 75 65 6e 63 65 20 6c 61 74 65 72 20 64 6f  equence later do
23fe0 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  es not.        *
23ff0 2a 20 72 65 61 63 74 69 76 65 20 74 68 65 20 69  * reactive the i
24000 6e 64 65 78 2e 20 20 54 68 65 20 61 70 70 6c 69  ndex.  The appli
24010 63 61 74 69 6f 6e 20 68 61 64 20 74 68 65 20 63  cation had the c
24020 68 61 6e 63 65 20 74 6f 20 72 65 67 69 73 74 65  hance to registe
24030 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  r.        ** the
24040 20 6d 69 73 73 69 6e 67 20 69 6e 64 65 78 20 75   missing index u
24050 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69  sing the collati
24060 6f 6e 2d 6e 65 65 64 65 64 20 63 61 6c 6c 62 61  on-needed callba
24070 63 6b 2e 20 20 46 6f 72 0a 20 20 20 20 20 20 20  ck.  For.       
24080 20 2a 2a 20 73 69 6d 70 6c 69 63 69 74 79 2c 20   ** simplicity, 
24090 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
240a0 67 69 76 65 20 74 68 65 20 61 70 70 6c 69 63 61  give the applica
240b0 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20 63 68  tion a second ch
240c0 61 6e 63 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ance..        */
240d0 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 62  .        pIdx->b
240e0 4e 6f 51 75 65 72 79 20 3d 20 31 3b 0a 20 20 20  NoQuery = 1;.   
240f0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
24100 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f 52  = SQLITE_ERROR_R
24110 45 54 52 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ETRY;.      }.  
24120 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
24130 66 6f 55 6e 72 65 66 28 70 4b 65 79 29 3b 0a 20  foUnref(pKey);. 
24140 20 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20       pKey = 0;. 
24150 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
24160 6e 20 70 4b 65 79 3b 0a 7d 0a 0a 23 69 66 6e 64  n pKey;.}..#ifnd
24170 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
24180 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72  TE./* .** This r
24190 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
241a0 64 20 6f 6e 63 65 20 70 65 72 20 43 54 45 20 62  d once per CTE b
241b0 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
241c0 6c 65 20 70 61 72 73 69 6e 67 20 61 20 0a 2a 2a  le parsing a .**
241d0 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 0a 2a   WITH clause. .*
241e0 2f 0a 57 69 74 68 20 2a 73 71 6c 69 74 65 33 57  /.With *sqlite3W
241f0 69 74 68 41 64 64 28 0a 20 20 50 61 72 73 65 20  ithAdd(.  Parse 
24200 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
24210 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
24220 74 65 78 74 20 2a 2f 0a 20 20 57 69 74 68 20 2a  text */.  With *
24230 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20 20  pWith,          
24240 20 20 2f 2a 20 45 78 69 73 74 69 6e 67 20 57 49    /* Existing WI
24250 54 48 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55  TH clause, or NU
24260 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
24270 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
24280 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
24290 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a 2f 0a 20  ommon-table */. 
242a0 20 45 78 70 72 4c 69 73 74 20 2a 70 41 72 67 6c   ExprList *pArgl
242b0 69 73 74 2c 20 20 20 20 20 2f 2a 20 4f 70 74 69  ist,     /* Opti
242c0 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  onal column name
242d0 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 74 61   list for the ta
242e0 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ble */.  Select 
242f0 2a 70 51 75 65 72 79 20 20 20 20 20 20 20 20 20  *pQuery         
24300 20 2f 2a 20 51 75 65 72 79 20 75 73 65 64 20 74   /* Query used t
24310 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
24320 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73   table */.){.  s
24330 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
24340 72 73 65 2d 3e 64 62 3b 0a 20 20 57 69 74 68 20  rse->db;.  With 
24350 2a 70 4e 65 77 3b 0a 20 20 63 68 61 72 20 2a 7a  *pNew;.  char *z
24360 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  Name;..  /* Chec
24370 6b 20 74 68 61 74 20 74 68 65 20 43 54 45 20 6e  k that the CTE n
24380 61 6d 65 20 69 73 20 75 6e 69 71 75 65 20 77 69  ame is unique wi
24390 74 68 69 6e 20 74 68 69 73 20 57 49 54 48 20 63  thin this WITH c
243a0 6c 61 75 73 65 2e 20 49 66 0a 20 20 2a 2a 20 6e  lause. If.  ** n
243b0 6f 74 2c 20 73 74 6f 72 65 20 61 6e 20 65 72 72  ot, store an err
243c0 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73 65 20  or in the Parse 
243d0 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
243e0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
243f0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
24400 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b  rse->db, pName);
24410 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20  .  if( zName && 
24420 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74  pWith ){.    int
24430 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
24440 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20   i<pWith->nCte; 
24450 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
24460 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
24470 4e 61 6d 65 2c 20 70 57 69 74 68 2d 3e 61 5b 69  Name, pWith->a[i
24480 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
24490 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
244a0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
244b0 64 75 70 6c 69 63 61 74 65 20 57 49 54 48 20 74  duplicate WITH t
244c0 61 62 6c 65 20 6e 61 6d 65 3a 20 25 73 22 2c 20  able name: %s", 
244d0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
244e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
244f0 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e   pWith ){.    in
24500 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
24510 28 2a 70 57 69 74 68 29 20 2b 20 28 73 69 7a 65  (*pWith) + (size
24520 6f 66 28 70 57 69 74 68 2d 3e 61 5b 31 5d 29 20  of(pWith->a[1]) 
24530 2a 20 70 57 69 74 68 2d 3e 6e 43 74 65 29 3b 0a  * pWith->nCte);.
24540 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
24550 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
24560 70 57 69 74 68 2c 20 6e 42 79 74 65 29 3b 0a 20  pWith, nByte);. 
24570 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
24580 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
24590 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
245a0 66 28 2a 70 57 69 74 68 29 29 3b 0a 20 20 7d 0a  f(*pWith));.  }.
245b0 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 21    assert( (pNew!
245c0 3d 30 20 26 26 20 7a 4e 61 6d 65 21 3d 30 29 20  =0 && zName!=0) 
245d0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
245e0 6c 65 64 20 29 3b 0a 0a 20 20 69 66 28 20 64 62  led );..  if( db
245f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
24600 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
24610 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
24620 70 41 72 67 6c 69 73 74 29 3b 0a 20 20 20 20 73  pArglist);.    s
24630 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
24640 74 65 28 64 62 2c 20 70 51 75 65 72 79 29 3b 0a  te(db, pQuery);.
24650 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
24660 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
24670 20 20 70 4e 65 77 20 3d 20 70 57 69 74 68 3b 0a    pNew = pWith;.
24680 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
24690 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d  w->a[pNew->nCte]
246a0 2e 70 53 65 6c 65 63 74 20 3d 20 70 51 75 65 72  .pSelect = pQuer
246b0 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70  y;.    pNew->a[p
246c0 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 43 6f 6c 73  New->nCte].pCols
246d0 20 3d 20 70 41 72 67 6c 69 73 74 3b 0a 20 20 20   = pArglist;.   
246e0 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
246f0 43 74 65 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  Cte].zName = zNa
24700 6d 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  me;.    pNew->a[
24710 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 43 74 65  pNew->nCte].zCte
24720 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Err = 0;.    pNe
24730 77 2d 3e 6e 43 74 65 2b 2b 3b 0a 20 20 7d 0a 0a  w->nCte++;.  }..
24740 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
24750 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
24760 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
24770 20 57 69 74 68 20 6f 62 6a 65 63 74 20 70 61 73   With object pas
24780 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
24790 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76  d argument..*/.v
247a0 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74 68 44  oid sqlite3WithD
247b0 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
247c0 62 2c 20 57 69 74 68 20 2a 70 57 69 74 68 29 7b  b, With *pWith){
247d0 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a  .  if( pWith ){.
247e0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
247f0 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d  or(i=0; i<pWith-
24800 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
24810 20 20 20 73 74 72 75 63 74 20 43 74 65 20 2a 70     struct Cte *p
24820 43 74 65 20 3d 20 26 70 57 69 74 68 2d 3e 61 5b  Cte = &pWith->a[
24830 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  i];.      sqlite
24840 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
24850 64 62 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 29  db, pCte->pCols)
24860 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
24870 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
24880 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  pCte->pSelect);.
24890 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
248a0 72 65 65 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e  ree(db, pCte->zN
248b0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
248c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
248d0 2c 20 70 57 69 74 68 29 3b 0a 20 20 7d 0a 7d 0a  , pWith);.  }.}.
248e0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
248f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
24900 54 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  TE) */..#ifndef 
24910 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 50 53 45  SQLITE_OMIT_UPSE
24920 52 54 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  RT./*.** Free a 
24930 6c 69 73 74 20 6f 66 20 55 70 73 65 72 74 20 6f  list of Upsert o
24940 62 6a 65 63 74 73 0a 2a 2f 0a 76 6f 69 64 20 73  bjects.*/.void s
24950 71 6c 69 74 65 33 55 70 73 65 72 74 44 65 6c 65  qlite3UpsertDele
24960 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
24970 55 70 73 65 72 74 20 2a 70 29 7b 0a 20 20 77 68  Upsert *p){.  wh
24980 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 55 70  ile( p ){.    Up
24990 73 65 72 74 20 2a 70 4e 65 78 74 20 3d 20 70 2d  sert *pNext = p-
249a0 3e 70 55 70 73 65 72 74 4e 65 78 74 3b 0a 20 20  >pUpsertNext;.  
249b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
249c0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
249d0 55 70 73 65 72 74 54 61 72 67 65 74 29 3b 0a 20  UpsertTarget);. 
249e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
249f0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
24a00 70 55 70 73 65 72 74 53 65 74 29 3b 0a 20 20 20  pUpsertSet);.   
24a10 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
24a20 62 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70  b, p);.    p = p
24a30 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Next;.  }.}.#end
24a40 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
24a50 54 5f 55 50 53 45 52 54 20 2a 2f 0a 0a 23 69 66  T_UPSERT */..#if
24a60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24a70 5f 55 50 53 45 52 54 0a 2f 2a 0a 2a 2a 20 44 75  _UPSERT./*.** Du
24a80 70 6c 69 63 61 74 65 20 61 6e 20 55 70 73 65 72  plicate an Upser
24a90 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 55 70 73 65  t object.*/.Upse
24aa0 72 74 20 2a 73 71 6c 69 74 65 33 55 70 73 65 72  rt *sqlite3Upser
24ab0 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
24ac0 2c 20 55 70 73 65 72 74 20 2a 70 29 7b 0a 20 20  , Upsert *p){.  
24ad0 55 70 73 65 72 74 20 2a 70 4e 65 77 3b 0a 20 20  Upsert *pNew;.  
24ae0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
24af0 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
24b00 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
24b10 28 64 62 2c 20 73 69 7a 65 6f 66 28 55 70 73 65  (db, sizeof(Upse
24b20 72 74 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  rt));.  if( pNew
24b30 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
24b40 20 20 70 4e 65 77 2d 3e 70 55 70 73 65 72 74 54    pNew->pUpsertT
24b50 61 72 67 65 74 20 3d 20 73 71 6c 69 74 65 33 45  arget = sqlite3E
24b60 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
24b70 2d 3e 70 55 70 73 65 72 74 54 61 72 67 65 74 2c  ->pUpsertTarget,
24b80 20 30 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 70   0);.  pNew->pUp
24b90 73 65 72 74 53 65 74 20 3d 20 73 71 6c 69 74 65  sertSet = sqlite
24ba0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
24bb0 20 70 2d 3e 70 55 70 73 65 72 74 53 65 74 2c 20   p->pUpsertSet, 
24bc0 30 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 70 73  0);.  pNew->pUps
24bd0 65 72 74 4e 65 78 74 20 3d 20 73 71 6c 69 74 65  ertNext = sqlite
24be0 33 55 70 73 65 72 74 44 75 70 28 64 62 2c 20 70  3UpsertDup(db, p
24bf0 2d 3e 70 55 70 73 65 72 74 4e 65 78 74 29 3b 0a  ->pUpsertNext);.
24c00 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
24c10 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
24c20 45 5f 4f 4d 49 54 5f 55 50 53 45 52 54 20 2a 2f  E_OMIT_UPSERT */
24c30 0a                                               .