/ Hex Artifact Content
Login

Artifact 80f9e220e3a519e3a78324f20826285f473fe99b9ae5c95267b98f302013fe74:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e   ){.    /* A min
1c40: 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73  imum of one curs
1c50: 6f 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69  or is required i
1c60: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
1c70: 69 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53  is used.    *  S
1c80: 65 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33  ee ticket [a6963
1c90: 37 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20  79c1f08866] */. 
1ca0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1cb0: 65 2d 3e 70 41 69 6e 63 3d 3d 30 20 7c 7c 20 70  e->pAinc==0 || p
1cc0: 50 61 72 73 65 2d 3e 6e 54 61 62 3e 30 20 29 3b  Parse->nTab>0 );
1cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ce0: 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61  MakeReady(v, pPa
1cf0: 72 73 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  rse);.    pParse
1d00: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f  ->rc = SQLITE_DO
1d10: 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
1d20: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
1d30: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1d40: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65  }../*.** Run the
1d50: 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65   parser and code
1d60: 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72   generator recur
1d70: 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20  sively in order 
1d80: 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63  to generate.** c
1d90: 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20  ode for the SQL 
1da0: 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
1db0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
1dc0: 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65  the pParse conte
1dd0: 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  xt.** currently 
1de0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1df0: 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61  on.  When the pa
1e00: 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75  rser is run recu
1e10: 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20  rsively.** this 
1e20: 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f  way, the final O
1e30: 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70  P_Halt is not ap
1e40: 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72  pended and other
1e50: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
1e60: 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74  ** and finalizat
1e70: 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d  ion steps are om
1e80: 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68  itted because th
1e90: 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67  ose are handling
1ea0: 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72   by the.** outer
1eb0: 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a  most parser..**.
1ec0: 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e  ** Not everythin
1ed0: 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20  g is nestable.  
1ee0: 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73  This facility is
1ef0: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72   designed to per
1f00: 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55  mit.** INSERT, U
1f10: 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54  PDATE, and DELET
1f20: 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61  E operations aga
1f30: 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54  inst SQLITE_MAST
1f40: 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65  ER.  Use.** care
1f50: 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74   if you decide t
1f60: 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69  o try to use thi
1f70: 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f  s routine for so
1f80: 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1f90: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1fa0: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61  e3NestedParse(Pa
1fb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
1fc0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1fd0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1fe0: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
1ff0: 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
2000: 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Msg = 0;.  sqlit
2010: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
2020: 3e 64 62 3b 0a 20 20 63 68 61 72 20 73 61 76 65  >db;.  char save
2030: 42 75 66 5b 50 41 52 53 45 5f 54 41 49 4c 5f 53  Buf[PARSE_TAIL_S
2040: 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Z];..  if( pPars
2050: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
2060: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
2070: 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b  se->nested<10 );
2080: 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f    /* Nesting sho
2090: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c  uld only be of l
20a0: 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a  imited depth */.
20b0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
20c0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20  Format);.  zSql 
20d0: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
20e0: 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  f(db, zFormat, a
20f0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
2100: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
2110: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20  ){.    return;  
2120: 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73   /* A malloc mus
2130: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f  t have failed */
2140: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
2150: 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70  ested++;.  memcp
2160: 79 28 73 61 76 65 42 75 66 2c 20 50 41 52 53 45  y(saveBuf, PARSE
2170: 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50  _TAIL(pParse), P
2180: 41 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20  ARSE_TAIL_SZ);. 
2190: 20 6d 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41   memset(PARSE_TA
21a0: 49 4c 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50  IL(pParse), 0, P
21b0: 41 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20  ARSE_TAIL_SZ);. 
21c0: 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65   sqlite3RunParse
21d0: 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20  r(pParse, zSql, 
21e0: 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c  &zErrMsg);.  sql
21f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
2200: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
2210: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71  e3DbFree(db, zSq
2220: 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41 52  l);.  memcpy(PAR
2230: 53 45 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c  SE_TAIL(pParse),
2240: 20 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f   saveBuf, PARSE_
2250: 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61 72  TAIL_SZ);.  pPar
2260: 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a  se->nested--;.}.
2270: 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52  .#if SQLITE_USER
2280: 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
2290: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
22a0: 45 20 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74  E if zTable is t
22b0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73  he name of the s
22c0: 79 73 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74  ystem table that
22d0: 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c   stores the.** l
22e0: 69 73 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64  ist of users and
22f0: 20 74 68 65 69 72 20 61 63 63 65 73 73 20 63 72   their access cr
2300: 65 64 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e  edentials..*/.in
2310: 74 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  t sqlite3UserAut
2320: 68 54 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61  hTable(const cha
2330: 72 20 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65  r *zTable){.  re
2340: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72  turn sqlite3_str
2350: 69 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71  icmp(zTable, "sq
2360: 6c 69 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a  lite_user")==0;.
2370: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
2380: 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65  If this database
2390: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
23a0: 6f 70 65 6e 65 64 20 77 69 74 68 20 74 68 65 20  opened with the 
23b0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
23c0: 45 44 5f 53 43 48 45 4d 41 0a 2a 2a 20 66 6c 61  ED_SCHEMA.** fla
23d0: 67 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65  g specified, the
23e0: 6e 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  n ensure that th
23f0: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
2400: 61 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 69  a for database i
2410: 44 62 0a 2a 2a 20 69 73 20 6c 6f 61 64 65 64 2e  Db.** is loaded.
2420: 20 45 69 74 68 65 72 20 62 79 20 6f 62 74 61 69   Either by obtai
2430: 6e 69 6e 67 20 61 20 53 63 68 65 6d 61 20 6f 62  ning a Schema ob
2440: 6a 65 63 74 20 66 72 6f 6d 20 74 68 65 20 73 63  ject from the sc
2450: 68 65 6d 61 2d 70 6f 6f 6c 2c 20 6f 72 0a 2a 2a  hema-pool, or.**
2460: 20 62 79 20 72 65 61 64 69 6e 67 20 74 68 65 20   by reading the 
2470: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2480: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
2490: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
24a0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
24b0: 65 20 77 61 73 20 6e 6f 74 20 6f 70 65 6e 65 64  e was not opened
24c0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45   with SQLITE_OPE
24d0: 4e 5f 53 48 41 52 45 44 5f 53 43 48 45 4d 41 2c  N_SHARED_SCHEMA,
24e0: 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 20 73 63   or.** if the sc
24f0: 68 65 6d 61 20 66 6f 72 20 64 61 74 61 62 61 73  hema for databas
2500: 65 20 69 44 62 20 69 73 20 61 6c 72 65 61 64 79  e iDb is already
2510: 20 6c 6f 61 64 65 64 2c 20 74 68 69 73 20 66 75   loaded, this fu
2520: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
2530: 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 7a 65 72  p..**.** Non-zer
2540: 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  o is returned if
2550: 20 61 20 73 63 68 65 6d 61 20 69 73 20 6c 6f 61   a schema is loa
2560: 64 65 64 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20  ded, or zero if 
2570: 69 74 20 77 61 73 20 61 6c 72 65 61 64 79 20 0a  it was already .
2580: 2a 2a 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74  ** loaded when t
2590: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
25a0: 20 63 61 6c 6c 65 64 2e 2e 0a 2a 2f 0a 69 6e 74   called...*/.int
25b0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4c 6f   sqlite3SchemaLo
25c0: 61 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ad(sqlite3 *db, 
25d0: 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 2a 70 62  int iDb, int *pb
25e0: 55 6e 6c 6f 61 64 2c 20 63 68 61 72 20 2a 2a 70  Unload, char **p
25f0: 7a 45 72 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  zErr){.  int rc 
2600: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
2610: 66 28 20 49 73 52 65 75 73 65 53 63 68 65 6d 61  f( IsReuseSchema
2620: 28 64 62 29 20 0a 20 20 20 20 20 20 26 26 20 44  (db) .      && D
2630: 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
2640: 20 69 44 62 2c 20 44 42 5f 53 63 68 65 6d 61 4c   iDb, DB_SchemaL
2650: 6f 61 64 65 64 29 3d 3d 30 20 0a 20 20 20 20 20  oaded)==0 .     
2660: 20 26 26 20 28 64 62 2d 3e 69 6e 69 74 2e 62 75   && (db->init.bu
2670: 73 79 3d 3d 30 20 7c 7c 20 28 69 44 62 21 3d 31  sy==0 || (iDb!=1
2680: 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62   && db->init.iDb
2690: 3d 3d 31 29 29 0a 20 20 29 7b 0a 20 20 20 20 73  ==1)).  ){.    s
26a0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 49 6e 69  truct sqlite3Ini
26b0: 74 49 6e 66 6f 20 73 76 20 3d 20 64 62 2d 3e 69  tInfo sv = db->i
26c0: 6e 69 74 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  nit;.    memset(
26d0: 26 64 62 2d 3e 69 6e 69 74 2c 20 30 2c 20 73 69  &db->init, 0, si
26e0: 7a 65 6f 66 28 73 74 72 75 63 74 20 73 71 6c 69  zeof(struct sqli
26f0: 74 65 33 49 6e 69 74 49 6e 66 6f 29 29 3b 0a 20  te3InitInfo));. 
2700: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49     rc = sqlite3I
2710: 6e 69 74 4f 6e 65 28 64 62 2c 20 69 44 62 2c 20  nitOne(db, iDb, 
2720: 70 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20 20 64  pzErr, 0);.    d
2730: 62 2d 3e 69 6e 69 74 20 3d 20 73 76 3b 0a 20 20  b->init = sv;.  
2740: 20 20 2a 70 62 55 6e 6c 6f 61 64 20 3d 20 28 69    *pbUnload = (i
2750: 44 62 21 3d 31 29 3b 0a 20 20 7d 0a 20 20 72 65  Db!=1);.  }.  re
2760: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2770: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
2780: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
2790: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
27a0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
27b0: 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67  abase.** table g
27c0: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
27d0: 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   that table and 
27e0: 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65  (optionally) the
27f0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
2800: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
2810: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ing the table.  
2820: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
2830: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  ot found..**.** 
2840: 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20  If zDatabase is 
2850: 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  0, all databases
2860: 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f   are searched fo
2870: 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  r the table and 
2880: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74  the.** first mat
2890: 63 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72  ching table is r
28a0: 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68  eturned.  (No ch
28b0: 65 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69  ecking for dupli
28c0: 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61  cate table.** na
28d0: 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54  mes is done.)  T
28e0: 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20  he search order 
28f0: 69 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74  is TEMP first, t
2900: 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61  hen MAIN, then a
2910: 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20  ny.** auxiliary 
2920: 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64 20  databases added 
2930: 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48  using the ATTACH
2940: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
2950: 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
2960: 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a  LocateTable()..*
2970: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
2980: 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65  FindTable(sqlite
2990: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
29a0: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
29b0: 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29  char *zDatabase)
29c0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30  {.  Table *p = 0
29d0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  ;.  int i;..  /*
29e0: 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72 65   All mutexes are
29f0: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 63   required for sc
2a00: 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d 61  hema access.  Ma
2a10: 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64 20  ke sure we hold 
2a20: 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72  them. */.  asser
2a30: 74 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20  t( zDatabase!=0 
2a40: 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  || sqlite3BtreeH
2a50: 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64  oldsAllMutexes(d
2a60: 62 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  b) );.#if SQLITE
2a70: 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
2a80: 54 49 4f 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74  TION.  /* Only t
2a90: 68 65 20 61 64 6d 69 6e 20 75 73 65 72 20 69 73  he admin user is
2aa0: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f 77   allowed to know
2ab0: 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
2ac0: 5f 75 73 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a  _user table.  **
2ad0: 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 66 28   exists */.  if(
2ae0: 20 64 62 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65   db->auth.authLe
2af0: 76 65 6c 3c 55 41 55 54 48 5f 41 64 6d 69 6e 20  vel<UAUTH_Admin 
2b00: 26 26 20 73 71 6c 69 74 65 33 55 73 65 72 41 75  && sqlite3UserAu
2b10: 74 68 54 61 62 6c 65 28 7a 4e 61 6d 65 29 21 3d  thTable(zName)!=
2b20: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2b30: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
2b40: 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 66 6f  while(1){.    fo
2b50: 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b  r(i=OMIT_TEMPDB;
2b60: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
2b70: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20  {.      int j = 
2b80: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
2b90: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d     /* Search TEM
2ba0: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
2bb0: 0a 20 20 20 20 20 20 69 66 28 20 7a 44 61 74 61  .      if( zData
2bc0: 62 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  base==0 || sqlit
2bd0: 65 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62  e3StrICmp(zDatab
2be0: 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  ase, db->aDb[j].
2bf0: 7a 44 62 53 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  zDbSName)==0 ){.
2c00: 20 20 20 20 20 20 20 20 69 6e 74 20 62 55 6e 6c          int bUnl
2c10: 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  oad = 0;.       
2c20: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2c30: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
2c40: 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20  db, j, 0) );.   
2c50: 20 20 20 20 20 69 66 28 20 49 73 52 65 75 73 65       if( IsReuse
2c60: 53 63 68 65 6d 61 28 64 62 29 20 29 7b 0a 20 20  Schema(db) ){.  
2c70: 20 20 20 20 20 20 20 20 50 61 72 73 65 20 2a 70          Parse *p
2c80: 50 61 72 73 65 20 3d 20 64 62 2d 3e 70 50 61 72  Parse = db->pPar
2c90: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se;.          if
2ca0: 28 20 70 50 61 72 73 65 20 26 26 20 70 50 61 72  ( pParse && pPar
2cb0: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
2cc0: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
2cd0: 65 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 53  e->rc = sqlite3S
2ce0: 63 68 65 6d 61 4c 6f 61 64 28 64 62 2c 20 6a 2c  chemaLoad(db, j,
2cf0: 20 26 62 55 6e 6c 6f 61 64 2c 20 26 70 50 61 72   &bUnload, &pPar
2d00: 73 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  se->zErrMsg);.  
2d10: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
2d20: 61 72 73 65 2d 3e 72 63 20 29 20 70 50 61 72 73  arse->rc ) pPars
2d30: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
2d40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2d50: 0a 20 20 20 20 20 20 20 20 70 20 3d 20 73 71 6c  .        p = sql
2d60: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
2d70: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
2d80: 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65  ->tblHash, zName
2d90: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2da0: 20 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20   ) return p;.   
2db0: 20 20 20 20 20 69 66 28 20 62 55 6e 6c 6f 61 64       if( bUnload
2dc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2dd0: 6c 69 74 65 33 53 63 68 65 6d 61 52 65 6c 65 61  lite3SchemaRelea
2de0: 73 65 28 64 62 2c 20 6a 29 3b 0a 20 20 20 20 20  se(db, j);.     
2df0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2e00: 20 7d 0a 20 20 20 20 2f 2a 20 4e 6f 74 20 66 6f   }.    /* Not fo
2e10: 75 6e 64 2e 20 20 49 66 20 74 68 65 20 6e 61 6d  und.  If the nam
2e20: 65 20 77 65 20 77 65 72 65 20 6c 6f 6f 6b 69 6e  e we were lookin
2e30: 67 20 66 6f 72 20 77 61 73 20 74 65 6d 70 2e 73  g for was temp.s
2e40: 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 20  qlite_master.   
2e50: 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 20   ** then change 
2e60: 74 68 65 20 6e 61 6d 65 20 74 6f 20 73 71 6c 69  the name to sqli
2e70: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 61  te_temp_master a
2e80: 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20 2a 2f  nd try again. */
2e90: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2ea0: 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 4d  StrICmp(zName, M
2eb0: 41 53 54 45 52 5f 4e 41 4d 45 29 21 3d 30 20 29  ASTER_NAME)!=0 )
2ec0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
2ed0: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
2ee0: 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61  zDatabase, db->a
2ef0: 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65 29 21  Db[1].zDbSName)!
2f00: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
2f10: 7a 4e 61 6d 65 20 3d 20 54 45 4d 50 5f 4d 41 53  zName = TEMP_MAS
2f20: 54 45 52 5f 4e 41 4d 45 3b 0a 20 20 7d 0a 20 20  TER_NAME;.  }.  
2f30: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2f40: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
2f50: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
2f60: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
2f70: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
2f80: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
2f90: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
2fa0: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
2fb0: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
2fc0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
2fd0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
2fe0: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
2ff0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
3000: 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f  not found.  Also
3010: 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72   leave an.** err
3020: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
3030: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
3040: 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
3050: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
3060: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c   routine and sql
3070: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20  ite3FindTable() 
3080: 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
3090: 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61  routine leaves a
30a0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
30b0: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
30c0: 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69  sg where.** sqli
30d0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64  te3FindTable() d
30e0: 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c  oes not..*/.Tabl
30f0: 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  e *sqlite3Locate
3100: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
3110: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
3120: 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68  /* context in wh
3130: 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72  ich to report er
3140: 72 6f 72 73 20 2a 2f 0a 20 20 75 33 32 20 66 6c  rors */.  u32 fl
3150: 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
3160: 20 2f 2a 20 4c 4f 43 41 54 45 5f 56 49 45 57 20   /* LOCATE_VIEW 
3170: 6f 72 20 4c 4f 43 41 54 45 5f 4e 4f 45 52 52 20  or LOCATE_NOERR 
3180: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
3190: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e  *zName,     /* N
31a0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
31b0: 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20   we are looking 
31c0: 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  for */.  const c
31d0: 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20 20  har *zDbase     
31e0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
31f0: 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74 20  atabase.  Might 
3200: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
3210: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69  Table *p;.  sqli
3220: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
3230: 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  ->db;..  /* Read
3240: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
3250: 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f  hema. If an erro
3260: 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
3270: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
3280: 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69  .  ** and code i
3290: 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
32a0: 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69  urn NULL. */.  i
32b0: 66 28 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73  f( (db->mDbFlags
32c0: 20 26 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61   & DBFLAG_Schema
32d0: 4b 6e 6f 77 6e 4f 6b 29 3d 3d 30 20 0a 20 20 20  KnownOk)==0 .   
32e0: 26 26 20 21 49 73 52 65 75 73 65 53 63 68 65 6d  && !IsReuseSchem
32f0: 61 28 64 62 29 0a 20 20 20 26 26 20 53 51 4c 49  a(db).   && SQLI
3300: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
3310: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
3320: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
3330: 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73   0;.  }..  p = s
3340: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
3350: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73  db, zName, zDbas
3360: 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
3370: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
3380: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
3390: 4c 45 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61  LE.    /* If zNa
33a0: 6d 65 20 69 73 20 74 68 65 20 6e 6f 74 20 74 68  me is the not th
33b0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  e name of a tabl
33c0: 65 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20  e in the schema 
33d0: 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a 20 20  created using.  
33e0: 20 20 2a 2a 20 43 52 45 41 54 45 2c 20 74 68 65    ** CREATE, the
33f0: 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  n check to see i
3400: 66 20 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65  f it is the name
3410: 20 6f 66 20 61 6e 20 76 69 72 74 75 61 6c 20 74   of an virtual t
3420: 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  able that.    **
3430: 20 63 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79   can be an epony
3440: 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61 62  mous virtual tab
3450: 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  le. */.    if( p
3460: 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 56 74  Parse->disableVt
3470: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d  ab==0 ){.      M
3480: 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d  odule *pMod = (M
3490: 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 33 48 61  odule*)sqlite3Ha
34a0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64  shFind(&db->aMod
34b0: 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ule, zName);.   
34c0: 20 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20 26     if( pMod==0 &
34d0: 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  & sqlite3_strnic
34e0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d  mp(zName, "pragm
34f0: 61 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20  a_", 7)==0 ){.  
3500: 20 20 20 20 20 20 70 4d 6f 64 20 3d 20 73 71 6c        pMod = sql
3510: 69 74 65 33 50 72 61 67 6d 61 56 74 61 62 52 65  ite3PragmaVtabRe
3520: 67 69 73 74 65 72 28 64 62 2c 20 7a 4e 61 6d 65  gister(db, zName
3530: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3540: 20 69 66 28 20 70 4d 6f 64 20 29 7b 0a 20 20 20   if( pMod ){.   
3550: 20 20 20 20 20 69 66 28 20 49 73 52 65 75 73 65       if( IsReuse
3560: 53 63 68 65 6d 61 28 64 62 29 20 26 26 20 70 50  Schema(db) && pP
3570: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
3580: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62  .          int b
3590: 44 75 6d 6d 79 20 3d 20 30 3b 0a 20 20 20 20 20  Dummy = 0;.     
35a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
35b0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4c  = sqlite3SchemaL
35c0: 6f 61 64 28 64 62 2c 20 30 2c 20 26 62 44 75 6d  oad(db, 0, &bDum
35d0: 6d 79 2c 20 26 70 50 61 72 73 65 2d 3e 7a 45 72  my, &pParse->zEr
35e0: 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
35f0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 20   if( pParse->rc 
3600: 29 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b  ) pParse->nErr++
3610: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3620: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
3630: 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c  tabEponymousTabl
3640: 65 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 4d  eInit(pParse, pM
3650: 6f 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  od) ){.         
3660: 20 54 61 62 6c 65 20 2a 70 45 70 6f 54 61 62 20   Table *pEpoTab 
3670: 3d 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 3b  = pMod->pEpoTab;
3680: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
3690: 74 28 20 49 73 52 65 75 73 65 53 63 68 65 6d 61  t( IsReuseSchema
36a0: 28 64 62 29 20 7c 7c 20 70 45 70 6f 54 61 62 2d  (db) || pEpoTab-
36b0: 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
36c0: 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[0].pSchema );.
36d0: 20 20 20 20 20 20 20 20 20 20 70 45 70 6f 54 61            pEpoTa
36e0: 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  b->pSchema = db-
36f0: 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 3b  >aDb[0].pSchema;
3700: 20 20 2f 2a 20 46 6f 72 20 53 48 41 52 45 44 5f    /* For SHARED_
3710: 53 43 48 45 4d 41 20 6d 6f 64 65 20 2a 2f 0a 20  SCHEMA mode */. 
3720: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
3730: 70 45 70 6f 54 61 62 3b 0a 20 20 20 20 20 20 20  pEpoTab;.       
3740: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
3750: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
3760: 66 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f 4e  flags & LOCATE_N
3770: 4f 45 52 52 20 29 20 72 65 74 75 72 6e 20 30 3b  OERR ) return 0;
3780: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65  .    pParse->che
3790: 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
37a0: 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74  }else if( IsVirt
37b0: 75 61 6c 28 70 29 20 26 26 20 70 50 61 72 73 65  ual(p) && pParse
37c0: 2d 3e 64 69 73 61 62 6c 65 56 74 61 62 20 29 7b  ->disableVtab ){
37d0: 0a 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 7d 0a  .    p = 0;.  }.
37e0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 26 26 20 70  .  if( p==0 && p
37f0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
3800: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
3810: 20 2a 7a 4d 73 67 20 3d 20 66 6c 61 67 73 20 26   *zMsg = flags &
3820: 20 4c 4f 43 41 54 45 5f 56 49 45 57 20 3f 20 22   LOCATE_VIEW ? "
3830: 6e 6f 20 73 75 63 68 20 76 69 65 77 22 20 3a 20  no such view" : 
3840: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 22 3b  "no such table";
3850: 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73 65 20  .    if( zDbase 
3860: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3870: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3880: 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d   "%s: %s.%s", zM
3890: 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d  sg, zDbase, zNam
38a0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
38b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
38c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
38d0: 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61  : %s", zMsg, zNa
38e0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  me);.    }.  }..
38f0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
3900: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
3910: 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64  table identified
3920: 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   by *p..**.** Th
3930: 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72 20  is is a wrapper 
3940: 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c 6f  around sqlite3Lo
3950: 63 61 74 65 54 61 62 6c 65 28 29 2e 20 54 68 65  cateTable(). The
3960: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
3970: 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c 6f  een.** sqlite3Lo
3980: 63 61 74 65 54 61 62 6c 65 28 29 20 61 6e 64 20  cateTable() and 
3990: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
39a0: 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
39b0: 69 6f 6e 20 72 65 73 74 72 69 63 74 73 0a 2a 2a  ion restricts.**
39c0: 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 73   the search to s
39d0: 63 68 65 6d 61 20 28 70 2d 3e 70 53 63 68 65 6d  chema (p->pSchem
39e0: 61 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  a) if it is not 
39f0: 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d 61  NULL. p->pSchema
3a00: 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e   may be.** non-N
3a10: 55 4c 4c 20 69 66 20 69 74 20 69 73 20 70 61 72  ULL if it is par
3a20: 74 20 6f 66 20 61 20 76 69 65 77 20 6f 72 20 74  t of a view or t
3a30: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 64  rigger program d
3a40: 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a 2a  efinition. See.*
3a50: 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c  * sqlite3FixSrcL
3a60: 69 73 74 28 29 20 66 6f 72 20 64 65 74 61 69 6c  ist() for detail
3a70: 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  s..*/.Table *sql
3a80: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
3a90: 74 65 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  tem(.  Parse *pP
3aa0: 61 72 73 65 2c 20 0a 20 20 75 33 32 20 66 6c 61  arse, .  u32 fla
3ab0: 67 73 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63  gs,.  struct Src
3ac0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a 29 7b 0a  List_item *p.){.
3ad0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
3ae0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  b;.  assert( p->
3af0: 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c 20 70 2d  pSchema==0 || p-
3b00: 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 29 3b  >zDatabase==0 );
3b10: 0a 20 20 69 66 28 20 70 2d 3e 70 53 63 68 65 6d  .  if( p->pSchem
3b20: 61 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62  a ){.    int iDb
3b30: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
3b40: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
3b50: 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
3b60: 0a 20 20 20 20 7a 44 62 20 3d 20 70 50 61 72 73  .    zDb = pPars
3b70: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
3b80: 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73  zDbSName;.  }els
3b90: 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e  e{.    zDb = p->
3ba0: 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20  zDatabase;.  }. 
3bb0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c   return sqlite3L
3bc0: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
3bd0: 65 2c 20 66 6c 61 67 73 2c 20 70 2d 3e 7a 4e 61  e, flags, p->zNa
3be0: 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  me, zDb);.}../*.
3bf0: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
3c00: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
3c10: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
3c20: 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61   .** a particula
3c30: 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68  r index given th
3c40: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69  e name of that i
3c50: 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ndex.** and the 
3c60: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
3c70: 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69  base that contai
3c80: 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  ns the index..**
3c90: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
3ca0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
3cb0: 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73   If zDatabase is
3cc0: 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65   0, all database
3cd0: 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66  s are searched f
3ce0: 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  or the.** table 
3cf0: 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d 61  and the first ma
3d00: 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20  tching index is 
3d10: 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63  returned.  (No c
3d20: 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64  hecking.** for d
3d30: 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e  uplicate index n
3d40: 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20  ames is done.)  
3d50: 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72  The search order
3d60: 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73   is.** TEMP firs
3d70: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
3d80: 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79  en any auxiliary
3d90: 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64   databases added
3da0: 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54  .** using the AT
3db0: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  TACH command..*/
3dc0: 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46  .Index *sqlite3F
3dd0: 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33  indIndex(sqlite3
3de0: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
3df0: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
3e00: 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64  har *zDb){.  Ind
3e10: 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  ex *p = 0;.  int
3e20: 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74   i;.  /* All mut
3e30: 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65  exes are require
3e40: 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63  d for schema acc
3e50: 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ess.  Make sure 
3e60: 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f  we hold them. */
3e70: 0a 20 20 61 73 73 65 72 74 28 20 7a 44 62 21 3d  .  assert( zDb!=
3e80: 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  0 || sqlite3Btre
3e90: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
3ea0: 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  (db) );.  for(i=
3eb0: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
3ec0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3ed0: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
3ee0: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
3ef0: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
3f00: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63  e MAIN */.    Sc
3f10: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
3f20: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
3f30: 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ma;.    assert( 
3f40: 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69  pSchema );.    i
3f50: 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65  f( zDb && sqlite
3f60: 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62  3StrICmp(zDb, db
3f70: 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[j].zDbSNam
3f80: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
3f90: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
3fa0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
3fb0: 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20  d(db, j, 0) );. 
3fc0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
3fd0: 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d  shFind(&pSchema-
3fe0: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29  >idxHash, zName)
3ff0: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72  ;.    if( p ) br
4000: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
4010: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
4020: 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79  claim the memory
4030: 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65   used by an inde
4040: 78 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  x.*/.void sqlite
4050: 33 46 72 65 65 49 6e 64 65 78 28 73 71 6c 69 74  3FreeIndex(sqlit
4060: 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70  e3 *db, Index *p
4070: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
4080: 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20  E_OMIT_ANALYZE. 
4090: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e   sqlite3DeleteIn
40a0: 64 65 78 53 61 6d 70 6c 65 73 28 64 62 2c 20 70  dexSamples(db, p
40b0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
40c0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
40d0: 2c 20 70 2d 3e 70 50 61 72 74 49 64 78 57 68 65  , p->pPartIdxWhe
40e0: 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  re);.  sqlite3Ex
40f0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
4100: 20 70 2d 3e 61 43 6f 6c 45 78 70 72 29 3b 0a 20   p->aColExpr);. 
4110: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4120: 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  b, p->zColAff);.
4130: 20 20 69 66 28 20 70 2d 3e 69 73 52 65 73 69 7a    if( p->isResiz
4140: 65 64 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ed ) sqlite3DbFr
4150: 65 65 28 64 62 2c 20 28 76 6f 69 64 20 2a 29 70  ee(db, (void *)p
4160: 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65  ->azColl);.#ifde
4170: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
4180: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
4190: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
41a0: 3e 61 69 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64  >aiRowEst);.#end
41b0: 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  if.  sqlite3DbFr
41c0: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
41d0: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65  .** For the inde
41e0: 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d  x called zIdxNam
41f0: 65 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64  e which is found
4200: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
4210: 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20   iDb,.** unlike 
4220: 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20  that index from 
4230: 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72  its Table then r
4240: 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
4250: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65  from.** the inde
4260: 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  x hash table and
4270: 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   free all memory
4280: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
4290: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
42a0: 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69  he index..*/.voi
42b0: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
42c0: 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  ndDeleteIndex(sq
42d0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
42e0: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
42f0: 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  zIdxName){.  Ind
4300: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61  ex *pIndex;.  Ha
4310: 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73  sh *pHash;..  as
4320: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
4330: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
4340: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48   iDb, 0) );.  pH
4350: 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  ash = &db->aDb[i
4360: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db].pSchema->idx
4370: 48 61 73 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d  Hash;.  pIndex =
4380: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
4390: 72 74 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61  rt(pHash, zIdxNa
43a0: 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c  me, 0);.  if( AL
43b0: 57 41 59 53 28 70 49 6e 64 65 78 29 20 29 7b 0a  WAYS(pIndex) ){.
43c0: 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
43d0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d  pTable->pIndex==
43e0: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
43f0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
4400: 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d  pIndex = pIndex-
4410: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
4420: 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
4430: 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74  p;.      /* Just
4440: 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57  ification of ALW
4450: 41 59 53 28 29 3b 20 20 54 68 65 20 69 6e 64 65  AYS();  The inde
4460: 78 20 6d 75 73 74 20 62 65 20 6f 6e 20 74 68 65  x must be on the
4470: 20 6c 69 73 74 20 6f 66 0a 20 20 20 20 20 20 2a   list of.      *
4480: 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20  * indices. */.  
4490: 20 20 20 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e      p = pIndex->
44a0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a  pTable->pIndex;.
44b0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
44c0: 41 59 53 28 70 29 20 26 26 20 70 2d 3e 70 4e 65  AYS(p) && p->pNe
44d0: 78 74 21 3d 70 49 6e 64 65 78 20 29 7b 20 70 20  xt!=pIndex ){ p 
44e0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20  = p->pNext; }.  
44f0: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
4500: 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49   && p->pNext==pI
4510: 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20  ndex) ){.       
4520: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64   p->pNext = pInd
4530: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ex->pNext;.     
4540: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
4550: 69 74 65 33 46 72 65 65 49 6e 64 65 78 28 64 62  ite3FreeIndex(db
4560: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20  , pIndex);.  }. 
4570: 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d   db->mDbFlags |=
4580: 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68   DBFLAG_SchemaCh
4590: 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  ange;.}../*.** L
45a0: 6f 6f 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20  ook through the 
45b0: 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20 64 61 74  list of open dat
45c0: 61 62 61 73 65 20 66 69 6c 65 73 20 69 6e 20 64  abase files in d
45d0: 62 2d 3e 61 44 62 5b 5d 20 61 6e 64 20 69 66 0a  b->aDb[] and if.
45e0: 2a 2a 20 61 6e 79 20 68 61 76 65 20 62 65 65 6e  ** any have been
45f0: 20 63 6c 6f 73 65 64 2c 20 72 65 6d 6f 76 65 20   closed, remove 
4600: 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 6c 69  them from the li
4610: 73 74 2e 20 20 52 65 61 6c 6c 6f 63 61 74 65 20  st.  Reallocate 
4620: 74 68 65 0a 2a 2a 20 64 62 2d 3e 61 44 62 5b 5d  the.** db->aDb[]
4630: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 20   structure to a 
4640: 73 6d 61 6c 6c 65 72 20 73 69 7a 65 2c 20 69 66  smaller size, if
4650: 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a   possible..**.**
4660: 20 45 6e 74 72 79 20 30 20 28 74 68 65 20 22 6d   Entry 0 (the "m
4670: 61 69 6e 22 20 64 61 74 61 62 61 73 65 29 20 61  ain" database) a
4680: 6e 64 20 65 6e 74 72 79 20 31 20 28 74 68 65 20  nd entry 1 (the 
4690: 22 74 65 6d 70 22 20 64 61 74 61 62 61 73 65 29  "temp" database)
46a0: 0a 2a 2a 20 61 72 65 20 6e 65 76 65 72 20 63 61  .** are never ca
46b0: 6e 64 69 64 61 74 65 73 20 66 6f 72 20 62 65 69  ndidates for bei
46c0: 6e 67 20 63 6f 6c 6c 61 70 73 65 64 2e 0a 2a 2f  ng collapsed..*/
46d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c  .void sqlite3Col
46e0: 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72 72  lapseDatabaseArr
46f0: 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ay(sqlite3 *db){
4700: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66  .  int i, j;.  f
4710: 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e  or(i=j=2; i<db->
4720: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nDb; i++){.    s
4730: 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20  truct Db *pDb = 
4740: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
4750: 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30   if( pDb->pBt==0
4760: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4770: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 62 2d  3DbFree(db, pDb-
4780: 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a 20 20 20 20  >zDbSName);.    
4790: 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 20    pDb->zDbSName 
47a0: 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 0;.      conti
47b0: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
47c0: 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20  f( j<i ){.      
47d0: 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d  db->aDb[j] = db-
47e0: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  >aDb[i];.    }. 
47f0: 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 64 62     j++;.  }.  db
4800: 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28  ->nDb = j;.  if(
4810: 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64   db->nDb<=2 && d
4820: 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53  b->aDb!=db->aDbS
4830: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d  tatic ){.    mem
4840: 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69  cpy(db->aDbStati
4850: 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69  c, db->aDb, 2*si
4860: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29  zeof(db->aDb[0])
4870: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
4880: 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62  Free(db, db->aDb
4890: 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d  );.    db->aDb =
48a0: 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a   db->aDbStatic;.
48b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73    }.}../*.** Res
48c0: 65 74 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f  et the schema fo
48d0: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  r the database a
48e0: 74 20 69 6e 64 65 78 20 69 44 62 2e 20 20 41 6c  t index iDb.  Al
48f0: 73 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20  so reset the.** 
4900: 54 45 4d 50 20 73 63 68 65 6d 61 2e 20 20 54 68  TEMP schema.  Th
4910: 65 20 72 65 73 65 74 20 69 73 20 64 65 66 65 72  e reset is defer
4920: 72 65 64 20 69 66 20 64 62 2d 3e 6e 53 63 68 65  red if db->nSche
4930: 6d 61 4c 6f 63 6b 20 69 73 20 6e 6f 74 20 7a 65  maLock is not ze
4940: 72 6f 2e 0a 2a 2a 20 44 65 66 65 72 72 65 64 20  ro..** Deferred 
4950: 72 65 73 65 74 73 20 6d 61 79 20 62 65 20 72 75  resets may be ru
4960: 6e 20 62 79 20 63 61 6c 6c 69 6e 67 20 77 69 74  n by calling wit
4970: 68 20 69 44 62 3c 30 2e 0a 2a 2f 0a 76 6f 69 64  h iDb<0..*/.void
4980: 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65   sqlite3ResetOne
4990: 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a  Schema(sqlite3 *
49a0: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
49b0: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
49c0: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
49d0: 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b  .  if( iDb>=0 ){
49e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
49f0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
4a00: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
4a10: 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70  );.    DbSetProp
4a20: 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42  erty(db, iDb, DB
4a30: 5f 52 65 73 65 74 57 61 6e 74 65 64 29 3b 0a 20  _ResetWanted);. 
4a40: 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79     DbSetProperty
4a50: 28 64 62 2c 20 31 2c 20 44 42 5f 52 65 73 65 74  (db, 1, DB_Reset
4a60: 57 61 6e 74 65 64 29 3b 0a 20 20 20 20 64 62 2d  Wanted);.    db-
4a70: 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e 44 42  >mDbFlags &= ~DB
4a80: 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e  FLAG_SchemaKnown
4a90: 4f 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  Ok;.  }.  if( db
4aa0: 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30  ->nSchemaLock==0
4ab0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
4ac0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
4ad0: 7b 0a 20 20 20 20 20 20 69 66 28 20 44 62 48 61  {.      if( DbHa
4ae0: 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c  sProperty(db, i,
4af0: 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29   DB_ResetWanted)
4b00: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4b10: 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 4f 72  te3SchemaClearOr
4b20: 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 69  Disconnect(db, i
4b30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4b40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  .  }.}../*.** Er
4b50: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
4b60: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
4b70: 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
4b80: 61 62 61 73 65 73 20 28 69 6e 63 6c 75 64 69 6e  abases (includin
4b90: 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61 6e 64 20  g.** "main" and 
4ba0: 22 74 65 6d 70 22 29 20 66 6f 72 20 61 20 73 69  "temp") for a si
4bb0: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 63 6f  ngle database co
4bc0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
4bd0: 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c  d sqlite3ResetAl
4be0: 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63  lSchemasOfConnec
4bf0: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  tion(sqlite3 *db
4c00: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
4c10: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
4c20: 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d  ll(db);.  for(i=
4c30: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 3d  0; i<db->nDb; i=
4c40: 28 69 3f 69 2b 31 3a 32 29 29 7b 0a 20 20 20 20  (i?i+1:2)){.    
4c50: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
4c60: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
4c70: 44 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Db->pSchema ){. 
4c80: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 53 63       if( db->nSc
4c90: 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  hemaLock==0 ){. 
4ca0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63         sqlite3Sc
4cb0: 68 65 6d 61 43 6c 65 61 72 4f 72 44 69 73 63 6f  hemaClearOrDisco
4cc0: 6e 6e 65 63 74 28 64 62 2c 20 69 29 3b 0a 20 20  nnect(db, i);.  
4cd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4ce0: 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79     DbSetProperty
4cf0: 28 64 62 2c 20 69 2c 20 44 42 5f 52 65 73 65 74  (db, i, DB_Reset
4d00: 57 61 6e 74 65 64 29 3b 0a 20 20 20 20 20 20 7d  Wanted);.      }
4d10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
4d20: 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28  ite3SchemaClear(
4d30: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
4d40: 6d 61 29 3b 0a 20 20 64 62 2d 3e 6d 44 62 46 6c  ma);.  db->mDbFl
4d50: 61 67 73 20 26 3d 20 7e 28 44 42 46 4c 41 47 5f  ags &= ~(DBFLAG_
4d60: 53 63 68 65 6d 61 43 68 61 6e 67 65 7c 44 42 46  SchemaChange|DBF
4d70: 4c 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f  LAG_SchemaKnownO
4d80: 6b 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61  k);.  sqlite3Vta
4d90: 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b  bUnlockList(db);
4da0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
4db0: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 69  eaveAll(db);.  i
4dc0: 66 28 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f  f( db->nSchemaLo
4dd0: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ck==0 ){.    sql
4de0: 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61  ite3CollapseData
4df0: 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20  baseArray(db);. 
4e00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
4e10: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4e20: 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74  ed when a commit
4e30: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
4e40: 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
4e50: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
4e60: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62  lite3 *db){.  db
4e70: 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e 44  ->mDbFlags &= ~D
4e80: 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e  BFLAG_SchemaChan
4e90: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  ge;.}../*.** Del
4ea0: 65 74 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ete memory alloc
4eb0: 61 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c  ated for the col
4ec0: 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 20 61 20 74  umn names of a t
4ed0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 28 74 68  able or view (th
4ee0: 65 0a 2a 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b  e.** Table.aCol[
4ef0: 5d 20 61 72 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69  ] array)..*/.voi
4f00: 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43  d sqlite3DeleteC
4f10: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74  olumnNames(sqlit
4f20: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
4f30: 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Table){.  int i;
4f40: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
4f50: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
4f60: 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70  e!=0 );.  if( (p
4f70: 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43  Col = pTable->aC
4f80: 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f  ol)!=0 ){.    fo
4f90: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d  r(i=0; i<pTable-
4fa0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
4fb0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
4fc0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
4fd0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
4fe0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4ff0: 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66  te(db, pCol->pDf
5000: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
5010: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
5020: 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  l->zColl);.    }
5030: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
5040: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61  ee(db, pTable->a
5050: 43 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Col);.  }.}../*.
5060: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
5070: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
5080: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
5090: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
50a0: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
50b0: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
50c0: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
50d0: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
50e0: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
50f0: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
5100: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
5110: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
5120: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
5130: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
5140: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
5150: 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73   But it does des
5160: 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73  troy.** memory s
5170: 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65  tructures of the
5180: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
5190: 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69  eign keys associ
51a0: 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68  ated with .** th
51b0: 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
51c0: 68 65 20 64 62 20 70 61 72 61 6d 65 74 65 72 20  he db parameter 
51d0: 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74  is optional.  It
51e0: 20 69 73 20 6e 65 65 64 65 64 20 69 66 20 74 68   is needed if th
51f0: 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a  e Table object .
5200: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b  ** contains look
5210: 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28  aside memory.  (
5220: 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e  Table objects in
5230: 20 74 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e   the schema do n
5240: 6f 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73  ot use.** lookas
5250: 69 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20  ide memory, but 
5260: 73 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54  some ephemeral T
5270: 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e  able objects do.
5280: 29 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20  )  Or the.** db 
5290: 70 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65  parameter can be
52a0: 20 75 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70   used with db->p
52b0: 6e 42 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d  nBytesFreed to m
52c0: 65 61 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72  easure the memor
52d0: 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65  y.** used by the
52e0: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a   Table object..*
52f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 51  /.static void SQ
5300: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 64 65  LITE_NOINLINE de
5310: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
5320: 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54  3 *db, Table *pT
5330: 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  able){.  Index *
5340: 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a  pIndex, *pNext;.
5350: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
5360: 45 42 55 47 0a 20 20 2f 2a 20 52 65 63 6f 72 64  EBUG.  /* Record
5370: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
5380: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61  utstanding looka
5390: 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  side allocations
53a0: 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62 6c 65   in schema Table
53b0: 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20  s.  ** prior to 
53c0: 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65 28 29  doing any free()
53d0: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 53 69   operations.  Si
53e0: 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62 6c 65  nce schema Table
53f0: 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a  s do not use.  *
5400: 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69  * lookaside, thi
5410: 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20  s number should 
5420: 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20  not change. */. 
5430: 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 20   int nLookaside 
5440: 3d 20 30 3b 0a 20 20 69 66 28 20 64 62 20 26 26  = 0;.  if( db &&
5450: 20 28 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61   (pTable->tabFla
5460: 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
5470: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4c 6f  l)==0 ){.    nLo
5480: 6f 6b 61 73 69 64 65 20 3d 20 73 71 6c 69 74 65  okaside = sqlite
5490: 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64 28 64  3LookasideUsed(d
54a0: 62 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  b, 0);.  }.#endi
54b0: 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  f..  /* Delete a
54c0: 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63  ll indices assoc
54d0: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
54e0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
54f0: 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d  pIndex = pTable-
5500: 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
5510: 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a   pIndex=pNext){.
5520: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64      pNext = pInd
5530: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61  ex->pNext;.    a
5540: 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70  ssert( pIndex->p
5550: 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e  Schema==pTable->
5560: 70 53 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20  pSchema.        
5570: 20 7c 7c 20 28 49 73 56 69 72 74 75 61 6c 28 70   || (IsVirtual(p
5580: 54 61 62 6c 65 29 20 26 26 20 70 49 6e 64 65 78  Table) && pIndex
5590: 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54  ->idxType!=SQLIT
55a0: 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46  E_IDXTYPE_APPDEF
55b0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 28 64 62  ) );.    if( (db
55c0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  ==0 || db->pnByt
55d0: 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20 21  esFreed==0) && !
55e0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65  IsVirtual(pTable
55f0: 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ) ){.      char 
5600: 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d  *zName = pIndex-
5610: 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54  >zName; .      T
5620: 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20  ESTONLY ( Index 
5630: 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65  *pOld = ) sqlite
5640: 33 48 61 73 68 49 6e 73 65 72 74 28 0a 20 20 20  3HashInsert(.   
5650: 20 20 20 20 20 20 26 70 49 6e 64 65 78 2d 3e 70        &pIndex->p
5660: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
5670: 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20 20 20   zName, 0.      
5680: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
5690: 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65   db==0 || sqlite
56a0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
56b0: 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  (db, 0, pIndex->
56c0: 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20  pSchema) );.    
56d0: 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d    assert( pOld==
56e0: 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d  pIndex || pOld==
56f0: 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
5700: 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65 78 28  qlite3FreeIndex(
5710: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  db, pIndex);.  }
5720: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e  ..  /* Delete an
5730: 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  y foreign keys a
5740: 74 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20  ttached to this 
5750: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  table. */.  sqli
5760: 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20  te3FkDelete(db, 
5770: 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44  pTable);..  /* D
5780: 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20  elete the Table 
5790: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
57a0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
57b0: 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  DeleteColumnName
57c0: 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20  s(db, pTable);. 
57d0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
57e0: 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  b, pTable->zName
57f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
5800: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a  ee(db, pTable->z
5810: 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74  ColAff);.  sqlit
5820: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
5830: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  b, pTable->pSele
5840: 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ct);.  sqlite3Ex
5850: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
5860: 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29   pTable->pCheck)
5870: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
5880: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
5890: 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  LE.  sqlite3Vtab
58a0: 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65  Clear(db, pTable
58b0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
58c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
58d0: 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72  able);..  /* Ver
58e0: 69 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b  ify that no look
58f0: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73  aside memory was
5900: 20 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20   used by schema 
5910: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65  tables */.  asse
5920: 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d  rt( nLookaside==
5930: 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d  0 || nLookaside=
5940: 3d 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64  =sqlite3Lookasid
5950: 65 55 73 65 64 28 64 62 2c 30 29 20 29 3b 0a 7d  eUsed(db,0) );.}
5960: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
5970: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
5980: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
5990: 62 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f  ble){.  /* Do no
59a0: 74 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62  t delete the tab
59b0: 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66  le until the ref
59c0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61  erence count rea
59d0: 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20  ches zero. */.  
59e0: 69 66 28 20 21 70 54 61 62 6c 65 20 29 20 72 65  if( !pTable ) re
59f0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64  turn;.  if( ((!d
5a00: 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73  b || db->pnBytes
5a10: 46 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d  Freed==0) && (--
5a20: 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 29  pTable->nTabRef)
5a30: 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >0) ) return;.  
5a40: 64 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  deleteTable(db, 
5a50: 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  pTable);.}.../*.
5a60: 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69  ** Unlink the gi
5a70: 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  ven table from t
5a80: 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  he hash tables a
5a90: 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68  nd the delete th
5aa0: 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63  e.** table struc
5ab0: 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74  ture with all it
5ac0: 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f  s indices and fo
5ad0: 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76  reign keys..*/.v
5ae0: 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e  oid sqlite3Unlin
5af0: 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28  kAndDeleteTable(
5b00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
5b10: 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   iDb, const char
5b20: 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54   *zTabName){.  T
5b30: 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70  able *p;.  Db *p
5b40: 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64  Db;..  assert( d
5b50: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
5b60: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
5b70: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
5b80: 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b  ert( zTabName );
5b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5ba0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
5bb0: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
5bc0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 7a 54 61  .  testcase( zTa
5bd0: 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20  bName[0]==0 );  
5be0: 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74  /* Zero-length t
5bf0: 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61  able names are a
5c00: 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20  llowed */.  pDb 
5c10: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
5c20: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61  .  p = sqlite3Ha
5c30: 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70  shInsert(&pDb->p
5c40: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
5c50: 20 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20   zTabName, 0);. 
5c60: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
5c70: 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62  ble(db, p);.  db
5c80: 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42  ->mDbFlags |= DB
5c90: 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67  FLAG_SchemaChang
5ca0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  e;.}../*.** Give
5cb0: 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72  n a token, retur
5cc0: 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  n a string that 
5cd0: 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20  consists of the 
5ce0: 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20  text of that.** 
5cf0: 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f  token.  Space to
5d00: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
5d10: 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  ed string.** is 
5d20: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
5d30: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
5d40: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
5d50: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  y the calling.**
5d60: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
5d70: 20 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d   Any quotation m
5d80: 61 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65  arks (ex:  "name
5d90: 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65  ", 'name', [name
5da0: 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68  ], or `name`) th
5db0: 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74  at.** surround t
5dc0: 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74  he body of the t
5dd0: 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64  oken are removed
5de0: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61  ..**.** Tokens a
5df0: 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f  re often just po
5e00: 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20  inters into the 
5e10: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78  original SQL tex
5e20: 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20  t and so.** are 
5e30: 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61  not \000 termina
5e40: 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20  ted and are not 
5e50: 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65  persistent.  The
5e60: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
5e70: 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d  .** is \000 term
5e80: 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65  inated and is pe
5e90: 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61  rsistent..*/.cha
5ea0: 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72  r *sqlite3NameFr
5eb0: 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20  omToken(sqlite3 
5ec0: 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  *db, Token *pNam
5ed0: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
5ee0: 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29  e;.  if( pName )
5ef0: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
5f00: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
5f10: 62 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d  b, (char*)pName-
5f20: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20  >z, pName->n);. 
5f30: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
5f40: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73  e(zName);.  }els
5f50: 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30  e{.    zName = 0
5f60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
5f70: 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  Name;.}../*.** O
5f80: 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  pen the sqlite_m
5f90: 61 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72  aster table stor
5fa0: 65 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e  ed in database n
5fb0: 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a  umber iDb for.**
5fc0: 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61   writing. The ta
5fd0: 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73  ble is opened us
5fe0: 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f  ing cursor 0..*/
5ff0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65  .void sqlite3Ope
6000: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61 72  nMasterTable(Par
6010: 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b  se *p, int iDb){
6020: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
6030: 69 74 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a  ite3GetVdbe(p);.
6040: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
6050: 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45  ck(p, iDb, MASTE
6060: 52 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53 54 45  R_ROOT, 1, MASTE
6070: 52 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c 69 74  R_NAME);.  sqlit
6080: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
6090: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
60a0: 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c   0, MASTER_ROOT,
60b0: 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20   iDb, 5);.  if( 
60c0: 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20  p->nTab==0 ){.  
60d0: 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20    p->nTab = 1;. 
60e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61   }.}../*.** Para
60f0: 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e  meter zName poin
6100: 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d  ts to a nul-term
6110: 69 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f  inated buffer co
6120: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
6130: 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61  e.** of a databa
6140: 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d  se ("main", "tem
6150: 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f  p" or the name o
6160: 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62  f an attached db
6170: 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
6180: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
6190: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
61a0: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
61b0: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20  b->aDb[], or.** 
61c0: 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  -1 if the named 
61d0: 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  db cannot be fou
61e0: 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
61f0: 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c  e3FindDbName(sql
6200: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
6210: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
6220: 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20  int i = -1;     
6230: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
6240: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20  number */.  if( 
6250: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20  zName ){.    Db 
6260: 2a 70 44 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  *pDb;.    for(i=
6270: 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62  (db->nDb-1), pDb
6280: 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e  =&db->aDb[i]; i>
6290: 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b  =0; i--, pDb--){
62a0: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71  .      if( 0==sq
62b0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 44  lite3_stricmp(pD
62c0: 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4e 61  b->zDbSName, zNa
62d0: 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  me) ) break;.   
62e0: 20 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69 73 20     /* "main" is 
62f0: 61 6c 77 61 79 73 20 61 6e 20 61 63 63 65 70 74  always an accept
6300: 61 62 6c 65 20 61 6c 69 61 73 20 66 6f 72 20 74  able alias for t
6310: 68 65 20 70 72 69 6d 61 72 79 20 64 61 74 61 62  he primary datab
6320: 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65  ase.      ** eve
6330: 6e 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e  n if it has been
6340: 20 72 65 6e 61 6d 65 64 20 75 73 69 6e 67 20 53   renamed using S
6350: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d  QLITE_DBCONFIG_M
6360: 41 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a 20 20  AINDBNAME. */.  
6370: 20 20 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20      if( i==0 && 
6380: 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
6390: 6d 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65  mp("main", zName
63a0: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ) ) break;.    }
63b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
63c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f  .}../*.** The to
63d0: 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61  ken *pName conta
63e0: 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ins the name of 
63f0: 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68  a database (eith
6400: 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20  er "main" or.** 
6410: 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61  "temp" or the na
6420: 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65  me of an attache
6430: 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74  d db). This rout
6440: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a  ine returns the.
6450: 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ** index of the 
6460: 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69  named database i
6470: 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20  n db->aDb[], or 
6480: 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  -1 if the named 
6490: 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  db .** does not 
64a0: 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  exist..*/.int sq
64b0: 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69  lite3FindDb(sqli
64c0: 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a  te3 *db, Token *
64d0: 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pName){.  int i;
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6500: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
6510: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  r */.  char *zNa
6520: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
6530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6540: 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63  ame we are searc
6550: 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e  hing for */.  zN
6560: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
6570: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
6580: 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c  Name);.  i = sql
6590: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
65a0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  b, zName);.  sql
65b0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
65c0: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
65d0: 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62  i;.}../* The tab
65e0: 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72  le or view or tr
65f0: 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61  igger name is pa
6600: 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75  ssed to this rou
6610: 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a  tine via tokens.
6620: 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e  ** pName1 and pN
6630: 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62  ame2. If the tab
6640: 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c  le name was full
6650: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72  y qualified, for
6660: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
6670: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78  CREATE TABLE xxx
6680: 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a  .yyy (...);.** .
6690: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
66a0: 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61  s set to "xxx" a
66b0: 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e  nd pName2 "yyy".
66c0: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
66d0: 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  nd if.** the tab
66e0: 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66  le name is not f
66f0: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
6700: 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41  i.e.:.**.** CREA
6710: 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e  TE TABLE yyy(...
6720: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e  );.**.** Then pN
6730: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
6740: 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  yyy" and pName2 
6750: 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  is ""..**.** Thi
6760: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
6770: 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69  he *ppUnqual poi
6780: 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  nter to point at
6790: 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d   the token (pNam
67a0: 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29  e1 or.** pName2)
67b0: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
67c0: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
67d0: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e  le name.  The in
67e0: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  dex of the.** da
67f0: 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20  tabase "xxx" is 
6800: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
6810: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
6820: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
6830: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
6840: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
6850: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
6860: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
6870: 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68  ame1,      /* Th
6880: 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e  e "xxx" in the n
6890: 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72  ame "xxx.yyy" or
68a0: 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65   "xxx" */.  Toke
68b0: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20  n *pName2,      
68c0: 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20  /* The "yyy" in 
68d0: 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79  the name "xxx.yy
68e0: 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a  y" */.  Token **
68f0: 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57  pUnqual     /* W
6900: 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69  rite the unquali
6910: 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65  fied object name
6920: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
6930: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
6940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
6950: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68  abase holding th
6960: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  e object */.  sq
6970: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
6980: 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72  se->db;..  asser
6990: 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a  t( pName2!=0 );.
69a0: 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e    if( pName2->n>
69b0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  0 ){.    if( db-
69c0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20  >init.busy ) {. 
69d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
69e0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f  rMsg(pParse, "co
69f0: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29  rrupt database")
6a00: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  ;.      return -
6a10: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55  1;.    }.    *pU
6a20: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a  nqual = pName2;.
6a30: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
6a40: 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d  3FindDb(db, pNam
6a50: 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  e1);.    if( iDb
6a60: 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <0 ){.      sqli
6a70: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
6a80: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74  se, "unknown dat
6a90: 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65  abase %T", pName
6aa0: 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1);.      return
6ab0: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   -1;.    }.  }el
6ac0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
6ad0: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20  db->init.iDb==0 
6ae0: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
6af0: 20 7c 7c 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42   || IN_RENAME_OB
6b00: 4a 45 43 54 0a 20 20 20 20 20 20 20 20 20 20 20  JECT.           
6b10: 20 20 7c 7c 20 28 64 62 2d 3e 6d 44 62 46 6c 61    || (db->mDbFla
6b20: 67 73 20 26 20 44 42 46 4c 41 47 5f 56 61 63 75  gs & DBFLAG_Vacu
6b30: 75 6d 29 21 3d 30 29 3b 0a 20 20 20 20 69 44 62  um)!=0);.    iDb
6b40: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b   = db->init.iDb;
6b50: 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20  .    *pUnqual = 
6b60: 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65  pName1;.  }.  re
6b70: 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a  turn iDb;.}../*.
6b80: 2a 2a 20 54 72 75 65 20 69 66 20 50 52 41 47 4d  ** True if PRAGM
6b90: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
6ba0: 61 20 69 73 20 4f 4e 0a 2a 2f 0a 69 6e 74 20 73  a is ON.*/.int s
6bb0: 71 6c 69 74 65 33 57 72 69 74 61 62 6c 65 53 63  qlite3WritableSc
6bc0: 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62  hema(sqlite3 *db
6bd0: 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  ){.  testcase( (
6be0: 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54  db->flags&(SQLIT
6bf0: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51  E_WriteSchema|SQ
6c00: 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29  LITE_Defensive))
6c10: 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
6c20: 65 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53  e( (db->flags&(S
6c30: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
6c40: 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69  a|SQLITE_Defensi
6c50: 76 65 29 29 3d 3d 0a 20 20 20 20 20 20 20 20 20  ve))==.         
6c60: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 72 69        SQLITE_Wri
6c70: 74 65 53 63 68 65 6d 61 20 29 3b 0a 20 20 74 65  teSchema );.  te
6c80: 73 74 63 61 73 65 28 20 28 64 62 2d 3e 66 6c 61  stcase( (db->fla
6c90: 67 73 26 28 53 51 4c 49 54 45 5f 57 72 69 74 65  gs&(SQLITE_Write
6ca0: 53 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65  Schema|SQLITE_De
6cb0: 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20 20 20  fensive))==.    
6cc0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
6cd0: 45 5f 44 65 66 65 6e 73 69 76 65 20 29 3b 0a 20  E_Defensive );. 
6ce0: 20 74 65 73 74 63 61 73 65 28 20 28 64 62 2d 3e   testcase( (db->
6cf0: 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72  flags&(SQLITE_Wr
6d00: 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45  iteSchema|SQLITE
6d10: 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20  _Defensive))==. 
6d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
6d30: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
6d40: 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69  a|SQLITE_Defensi
6d50: 76 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve) );.  return 
6d60: 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49  (db->flags&(SQLI
6d70: 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53  TE_WriteSchema|S
6d80: 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29  QLITE_Defensive)
6d90: 29 3d 3d 53 51 4c 49 54 45 5f 57 72 69 74 65 53  )==SQLITE_WriteS
6da0: 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  chema;.}../*.** 
6db0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
6dc0: 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66  used to check if
6dd0: 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e   the UTF-8 strin
6de0: 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67  g zName is a leg
6df0: 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65  al.** unqualifie
6e00: 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77  d name for a new
6e10: 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28   schema object (
6e20: 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69  table, index, vi
6e30: 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72  ew or.** trigger
6e40: 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65  ). All names are
6e50: 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74 68   legal except th
6e60: 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e 20 77  ose that begin w
6e70: 69 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a  ith the string.*
6e80: 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20  * "sqlite_" (in 
6e90: 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20  upper, lower or 
6ea0: 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54 68 69  mixed case). Thi
6eb0: 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  s portion of the
6ec0: 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73   namespace.** is
6ed0: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e   reserved for in
6ee0: 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69  ternal use..*/.i
6ef0: 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  nt sqlite3CheckO
6f00: 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20  bjectName(Parse 
6f10: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
6f20: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
6f30: 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e  f( !pParse->db->
6f40: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61  init.busy && pPa
6f50: 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a  rse->nested==0 .
6f60: 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
6f70: 69 74 65 33 57 72 69 74 61 62 6c 65 53 63 68 65  ite3WritableSche
6f80: 6d 61 28 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  ma(pParse->db)==
6f90: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30  0.          && 0
6fa0: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
6fb0: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
6fc0: 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71  _", 7) ){.    sq
6fd0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6fe0: 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61  arse, "object na
6ff0: 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  me reserved for 
7000: 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73  internal use: %s
7010: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ", zName);.    r
7020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
7030: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
7040: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
7050: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
7060: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
7070: 78 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a  x of a table.*/.
7080: 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 50 72  Index *sqlite3Pr
7090: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 54 61  imaryKeyIndex(Ta
70a0: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e  ble *pTab){.  In
70b0: 64 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  dex *p;.  for(p=
70c0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20  pTab->pIndex; p 
70d0: 26 26 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79  && !IsPrimaryKey
70e0: 49 6e 64 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70  Index(p); p=p->p
70f0: 4e 65 78 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e  Next){}.  return
7100: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   p;.}../*.** Ret
7110: 75 72 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f  urn the column o
7120: 66 20 69 6e 64 65 78 20 70 49 64 78 20 74 68 61  f index pIdx tha
7130: 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
7140: 20 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e   table.** column
7150: 20 69 43 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d   iCol.  Return -
7160: 31 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  1 if not found..
7170: 2a 2f 0a 69 31 36 20 73 71 6c 69 74 65 33 43 6f  */.i16 sqlite3Co
7180: 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65  lumnOfIndex(Inde
7190: 78 20 2a 70 49 64 78 2c 20 69 31 36 20 69 43 6f  x *pIdx, i16 iCo
71a0: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
71b0: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
71c0: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
71d0: 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64     if( iCol==pId
71e0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29  x->aiColumn[i] )
71f0: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
7200: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
7210: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
7220: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
7230: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
7240: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
7250: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
7260: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
7270: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
7280: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
7290: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
72a0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
72b0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
72c0: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
72d0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
72e0: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
72f0: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
7300: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
7310: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
7320: 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20  . The isTemp.** 
7330: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
7340: 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  the table should
7350: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
7360: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
7370: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73  base.** file ins
7380: 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d  tead of in the m
7390: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
73a0: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
73b0: 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a  ally the case.**
73c0: 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22   when the "TEMP"
73d0: 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20   or "TEMPORARY" 
73e0: 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69  keyword occurs i
73f0: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45  n between.** CRE
7400: 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a  ATE and TABLE..*
7410: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62  *.** The new tab
7420: 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69  le record is ini
7430: 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74  tialized and put
7440: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   in pParse->pNew
7450: 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72  Table..** As mor
7460: 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  e of the CREATE 
7470: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
7480: 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74  is parsed, addit
7490: 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20  ional action.** 
74a0: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65  routines will be
74b0: 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d   called to add m
74c0: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
74d0: 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a  to this record..
74e0: 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
74f0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
7500: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
7510: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
7520: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
7530: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
7540: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
7550: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
7560: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
7570: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61  .void sqlite3Sta
7580: 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  rtTable(.  Parse
7590: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
75a0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
75b0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
75c0: 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72  ,   /* First par
75d0: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
75e0: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
75f0: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
7600: 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
7610: 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  nd part of the n
7620: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
7630: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e   or view */.  in
7640: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f  t isTemp,      /
7650: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
7660: 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a  s a TEMP table *
7670: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20  /.  int isView, 
7680: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
7690: 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a  this is a VIEW *
76a0: 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61  /.  int isVirtua
76b0: 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  l,   /* True if 
76c0: 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41  this is a VIRTUA
76d0: 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  L table */.  int
76e0: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a   noErr        /*
76f0: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
7700: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
7710: 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
7720: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61  e *pTable;.  cha
7730: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a  r *zName = 0; /*
7740: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
7750: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
7760: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
7770: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
7780: 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20   *v;.  int iDb; 
7790: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
77a0: 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72  ase number to cr
77b0: 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  eate the table i
77c0: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
77d0: 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  ame;    /* Unqua
77e0: 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
77f0: 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61  he table to crea
7800: 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d  te */..  if( db-
7810: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 64 62  >init.busy && db
7820: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d  ->init.newTnum==
7830: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63  1 ){.    /* Spec
7840: 69 61 6c 20 63 61 73 65 3a 20 20 50 61 72 73 69  ial case:  Parsi
7850: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
7860: 73 74 65 72 20 6f 72 20 73 71 6c 69 74 65 5f 74  ster or sqlite_t
7870: 65 6d 70 5f 6d 61 73 74 65 72 20 73 63 68 65 6d  emp_master schem
7880: 61 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 64  a */.    iDb = d
7890: 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20  b->init.iDb;.   
78a0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
78b0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 53 43 48  DbStrDup(db, SCH
78c0: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b  EMA_TABLE(iDb));
78d0: 0a 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61  .    pName = pNa
78e0: 6d 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me1;.  }else{.  
78f0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
7900: 63 61 73 65 20 2a 2f 0a 20 20 20 20 69 44 62 20  case */.    iDb 
7910: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
7920: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
7930: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
7940: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44  ame);.    if( iD
7950: 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
7960: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
7970: 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20  DB && isTemp && 
7980: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69  pName2->n>0 && i
7990: 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f  Db!=1 ){.      /
79a0: 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
79b0: 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20  temp table, the 
79c0: 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  name may not be 
79d0: 71 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73  qualified. Unles
79e0: 73 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  s .      ** the 
79f0: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
7a00: 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20   "temp" anyway. 
7a10: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
7a20: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7a30: 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62  , "temporary tab
7a40: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
7a50: 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20  unqualified");. 
7a60: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
7a70: 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54   }.    if( !OMIT
7a80: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
7a90: 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 20 20 20  p ) iDb = 1;.   
7aa0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
7ab0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
7ac0: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , pName);.    if
7ad0: 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
7ae0: 43 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  CT ){.      sqli
7af0: 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61  te3RenameTokenMa
7b00: 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a  p(pParse, (void*
7b10: 29 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a  )zName, pName);.
7b20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72      }.  }.  pPar
7b30: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d  se->sNameToken =
7b40: 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 66 28 20 7a   *pName;.  if( z
7b50: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
7b60: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
7b70: 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
7b80: 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
7b90: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
7ba0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
7bb0: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  _error;.  }.  if
7bc0: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
7bd0: 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a  1 ) isTemp = 1;.
7be0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7bf0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
7c00: 4e 0a 20 20 61 73 73 65 72 74 28 20 69 73 54 65  N.  assert( isTe
7c10: 6d 70 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d  mp==0 || isTemp=
7c20: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
7c30: 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56  isView==0 || isV
7c40: 69 65 77 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20 20  iew==1 );.  {.  
7c50: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
7c60: 38 20 61 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20  8 aCode[] = {.  
7c70: 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41       SQLITE_CREA
7c80: 54 45 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20  TE_TABLE,.      
7c90: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
7ca0: 45 4d 50 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20  EMP_TABLE,.     
7cb0: 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f    SQLITE_CREATE_
7cc0: 56 49 45 57 2c 0a 20 20 20 20 20 20 20 53 51 4c  VIEW,.       SQL
7cd0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
7ce0: 56 49 45 57 0a 20 20 20 20 7d 3b 0a 20 20 20 20  VIEW.    };.    
7cf0: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
7d00: 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
7d10: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
7d20: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
7d30: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
7d40: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
7d50: 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29  isTemp), 0, zDb)
7d60: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
7d70: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7d80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7d90: 21 69 73 56 69 72 74 75 61 6c 20 26 26 20 73 71  !isVirtual && sq
7da0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
7db0: 50 61 72 73 65 2c 20 28 69 6e 74 29 61 43 6f 64  Parse, (int)aCod
7dc0: 65 5b 69 73 54 65 6d 70 2b 32 2a 69 73 56 69 65  e[isTemp+2*isVie
7dd0: 77 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  w],.            
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7df0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
7e00: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
7e10: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
7e20: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
7e30: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
7e40: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
7e50: 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64  new table name d
7e60: 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20  oes not collide 
7e70: 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67  with an existing
7e80: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
7e90: 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65  able name in the
7ea0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20   same database. 
7eb0: 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20   Issue an error 
7ec0: 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20  message if.  ** 
7ed0: 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63  it does. The exc
7ee0: 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65  eption is if the
7ef0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
7f00: 20 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73   parsed was pass
7f10: 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71  ed.  ** to an sq
7f20: 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
7f30: 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68  ab() call. In th
7f40: 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65  at case only the
7f50: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20   column names.  
7f60: 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c  ** and types wil
7f70: 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68  l be used, so th
7f80: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
7f90: 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73  o test for names
7fa0: 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73  pace.  ** collis
7fb0: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
7fc0: 20 21 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52   !IN_SPECIAL_PAR
7fd0: 53 45 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  SE ){.    char *
7fe0: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
7ff0: 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
8000: 20 69 66 28 20 21 49 73 52 65 75 73 65 53 63 68   if( !IsReuseSch
8010: 65 6d 61 28 64 62 29 20 26 26 20 53 51 4c 49 54  ema(db) && SQLIT
8020: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
8030: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
8040: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
8050: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
8060: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 6c  .    }.    pTabl
8070: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  e = sqlite3FindT
8080: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
8090: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54  zDb);.    if( pT
80a0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  able ){.      if
80b0: 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20  ( !noErr ){.    
80c0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
80d0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
80e0: 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78  le %T already ex
80f0: 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ists", pName);. 
8100: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8110: 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
8120: 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 43 4f  >init.busy || CO
8130: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
8140: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
8150: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
8160: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
8170: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  }.      goto beg
8180: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
8190: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
81a0: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
81b0: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d  b, zName, zDb)!=
81c0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
81d0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
81e0: 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
81f0: 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61  eady an index na
8200: 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
8210: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
8220: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
8230: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62     }.  }..  pTab
8240: 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  le = sqlite3DbMa
8250: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
8260: 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69  eof(Table));.  i
8270: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  f( pTable==0 ){.
8280: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
8290: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
82a0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
82b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
82c0: 50 54 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  PT;.    pParse->
82d0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
82e0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
82f0: 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  or;.  }.  pTable
8300: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
8310: 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79  .  pTable->iPKey
8320: 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d   = -1;.  pTable-
8330: 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  >pSchema = db->a
8340: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
8350: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52  .  pTable->nTabR
8360: 65 66 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53  ef = 1;.#ifdef S
8370: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 4f  QLITE_DEFAULT_RO
8380: 57 45 53 54 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  WEST.  pTable->n
8390: 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69  RowLogEst = sqli
83a0: 74 65 33 4c 6f 67 45 73 74 28 53 51 4c 49 54 45  te3LogEst(SQLITE
83b0: 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45 53 54 29  _DEFAULT_ROWEST)
83c0: 3b 0a 23 65 6c 73 65 0a 20 20 70 54 61 62 6c 65  ;.#else.  pTable
83d0: 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32  ->nRowLogEst = 2
83e0: 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d  00; assert( 200=
83f0: 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
8400: 30 34 38 35 37 36 29 20 29 3b 0a 23 65 6e 64 69  048576) );.#endi
8410: 66 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  f.  assert( pPar
8420: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30  se->pNewTable==0
8430: 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e   );.  pParse->pN
8440: 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65  ewTable = pTable
8450: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
8460: 69 73 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c  is the magic sql
8470: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
8480: 6c 65 20 75 73 65 64 20 62 79 20 61 75 74 6f 69  le used by autoi
8490: 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74  ncrement,.  ** t
84a0: 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69  hen record a poi
84b0: 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74 61 62  nter to this tab
84c0: 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  le in the main d
84d0: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
84e0: 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49  e.  ** so that I
84f0: 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74  NSERT can find t
8500: 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e  he table easily.
8510: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
8520: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
8530: 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70  CREMENT.  if( !p
8540: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26  Parse->nested &&
8550: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22   strcmp(zName, "
8560: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22  sqlite_sequence"
8570: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
8580: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
8590: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
85a0: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 54  Db, 0) );.    pT
85b0: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70  able->pSchema->p
85c0: 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b  SeqTab = pTable;
85d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
85e0: 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
85f0: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
8600: 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65   will insert the
8610: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e   table record in
8620: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49  to.  ** the SQLI
8630: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
8640: 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63    Note in partic
8650: 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75 73  ular that we mus
8660: 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20  t go ahead.  ** 
8670: 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65  and allocate the
8680: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
8690: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74  or the table ent
86a0: 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20  ry now.  Before 
86b0: 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59  any.  ** PRIMARY
86c0: 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b   KEY or UNIQUE k
86d0: 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72 73  eywords are pars
86e0: 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f  ed.  Those keywo
86f0: 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20  rds will cause. 
8700: 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62   ** indices to b
8710: 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74 68  e created and th
8720: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d  e table record m
8730: 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20  ust come before 
8740: 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65  the .  ** indice
8750: 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72  s.  Hence, the r
8760: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
8770: 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20   the table must 
8780: 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a  be allocated.  *
8790: 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  * now..  */.  if
87a0: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
87b0: 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33   && (v = sqlite3
87c0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29  GetVdbe(pParse))
87d0: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  !=0 ){.    int a
87e0: 64 64 72 31 3b 0a 20 20 20 20 69 6e 74 20 66 69  ddr1;.    int fi
87f0: 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e  leFormat;.    in
8800: 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20 72 65  t reg1, reg2, re
8810: 67 33 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c 6c 52  g3;.    /* nullR
8820: 6f 77 5b 5d 20 69 73 20 61 6e 20 4f 50 5f 52 65  ow[] is an OP_Re
8830: 63 6f 72 64 20 65 6e 63 6f 64 69 6e 67 20 6f 66  cord encoding of
8840: 20 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e   a row containin
8850: 67 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20 20 20  g 5 NULLs */.   
8860: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
8870: 61 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d 20 7b  ar nullRow[] = {
8880: 20 36 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   6, 0, 0, 0, 0, 
8890: 30 20 7d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 };.    sqlite3
88a0: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
88b0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
88c0: 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
88d0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
88e0: 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 69  LTABLE.    if( i
88f0: 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20  sVirtual ){.    
8900: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8910: 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e  Op0(v, OP_VBegin
8920: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
8930: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
8940: 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65  ile format and e
8950: 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64  ncoding in the d
8960: 61 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74  atabase have not
8970: 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20   been set, .    
8980: 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e  ** set them now.
8990: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 31  .    */.    reg1
89a0: 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f   = pParse->regRo
89b0: 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  wid = ++pParse->
89c0: 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d  nMem;.    reg2 =
89d0: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
89e0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
89f0: 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20 2b 2b  m;.    reg3 = ++
8a00: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
8a10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8a20: 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f  Op3(v, OP_ReadCo
8a30: 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67 33 2c  okie, iDb, reg3,
8a40: 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d   BTREE_FILE_FORM
8a50: 41 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  AT);.    sqlite3
8a60: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
8a70: 20 69 44 62 29 3b 0a 20 20 20 20 61 64 64 72 31   iDb);.    addr1
8a80: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
8a90: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp1(v, OP_If, r
8aa0: 65 67 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eg3); VdbeCovera
8ab0: 67 65 28 76 29 3b 0a 20 20 20 20 66 69 6c 65 46  ge(v);.    fileF
8ac0: 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61  ormat = (db->fla
8ad0: 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61  gs & SQLITE_Lega
8ae0: 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a  cyFileFmt)!=0 ?.
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b00: 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58    1 : SQLITE_MAX
8b10: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20  _FILE_FORMAT;.  
8b20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8b30: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
8b40: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f  kie, iDb, BTREE_
8b50: 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 66 69 6c  FILE_FORMAT, fil
8b60: 65 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71  eFormat);.    sq
8b70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8b80: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
8b90: 20 69 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54   iDb, BTREE_TEXT
8ba0: 5f 45 4e 43 4f 44 49 4e 47 2c 20 45 4e 43 28 64  _ENCODING, ENC(d
8bb0: 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b));.    sqlite3
8bc0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
8bd0: 61 64 64 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  addr1);..    /* 
8be0: 54 68 69 73 20 6a 75 73 74 20 63 72 65 61 74 65  This just create
8bf0: 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72  s a place-holder
8c00: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73   record in the s
8c10: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
8c20: 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  le..    ** The r
8c30: 65 63 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f  ecord created do
8c40: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
8c50: 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74  nything yet.  It
8c60: 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65   will be replace
8c70: 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  d.    ** by the 
8c80: 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f  real entry in co
8c90: 64 65 20 67 65 6e 65 72 61 74 65 64 20 61 74 20  de generated at 
8ca0: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
8cb0: 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
8cc0: 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   The rowid for t
8cd0: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20  he new entry is 
8ce0: 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72  left in register
8cf0: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
8d00: 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  d..    ** The ro
8d10: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
8d20: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
8d30: 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 20 70  is left in reg p
8d40: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a  Parse->regRoot..
8d50: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64      ** The rowid
8d60: 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 6e   and root page n
8d70: 75 6d 62 65 72 20 76 61 6c 75 65 73 20 61 72 65  umber values are
8d80: 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 63   needed by the c
8d90: 6f 64 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ode that.    ** 
8da0: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20  sqlite3EndTable 
8db0: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20  will generate.. 
8dc0: 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e     */.#if !defin
8dd0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
8de0: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
8df0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
8e00: 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 69  TUALTABLE).    i
8e10: 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69 73 56  f( isView || isV
8e20: 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20  irtual ){.      
8e30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8e40: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
8e50: 20 30 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d   0, reg2);.    }
8e60: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
8e70: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
8e80: 61 64 64 72 43 72 54 61 62 20 3d 0a 20 20 20 20  addrCrTab =.    
8e90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8ea0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65  AddOp3(v, OP_Cre
8eb0: 61 74 65 42 74 72 65 65 2c 20 69 44 62 2c 20 72  ateBtree, iDb, r
8ec0: 65 67 32 2c 20 42 54 52 45 45 5f 49 4e 54 4b 45  eg2, BTREE_INTKE
8ed0: 59 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  Y);.    }.    sq
8ee0: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
8ef0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62  able(pParse, iDb
8f00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8f10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
8f20: 65 77 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31  ewRowid, 0, reg1
8f30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8f40: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42  beAddOp4(v, OP_B
8f50: 6c 6f 62 2c 20 36 2c 20 72 65 67 33 2c 20 30 2c  lob, 6, reg3, 0,
8f60: 20 6e 75 6c 6c 52 6f 77 2c 20 50 34 5f 53 54 41   nullRow, P4_STA
8f70: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
8f80: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8f90: 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72 65 67  P_Insert, 0, reg
8fa0: 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71  3, reg1);.    sq
8fb0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
8fc0: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
8fd0: 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ND);.    sqlite3
8fe0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
8ff0: 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20  _Close);.  }..  
9000: 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65  /* Normal (non-e
9010: 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f  rror) return. */
9020: 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a  .  return;..  /*
9030: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
9040: 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72  urs, we jump her
9050: 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65  e */.begin_table
9060: 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65  _error:.  sqlite
9070: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
9080: 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
9090: 0a 2f 2a 20 53 65 74 20 70 72 6f 70 65 72 74 69  ./* Set properti
90a0: 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20 63 6f  es of a table co
90b0: 6c 75 6d 6e 20 62 61 73 65 64 20 6f 6e 20 74 68  lumn based on th
90c0: 65 20 28 6d 61 67 69 63 61 6c 29 0a 2a 2a 20 6e  e (magical).** n
90d0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
90e0: 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  n..*/.#if SQLITE
90f0: 5f 45 4e 41 42 4c 45 5f 48 49 44 44 45 4e 5f 43  _ENABLE_HIDDEN_C
9100: 4f 4c 55 4d 4e 53 0a 76 6f 69 64 20 73 71 6c 69  OLUMNS.void sqli
9110: 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74  te3ColumnPropert
9120: 69 65 73 46 72 6f 6d 4e 61 6d 65 28 54 61 62 6c  iesFromName(Tabl
9130: 65 20 2a 70 54 61 62 2c 20 43 6f 6c 75 6d 6e 20  e *pTab, Column 
9140: 2a 70 43 6f 6c 29 7b 0a 20 20 69 66 28 20 73 71  *pCol){.  if( sq
9150: 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 70  lite3_strnicmp(p
9160: 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 5f 5f 68  Col->zName, "__h
9170: 69 64 64 65 6e 5f 5f 22 2c 20 31 30 29 3d 3d 30  idden__", 10)==0
9180: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f   ){.    pCol->co
9190: 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
91a0: 47 5f 48 49 44 44 45 4e 3b 0a 20 20 7d 65 6c 73  G_HIDDEN;.  }els
91b0: 65 20 69 66 28 20 70 54 61 62 20 26 26 20 70 43  e if( pTab && pC
91c0: 6f 6c 21 3d 70 54 61 62 2d 3e 61 43 6f 6c 20 26  ol!=pTab->aCol &
91d0: 26 20 28 70 43 6f 6c 5b 2d 31 5d 2e 63 6f 6c 46  & (pCol[-1].colF
91e0: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 48  lags & COLFLAG_H
91f0: 49 44 44 45 4e 29 20 29 7b 0a 20 20 20 20 70 54  IDDEN) ){.    pT
9200: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
9210: 54 46 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a 20 20  TF_OOOHidden;.  
9220: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
9230: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c  ** Add a new col
9240: 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65  umn to the table
9250: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
9260: 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a   constructed..**
9270: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
9280: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
9290: 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  e once for each 
92a0: 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  column declarati
92b0: 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  on.** in a CREAT
92c0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
92d0: 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  t.  sqlite3Start
92e0: 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c  Table() gets cal
92f0: 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20  led.** first to 
9300: 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67  get things going
9310: 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75  .  Then this rou
9320: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
9330: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d  or each.** colum
9340: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
9350: 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73  e3AddColumn(Pars
9360: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
9370: 20 2a 70 4e 61 6d 65 2c 20 54 6f 6b 65 6e 20 2a   *pName, Token *
9380: 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20  pType){.  Table 
9390: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
93a0: 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a  har *z;.  char *
93b0: 7a 54 79 70 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20  zType;.  Column 
93c0: 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33  *pCol;.  sqlite3
93d0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
93e0: 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  b;.  if( (p = pP
93f0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
9400: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
9410: 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62  if( p->nCol+1>db
9420: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
9430: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
9440: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
9450: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
9460: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f  o many columns o
9470: 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  n %s", p->zName)
9480: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
9490: 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 44  }.  z = sqlite3D
94a0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70  bMallocRaw(db, p
94b0: 4e 61 6d 65 2d 3e 6e 20 2b 20 70 54 79 70 65 2d  Name->n + pType-
94c0: 3e 6e 20 2b 20 32 29 3b 0a 20 20 69 66 28 20 7a  >n + 2);.  if( z
94d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
94e0: 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
94f0: 4a 45 43 54 20 29 20 73 71 6c 69 74 65 33 52 65  JECT ) sqlite3Re
9500: 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61  nameTokenMap(pPa
9510: 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a 2c 20 70  rse, (void*)z, p
9520: 4e 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28  Name);.  memcpy(
9530: 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  z, pName->z, pNa
9540: 6d 65 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 4e 61 6d  me->n);.  z[pNam
9550: 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  e->n] = 0;.  sql
9560: 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a  ite3Dequote(z);.
9570: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
9580: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
9590: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
95a0: 63 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69  cmp(z, p->aCol[i
95b0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
95c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
95d0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
95e0: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
95f0: 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ame: %s", z);.  
9600: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9610: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
9620: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
9630: 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c  }.  if( (p->nCol
9640: 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20   & 0x7)==0 ){.  
9650: 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a    Column *aNew;.
9660: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
9670: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70  e3DbRealloc(db,p
9680: 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b  ->aCol,(p->nCol+
9690: 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  8)*sizeof(p->aCo
96a0: 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  l[0]));.    if( 
96b0: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
96c0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
96d0: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  b, z);.      ret
96e0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
96f0: 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20  ->aCol = aNew;. 
9700: 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e   }.  pCol = &p->
9710: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20  aCol[p->nCol];. 
9720: 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c   memset(pCol, 0,
9730: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b   sizeof(p->aCol[
9740: 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e  0]));.  pCol->zN
9750: 61 6d 65 20 3d 20 7a 3b 0a 20 20 73 71 6c 69 74  ame = z;.  sqlit
9760: 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69  e3ColumnProperti
9770: 65 73 46 72 6f 6d 4e 61 6d 65 28 70 2c 20 70 43  esFromName(p, pC
9780: 6f 6c 29 3b 0a 20 0a 20 20 69 66 28 20 70 54 79  ol);. .  if( pTy
9790: 70 65 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  pe->n==0 ){.    
97a0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
97b0: 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  o type specified
97c0: 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74  , columns have t
97d0: 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e  he default affin
97e0: 69 74 79 0a 20 20 20 20 2a 2a 20 27 42 4c 4f 42  ity.    ** 'BLOB
97f0: 27 20 77 69 74 68 20 61 20 64 65 66 61 75 6c 74  ' with a default
9800: 20 73 69 7a 65 20 6f 66 20 34 20 62 79 74 65 73   size of 4 bytes
9810: 2e 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61  . */.    pCol->a
9820: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
9830: 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70  _AFF_BLOB;.    p
9840: 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 31 3b 0a  Col->szEst = 1;.
9850: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
9860: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
9870: 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20 34  RENCES.    if( 4
9880: 3e 3d 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  >=sqlite3GlobalC
9890: 6f 6e 66 69 67 2e 73 7a 53 6f 72 74 65 72 52 65  onfig.szSorterRe
98a0: 66 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  f ){.      pCol-
98b0: 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  >colFlags |= COL
98c0: 46 4c 41 47 5f 53 4f 52 54 45 52 52 45 46 3b 0a  FLAG_SORTERREF;.
98d0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
98e0: 65 6c 73 65 7b 0a 20 20 20 20 7a 54 79 70 65 20  else{.    zType 
98f0: 3d 20 7a 20 2b 20 73 71 6c 69 74 65 33 53 74 72  = z + sqlite3Str
9900: 6c 65 6e 33 30 28 7a 29 20 2b 20 31 3b 0a 20 20  len30(z) + 1;.  
9910: 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20    memcpy(zType, 
9920: 70 54 79 70 65 2d 3e 7a 2c 20 70 54 79 70 65 2d  pType->z, pType-
9930: 3e 6e 29 3b 0a 20 20 20 20 7a 54 79 70 65 5b 70  >n);.    zType[p
9940: 54 79 70 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  Type->n] = 0;.  
9950: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
9960: 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 70 43 6f  (zType);.    pCo
9970: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
9980: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
9990: 65 28 7a 54 79 70 65 2c 20 70 43 6f 6c 29 3b 0a  e(zType, pCol);.
99a0: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
99b0: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41  gs |= COLFLAG_HA
99c0: 53 54 59 50 45 3b 0a 20 20 7d 0a 20 20 70 2d 3e  STYPE;.  }.  p->
99d0: 6e 43 6f 6c 2b 2b 3b 0a 20 20 70 50 61 72 73 65  nCol++;.  pParse
99e0: 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65  ->constraintName
99f0: 2e 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .n = 0;.}../*.**
9a00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
9a10: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
9a20: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
9a30: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
9a40: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
9a50: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
9a60: 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20  .  A "NOT NULL" 
9a70: 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a  constraint has.*
9a80: 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61  * been seen on a
9a90: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72   column.  This r
9aa0: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
9ab0: 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a  notNull flag on.
9ac0: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75  ** the column cu
9ad0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
9ae0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
9af0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f  oid sqlite3AddNo
9b00: 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61  tNull(Parse *pPa
9b10: 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72  rse, int onError
9b20: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
9b30: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
9b40: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
9b50: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
9b60: 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e  =0 || NEVER(p->n
9b70: 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b  Col<1) ) return;
9b80: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
9b90: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20  ol[p->nCol-1];. 
9ba0: 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 3d   pCol->notNull =
9bb0: 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20   (u8)onError;.  
9bc0: 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  p->tabFlags |= T
9bd0: 46 5f 48 61 73 4e 6f 74 4e 75 6c 6c 3b 0a 0a 20  F_HasNotNull;.. 
9be0: 20 2f 2a 20 53 65 74 20 74 68 65 20 75 6e 69 71   /* Set the uniq
9bf0: 4e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 20  NotNull flag on 
9c00: 61 6e 79 20 55 4e 49 51 55 45 20 6f 72 20 50 4b  any UNIQUE or PK
9c10: 20 69 6e 64 65 78 65 73 20 61 6c 72 65 61 64 79   indexes already
9c20: 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 6f 6e   created.  ** on
9c30: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 2e 20 20 2a   this column.  *
9c40: 2f 0a 20 20 69 66 28 20 70 43 6f 6c 2d 3e 63 6f  /.  if( pCol->co
9c50: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
9c60: 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20 20 20 49  _UNIQUE ){.    I
9c70: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
9c80: 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64  for(pIdx=p->pInd
9c90: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
9ca0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
9cb0: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
9cc0: 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20 70  >nKeyCol==1 && p
9cd0: 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  Idx->onError!=OE
9ce0: 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20 69  _None );.      i
9cf0: 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
9d00: 6e 5b 30 5d 3d 3d 70 2d 3e 6e 43 6f 6c 2d 31 20  n[0]==p->nCol-1 
9d10: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  ){.        pIdx-
9d20: 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31  >uniqNotNull = 1
9d30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9d40: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61    }.}../*.** Sca
9d50: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  n the column typ
9d60: 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65  e name zType (le
9d70: 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20  ngth nType) and 
9d80: 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73  return the.** as
9d90: 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69 74  sociated affinit
9da0: 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  y type..**.** Th
9db0: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
9dc0: 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65  a case-independe
9dd0: 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79  nt search of zTy
9de0: 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73  pe for the .** s
9df0: 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65  ubstrings in the
9e00: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
9e10: 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  . If one of the 
9e20: 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a  substrings is.**
9e30: 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72   found, the corr
9e40: 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69  esponding affini
9e50: 74 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ty is returned. 
9e60: 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e  If zType contain
9e70: 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s.** more than o
9e80: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
9e90: 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f  ings, entries to
9ea0: 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20  ward the top of 
9eb0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61  .** the table ta
9ec0: 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72  ke priority. For
9ed0: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79   example, if zTy
9ee0: 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c  pe is 'BLOBINT',
9ef0: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f   .** SQLITE_AFF_
9f00: 49 4e 54 45 47 45 52 20 69 73 20 72 65 74 75 72  INTEGER is retur
9f10: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74  ned..**.** Subst
9f20: 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e  ring     | Affin
9f30: 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ity.** ---------
9f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f50: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27  -------.** 'INT'
9f60: 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
9f70: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a  E_AFF_INTEGER.**
9f80: 20 27 43 48 41 52 27 20 20 20 20 20 20 20 20 7c   'CHAR'        |
9f90: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
9fa0: 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20  .** 'CLOB'      
9fb0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
9fc0: 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20  EXT.** 'TEXT'   
9fd0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
9fe0: 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27  F_TEXT.** 'BLOB'
9ff0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
a000: 5f 41 46 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52 45  _AFF_BLOB.** 'RE
a010: 41 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  AL'        | SQL
a020: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20  ITE_AFF_REAL.** 
a030: 27 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20  'FLOA'        | 
a040: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
a050: 2a 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20 20  ** 'DOUB'       
a060: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
a070: 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65  AL.**.** If none
a080: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
a090: 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  gs in the above 
a0a0: 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c  table are found,
a0b0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  .** SQLITE_AFF_N
a0c0: 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72 6e  UMERIC is return
a0d0: 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  ed..*/.char sqli
a0e0: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
a0f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c  const char *zIn,
a100: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a   Column *pCol){.
a110: 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63    u32 h = 0;.  c
a120: 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45  har aff = SQLITE
a130: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
a140: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 61  const char *zCha
a150: 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  r = 0;..  assert
a160: 28 20 7a 49 6e 21 3d 30 20 29 3b 0a 20 20 77 68  ( zIn!=0 );.  wh
a170: 69 6c 65 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20  ile( zIn[0] ){. 
a180: 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20     h = (h<<8) + 
a190: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
a1a0: 77 65 72 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d  wer[(*zIn)&0xff]
a1b0: 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20  ;.    zIn++;.   
a1c0: 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32   if( h==(('c'<<2
a1d0: 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27 61  4)+('h'<<16)+('a
a1e0: 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20 20  '<<8)+'r') ){   
a1f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41            /* CHA
a200: 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  R */.      aff =
a210: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
a220: 3b 0a 20 20 20 20 20 20 7a 43 68 61 72 20 3d 20  ;.      zChar = 
a230: 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  zIn;.    }else i
a240: 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29  f( h==(('c'<<24)
a250: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
a260: 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20  <8)+'b') ){     
a270: 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20    /* CLOB */.   
a280: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
a290: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
a2a0: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27  lse if( h==(('t'
a2b0: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
a2c0: 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('x'<<8)+'t') ){
a2d0: 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a         /* TEXT *
a2e0: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
a2f0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
a300: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
a310: 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('b'<<24)+('l'<
a320: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62  <16)+('o'<<8)+'b
a330: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ')          /* B
a340: 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOB */.        &
a350: 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  & (aff==SQLITE_A
a360: 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66  FF_NUMERIC || af
a370: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f==SQLITE_AFF_RE
a380: 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66  AL) ){.      aff
a390: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
a3a0: 4f 42 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49  OB;.      if( zI
a3b0: 6e 5b 30 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61  n[0]=='(' ) zCha
a3c0: 72 20 3d 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66  r = zIn;.#ifndef
a3d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
a3e0: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
a3f0: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
a400: 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36  r'<<24)+('e'<<16
a410: 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20  )+('a'<<8)+'l') 
a420: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c           /* REAL
a430: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
a440: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
a450: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
a460: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
a470: 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _REAL;.    }else
a480: 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32   if( h==(('f'<<2
a490: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
a4a0: 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20  '<<8)+'a')      
a4b0: 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20      /* FLOA */. 
a4c0: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
a4d0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
a4e0: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
a4f0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
a500: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a510: 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27  h==(('d'<<24)+('
a520: 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29  o'<<16)+('u'<<8)
a530: 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'b')          /
a540: 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20  * DOUB */.      
a550: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
a560: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
a570: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
a580: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e  TE_AFF_REAL;.#en
a590: 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dif.    }else if
a5a0: 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46 29  ( (h&0x00FFFFFF)
a5b0: 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e  ==(('i'<<16)+('n
a5c0: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
a5d0: 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20   /* INT */.     
a5e0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
a5f0: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  F_INTEGER;.     
a600: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a610: 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 43 6f 6c 20  }..  /* If pCol 
a620: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f  is not NULL, sto
a630: 72 65 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  re an estimate o
a640: 66 20 74 68 65 20 66 69 65 6c 64 20 73 69 7a 65  f the field size
a650: 2e 20 20 54 68 65 0a 20 20 2a 2a 20 65 73 74 69  .  The.  ** esti
a660: 6d 61 74 65 20 69 73 20 73 63 61 6c 65 64 20 73  mate is scaled s
a670: 6f 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  o that the size 
a680: 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 69 73  of an integer is
a690: 20 31 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43   1.  */.  if( pC
a6a0: 6f 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 76 20  ol ){.    int v 
a6b0: 3d 20 30 3b 20 20 20 2f 2a 20 64 65 66 61 75 6c  = 0;   /* defaul
a6c0: 74 20 73 69 7a 65 20 69 73 20 61 70 70 72 6f 78  t size is approx
a6d0: 20 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20   4 bytes */.    
a6e0: 69 66 28 20 61 66 66 3c 53 51 4c 49 54 45 5f 41  if( aff<SQLITE_A
a6f0: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
a700: 20 20 20 20 69 66 28 20 7a 43 68 61 72 20 29 7b      if( zChar ){
a710: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
a720: 7a 43 68 61 72 5b 30 5d 20 29 7b 0a 20 20 20 20  zChar[0] ){.    
a730: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
a740: 33 49 73 64 69 67 69 74 28 7a 43 68 61 72 5b 30  3Isdigit(zChar[0
a750: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
a760: 20 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56 41    /* BLOB(k), VA
a770: 52 43 48 41 52 28 6b 29 2c 20 43 48 41 52 28 6b  RCHAR(k), CHAR(k
a780: 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20 2a  ) -> r=(k/4+1) *
a790: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  /.            sq
a7a0: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 43  lite3GetInt32(zC
a7b0: 68 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20  har, &v);.      
a7c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a7d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a7e0: 20 20 20 7a 43 68 61 72 2b 2b 3b 0a 20 20 20 20     zChar++;.    
a7f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
a800: 65 7b 0a 20 20 20 20 20 20 20 20 76 20 3d 20 31  e{.        v = 1
a810: 36 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45  6;   /* BLOB, TE
a820: 58 54 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20  XT, CLOB -> r=5 
a830: 20 28 61 70 70 72 6f 78 20 32 30 20 62 79 74 65   (approx 20 byte
a840: 73 29 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  s)*/.      }.   
a850: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
a860: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
a870: 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66  EFERENCES.    if
a880: 28 20 76 3e 3d 73 71 6c 69 74 65 33 47 6c 6f 62  ( v>=sqlite3Glob
a890: 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 6f 72 74 65  alConfig.szSorte
a8a0: 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20 70 43  rRef ){.      pC
a8b0: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
a8c0: 43 4f 4c 46 4c 41 47 5f 53 4f 52 54 45 52 52 45  COLFLAG_SORTERRE
a8d0: 46 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  F;.    }.#endif.
a8e0: 20 20 20 20 76 20 3d 20 76 2f 34 20 2b 20 31 3b      v = v/4 + 1;
a8f0: 0a 20 20 20 20 69 66 28 20 76 3e 32 35 35 20 29  .    if( v>255 )
a900: 20 76 20 3d 20 32 35 35 3b 0a 20 20 20 20 70 43   v = 255;.    pC
a910: 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 76 3b 0a 20  ol->szEst = v;. 
a920: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b   }.  return aff;
a930: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78  .}../*.** The ex
a940: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
a950: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
a960: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
a970: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
a980: 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65  .** of the table
a990: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
a9a0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
a9b0: 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c  *.** Default val
a9c0: 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d  ue expressions m
a9d0: 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e  ust be constant.
a9e0: 20 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70    Raise an excep
a9f0: 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20  tion if this.** 
aa00: 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e  is not the case.
aa10: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
aa20: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
aa30: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
aa40: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
aa50: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
aa60: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
aa70: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
aa80: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c  sqlite3AddDefaul
aa90: 74 56 61 6c 75 65 28 0a 20 20 50 61 72 73 65 20  tValue(.  Parse 
aaa0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
aab0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
aac0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
aad0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
aae0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
aaf0: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  d expression of 
ab00: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
ab10: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
ab20: 72 20 2a 7a 53 74 61 72 74 2c 20 20 20 20 20 20  r *zStart,      
ab30: 2f 2a 20 53 74 61 72 74 20 6f 66 20 74 68 65 20  /* Start of the 
ab40: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 74 65  default value te
ab50: 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  xt */.  const ch
ab60: 61 72 20 2a 7a 45 6e 64 20 20 20 20 20 20 20 20  ar *zEnd        
ab70: 20 2f 2a 20 46 69 72 73 74 20 63 68 61 72 61 63   /* First charac
ab80: 74 65 72 20 70 61 73 74 20 65 6e 64 20 6f 66 20  ter past end of 
ab90: 64 65 66 61 75 74 20 76 61 6c 75 65 20 74 65 78  defaut value tex
aba0: 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  t */.){.  Table 
abb0: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
abc0: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
abd0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
abe0: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
abf0: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
ac00: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20  !=0 ){.    pCol 
ac10: 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  = &(p->aCol[p->n
ac20: 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28  Col-1]);.    if(
ac30: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
ac40: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
ac50: 6e 28 70 45 78 70 72 2c 20 64 62 2d 3e 69 6e 69  n(pExpr, db->ini
ac60: 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20  t.busy) ){.     
ac70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
ac80: 28 70 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c  (pParse, "defaul
ac90: 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d  t value of colum
aca0: 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f  n [%s] is not co
acb0: 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20  nstant",.       
acc0: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b     pCol->zName);
acd0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ace0: 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70    /* A copy of p
acf0: 45 78 70 72 20 69 73 20 75 73 65 64 20 69 6e 73  Expr is used ins
ad00: 74 65 61 64 20 6f 66 20 74 68 65 20 6f 72 69 67  tead of the orig
ad10: 69 6e 61 6c 2c 20 61 73 20 70 45 78 70 72 20 63  inal, as pExpr c
ad20: 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
ad30: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 70 6f 69   tokens that poi
ad40: 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d  nt to volatile m
ad50: 65 6d 6f 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  emory..      */.
ad60: 20 20 20 20 20 20 45 78 70 72 20 78 3b 0a 20 20        Expr x;.  
ad70: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
ad80: 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  elete(db, pCol->
ad90: 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 6d 65  pDflt);.      me
ada0: 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a 65  mset(&x, 0, size
adb0: 6f 66 28 78 29 29 3b 0a 20 20 20 20 20 20 78 2e  of(x));.      x.
adc0: 6f 70 20 3d 20 54 4b 5f 53 50 41 4e 3b 0a 20 20  op = TK_SPAN;.  
add0: 20 20 20 20 78 2e 75 2e 7a 54 6f 6b 65 6e 20 3d      x.u.zToken =
ade0: 20 73 71 6c 69 74 65 33 44 62 53 70 61 6e 44 75   sqlite3DbSpanDu
adf0: 70 28 64 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45  p(db, zStart, zE
ae00: 6e 64 29 3b 0a 20 20 20 20 20 20 78 2e 70 4c 65  nd);.      x.pLe
ae10: 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  ft = pExpr;.    
ae20: 20 20 78 2e 66 6c 61 67 73 20 3d 20 45 50 5f 53    x.flags = EP_S
ae30: 6b 69 70 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  kip;.      pCol-
ae40: 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >pDflt = sqlite3
ae50: 45 78 70 72 44 75 70 28 64 62 2c 20 26 78 2c 20  ExprDup(db, &x, 
ae60: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
ae70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
ae80: 46 72 65 65 28 64 62 2c 20 78 2e 75 2e 7a 54 6f  Free(db, x.u.zTo
ae90: 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ken);.    }.  }.
aea0: 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
aeb0: 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71  OBJECT ){.    sq
aec0: 6c 69 74 65 33 52 65 6e 61 6d 65 45 78 70 72 55  lite3RenameExprU
aed0: 6e 6d 61 70 28 70 50 61 72 73 65 2c 20 70 45 78  nmap(pParse, pEx
aee0: 70 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  pr);.  }.  sqlit
aef0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
af00: 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
af10: 2a 20 42 61 63 6b 77 61 72 64 73 20 43 6f 6d 70  * Backwards Comp
af20: 61 74 69 62 69 6c 69 74 79 20 48 61 63 6b 3a 0a  atibility Hack:.
af30: 2a 2a 20 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61  ** .** Historica
af40: 6c 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  l versions of SQ
af50: 4c 69 74 65 20 61 63 63 65 70 74 65 64 20 73 74  Lite accepted st
af60: 72 69 6e 67 73 20 61 73 20 63 6f 6c 75 6d 6e 20  rings as column 
af70: 6e 61 6d 65 73 20 69 6e 0a 2a 2a 20 69 6e 64 65  names in.** inde
af80: 78 65 73 20 61 6e 64 20 50 52 49 4d 41 52 59 20  xes and PRIMARY 
af90: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  KEY constraints 
afa0: 61 6e 64 20 69 6e 20 55 4e 49 51 55 45 20 63 6f  and in UNIQUE co
afb0: 6e 73 74 72 61 69 6e 74 73 2e 20 20 45 78 61 6d  nstraints.  Exam
afc0: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43  ple:.**.**     C
afd0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 79 7a 28  REATE TABLE xyz(
afe0: 61 2c 62 2c 63 2c 64 2c 65 2c 50 52 49 4d 41 52  a,b,c,d,e,PRIMAR
aff0: 59 20 4b 45 59 28 27 61 27 29 2c 55 4e 49 51 55  Y KEY('a'),UNIQU
b000: 45 28 27 62 27 2c 27 63 27 20 43 4f 4c 4c 41 54  E('b','c' COLLAT
b010: 45 20 74 72 69 6d 29 0a 2a 2a 20 20 20 20 20 43  E trim).**     C
b020: 52 45 41 54 45 20 49 4e 44 45 58 20 61 62 63 20  REATE INDEX abc 
b030: 4f 4e 20 78 79 7a 28 27 63 27 2c 27 64 27 20 44  ON xyz('c','d' D
b040: 45 53 43 2c 27 65 27 20 43 4f 4c 4c 41 54 45 20  ESC,'e' COLLATE 
b050: 6e 6f 63 61 73 65 20 44 45 53 43 29 3b 0a 2a 2a  nocase DESC);.**
b060: 0a 2a 2a 20 54 68 69 73 20 69 73 20 67 6f 6f 66  .** This is goof
b070: 79 2e 20 20 42 75 74 20 74 6f 20 70 72 65 73 65  y.  But to prese
b080: 72 76 65 20 62 61 63 6b 77 61 72 64 73 20 63 6f  rve backwards co
b090: 6d 70 61 74 69 62 69 6c 69 74 79 20 77 65 20 63  mpatibility we c
b0a0: 6f 6e 74 69 6e 75 65 20 74 6f 0a 2a 2a 20 61 63  ontinue to.** ac
b0b0: 63 65 70 74 20 69 74 2e 20 20 54 68 69 73 20 72  cept it.  This r
b0c0: 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
b0d0: 6e 65 63 65 73 73 61 72 79 20 63 6f 6e 76 65 72  necessary conver
b0e0: 73 69 6f 6e 2e 20 20 49 74 20 63 6f 6e 76 65 72  sion.  It conver
b0f0: 74 73 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  ts.** the expres
b100: 73 69 6f 6e 20 67 69 76 65 6e 20 69 6e 20 69 74  sion given in it
b110: 73 20 61 72 67 75 6d 65 6e 74 20 66 72 6f 6d 20  s argument from 
b120: 61 20 54 4b 5f 53 54 52 49 4e 47 20 69 6e 74 6f  a TK_STRING into
b130: 20 61 20 54 4b 5f 49 44 0a 2a 2a 20 69 66 20 74   a TK_ID.** if t
b140: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
b150: 20 6a 75 73 74 20 61 20 54 4b 5f 53 54 52 49 4e   just a TK_STRIN
b160: 47 20 77 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e  G with an option
b170: 61 6c 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73  al COLLATE claus
b180: 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 70 78  e..** If the epx
b190: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 79 74 68  ression is anyth
b1a0: 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 54  ing other than T
b1b0: 4b 5f 53 54 52 49 4e 47 2c 20 74 68 65 20 65 78  K_STRING, the ex
b1c0: 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 75  pression is.** u
b1d0: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61  nchanged..*/.sta
b1e0: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
b1f0: 53 74 72 69 6e 67 54 6f 49 64 28 45 78 70 72 20  StringToId(Expr 
b200: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  *p){.  if( p->op
b210: 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20  ==TK_STRING ){. 
b220: 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44     p->op = TK_ID
b230: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
b240: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
b250: 26 26 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  && p->pLeft->op=
b260: 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20  =TK_STRING ){.  
b270: 20 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d    p->pLeft->op =
b280: 20 54 4b 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f   TK_ID;.  }.}../
b290: 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74  *.** Designate t
b2a0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66  he PRIMARY KEY f
b2b0: 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70  or the table.  p
b2c0: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
b2d0: 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63  f names .** of c
b2e0: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d  olumns that form
b2f0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
b300: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e  .  If pList is N
b310: 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ULL, then the.**
b320: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
b330: 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  dded column of t
b340: 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  he table is the 
b350: 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a  primary key..**.
b360: 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68  ** A table can h
b370: 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
b380: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
b390: 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
b3a0: 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d  dy has.** a prim
b3b0: 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69  ary key (and thi
b3c0: 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  s is the second 
b3d0: 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65  primary key) the
b3e0: 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65  n create an.** e
b3f0: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
b400: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
b410: 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f  s on a single co
b420: 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74  lumn whose datat
b430: 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a  ype is INTEGER,.
b440: 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  ** then we will 
b450: 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20  try to use that 
b460: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f  column as the ro
b470: 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61  wid.  Set the Ta
b480: 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65  ble.iPKey.** fie
b490: 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ld of the table 
b4a0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
b4b0: 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64  on to be the ind
b4c0: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54  ex of the.** INT
b4d0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
b4e0: 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e   column.  Table.
b4f0: 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20  iPKey is set to 
b500: 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a  -1 if there is.*
b510: 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  * no INTEGER PRI
b520: 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20  MARY KEY..**.** 
b530: 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f  If the key is no
b540: 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
b550: 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63  MARY KEY, then c
b560: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a  reate a unique.*
b570: 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  * index for the 
b580: 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69  key.  No index i
b590: 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e  s created for IN
b5a0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
b5b0: 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Ys..*/.void sqli
b5c0: 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
b5d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b5e0: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
b5f0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
b600: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
b610: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64  /* List of field
b620: 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64   names to be ind
b630: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
b640: 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57  Error,      /* W
b650: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61  hat to do with a
b660: 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66   uniqueness conf
b670: 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75  lict */.  int au
b680: 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54  toInc,      /* T
b690: 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49  rue if the AUTOI
b6a0: 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64  NCREMENT keyword
b6b0: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
b6c0: 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20   int sortOrder  
b6d0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f     /* SQLITE_SO_
b6e0: 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f  ASC or SQLITE_SO
b6f0: 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61  _DESC */.){.  Ta
b700: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
b710: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
b720: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20   Column *pCol = 
b730: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
b740: 2d 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65  -1, i;.  int nTe
b750: 72 6d 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  rm;.  if( pTab==
b760: 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79  0 ) goto primary
b770: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28  _key_exit;.  if(
b780: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
b790: 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b  & TF_HasPrimaryK
b7a0: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
b7b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
b7c0: 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20  , .      "table 
b7d0: 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20  \"%s\" has more 
b7e0: 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79  than one primary
b7f0: 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61   key", pTab->zNa
b800: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72  me);.    goto pr
b810: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
b820: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62 46    }.  pTab->tabF
b830: 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50 72  lags |= TF_HasPr
b840: 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28 20  imaryKey;.  if( 
b850: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
b860: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  iCol = pTab->nCo
b870: 6c 20 2d 20 31 3b 0a 20 20 20 20 70 43 6f 6c 20  l - 1;.    pCol 
b880: 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
b890: 6f 6c 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63  ol];.    pCol->c
b8a0: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
b8b0: 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20  AG_PRIMKEY;.    
b8c0: 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c  nTerm = 1;.  }el
b8d0: 73 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20  se{.    nTerm = 
b8e0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
b8f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65    for(i=0; i<nTe
b900: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
b910: 45 78 70 72 20 2a 70 43 45 78 70 72 20 3d 20 73  Expr *pCExpr = s
b920: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
b930: 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  llate(pList->a[i
b940: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
b950: 61 73 73 65 72 74 28 20 70 43 45 78 70 72 21 3d  assert( pCExpr!=
b960: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
b970: 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70 43 45  e3StringToId(pCE
b980: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
b990: 70 43 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  pCExpr->op==TK_I
b9a0: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  D ){.        con
b9b0: 73 74 20 63 68 61 72 20 2a 7a 43 4e 61 6d 65 20  st char *zCName 
b9c0: 3d 20 70 43 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  = pCExpr->u.zTok
b9d0: 65 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  en;.        for(
b9e0: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
b9f0: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
ba00: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
ba10: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
ba20: 43 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  CName, pTab->aCo
ba30: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d  l[iCol].zName)==
ba40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
ba50: 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61   pCol = &pTab->a
ba60: 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  Col[iCol];.     
ba70: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c         pCol->col
ba80: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
ba90: 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20  _PRIMKEY;.      
baa0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bab0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bac0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
bad0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d  .  }.  if( nTerm
bae0: 3d 3d 31 0a 20 20 20 26 26 20 70 43 6f 6c 0a 20  ==1.   && pCol. 
baf0: 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49    && sqlite3StrI
bb00: 43 6d 70 28 73 71 6c 69 74 65 33 43 6f 6c 75 6d  Cmp(sqlite3Colum
bb10: 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c 20  nType(pCol,""), 
bb20: 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20  "INTEGER")==0.  
bb30: 20 26 26 20 73 6f 72 74 4f 72 64 65 72 21 3d 53   && sortOrder!=S
bb40: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 0a 20 20  QLITE_SO_DESC.  
bb50: 29 7b 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45  ){.    if( IN_RE
bb60: 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20 70  NAME_OBJECT && p
bb70: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 73 71  List ){.      sq
bb80: 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
bb90: 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20 26 70  Remap(pParse, &p
bba0: 54 61 62 2d 3e 69 50 4b 65 79 2c 20 70 4c 69 73  Tab->iPKey, pLis
bbb0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
bbc0: 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 2d 3e      }.    pTab->
bbd0: 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20  iPKey = iCol;.  
bbe0: 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20    pTab->keyConf 
bbf0: 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20  = (u8)onError;. 
bc00: 20 20 20 61 73 73 65 72 74 28 20 61 75 74 6f 49     assert( autoI
bc10: 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63  nc==0 || autoInc
bc20: 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62 2d  ==1 );.    pTab-
bc30: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 61 75 74  >tabFlags |= aut
bc40: 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72  oInc*TF_Autoincr
bc50: 65 6d 65 6e 74 3b 0a 20 20 20 20 69 66 28 20 70  ement;.    if( p
bc60: 4c 69 73 74 20 29 20 70 50 61 72 73 65 2d 3e 69  List ) pParse->i
bc70: 50 6b 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c  PkSortOrder = pL
bc80: 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72  ist->a[0].sortOr
bc90: 64 65 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  der;.  }else if(
bca0: 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e   autoInc ){.#ifn
bcb0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bcc0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
bcd0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
bce0: 67 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49  g(pParse, "AUTOI
bcf0: 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79  NCREMENT is only
bd00: 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22   allowed on an "
bd10: 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52  .       "INTEGER
bd20: 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a   PRIMARY KEY");.
bd30: 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
bd40: 20 20 20 20 73 71 6c 69 74 65 33 43 72 65 61 74      sqlite3Creat
bd50: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30  eIndex(pParse, 0
bd60: 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f  , 0, 0, pList, o
bd70: 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20  nError, 0,.     
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd90: 20 20 20 20 20 20 30 2c 20 73 6f 72 74 4f 72 64        0, sortOrd
bda0: 65 72 2c 20 30 2c 20 53 51 4c 49 54 45 5f 49 44  er, 0, SQLITE_ID
bdb0: 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59  XTYPE_PRIMARYKEY
bdc0: 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30  );.    pList = 0
bdd0: 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b  ;.  }..primary_k
bde0: 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ey_exit:.  sqlit
bdf0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
be00: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69  (pParse->db, pLi
be10: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  st);.  return;.}
be20: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
be30: 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  w CHECK constrai
be40: 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  nt to the table 
be50: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
be60: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
be70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
be80: 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28  CheckConstraint(
be90: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
bea0: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
beb0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
bec0: 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f  r *pCheckExpr  /
bed0: 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70 72  * The check expr
bee0: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66  ession */.){.#if
bef0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bf00: 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a  _CHECK.  Table *
bf10: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
bf20: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69  NewTable;.  sqli
bf30: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
bf40: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 54 61 62  ->db;.  if( pTab
bf50: 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f   && !IN_DECLARE_
bf60: 56 54 41 42 0a 20 20 20 26 26 20 21 73 71 6c 69  VTAB.   && !sqli
bf70: 74 65 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e  te3BtreeIsReadon
bf80: 6c 79 28 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 69  ly(db->aDb[db->i
bf90: 6e 69 74 2e 69 44 62 5d 2e 70 42 74 29 0a 20 20  nit.iDb].pBt).  
bfa0: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 68  ){.    pTab->pCh
bfb0: 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eck = sqlite3Exp
bfc0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
bfd0: 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  se, pTab->pCheck
bfe0: 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20  , pCheckExpr);. 
bff0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63     if( pParse->c
c000: 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20  onstraintName.n 
c010: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c020: 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
c030: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43  pParse, pTab->pC
c040: 68 65 63 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63  heck, &pParse->c
c050: 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31  onstraintName, 1
c060: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
c070: 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
c080: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
c090: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43  e(pParse->db, pC
c0a0: 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d  heckExpr);.  }.}
c0b0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
c0c0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
c0d0: 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
c0e0: 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74  ecently parsed t
c0f0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74  able column.** t
c100: 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69  o the CollSeq gi
c110: 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ven..*/.void sql
c120: 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79  ite3AddCollateTy
c130: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
c140: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
c150: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
c160: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
c170: 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
c180: 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e     /* Dequoted n
c190: 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e  ame of collation
c1a0: 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73   sequence */.  s
c1b0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
c1c0: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
c1d0: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
c1e0: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
c1f0: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20  >nCol-1;.  db = 
c200: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43  pParse->db;.  zC
c210: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  oll = sqlite3Nam
c220: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
c230: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a  Token);.  if( !z
c240: 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a  Coll ) return;..
c250: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 63    if( sqlite3Loc
c260: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
c270: 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
c280: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
c290: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
c2a0: 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  db, p->aCol[i].z
c2b0: 43 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43  Coll);.    p->aC
c2c0: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43  ol[i].zColl = zC
c2d0: 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49  oll;.  .    /* I
c2e0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
c2f0: 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61  declared as "<na
c300: 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20  me> PRIMARY KEY 
c310: 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c  COLLATE <type>",
c320: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20  .    ** then an 
c330: 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62  index may have b
c340: 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74  een created on t
c350: 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72  his column befor
c360: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c  e the.    ** col
c370: 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20  lation type was 
c380: 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74  added. Correct t
c390: 68 69 73 20 69 66 20 69 74 20 69 73 20 74 68 65  his if it is the
c3a0: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
c3b0: 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49    for(pIdx=p->pI
c3c0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
c3d0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
c3e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
c3f0: 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b  x->nKeyCol==1 );
c400: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
c410: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20  >aiColumn[0]==i 
c420: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  ){.        pIdx-
c430: 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e  >azColl[0] = p->
c440: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[i].zColl;. 
c450: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c460: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
c470: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
c480: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
c490: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
c4a0: 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61  eturns the colla
c4b0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
c4c0: 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  r database nativ
c4d0: 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69  e text.** encodi
c4e0: 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ng identified by
c4f0: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d   the string zNam
c500: 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e  e, length nName.
c510: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
c520: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
c530: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f  n sequence is no
c540: 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  t available, or 
c550: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  not available.**
c560: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
c570: 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67   native encoding
c580: 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  , the collation 
c590: 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b  factory is invok
c5a0: 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74  ed to.** request
c5b0: 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c   it. If the coll
c5c0: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f  ation factory do
c5d0: 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75  es not supply su
c5e0: 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a  ch a sequence,.*
c5f0: 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e  * and the sequen
c600: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
c610: 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20  in another text 
c620: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74  encoding, then t
c630: 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  hat is.** return
c640: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
c650: 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73  * If no versions
c660: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65   of the requeste
c670: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71  d collations seq
c680: 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61  uence are availa
c690: 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68  ble, or.** anoth
c6a0: 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  er error occurs,
c6b0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
c6c0: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  d and an error m
c6d0: 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69  essage written i
c6e0: 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a  nto.** pParse..*
c6f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c700: 65 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  e is a wrapper a
c710: 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  round sqlite3Fin
c720: 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69  dCollSeq().  Thi
c730: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76  s routine.** inv
c740: 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  okes the collati
c750: 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74 68  on factory if th
c760: 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f  e named collatio
c770: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  n cannot be foun
c780: 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  d.** and generat
c790: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
c7a0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  age..**.** See a
c7b0: 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e 64  lso: sqlite3Find
c7c0: 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69 74  CollSeq(), sqlit
c7d0: 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a  e3GetCollSeq().*
c7e0: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
c7f0: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
c800: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
c810: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
c820: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
c830: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c840: 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62   u8 enc = ENC(db
c850: 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79  );.  u8 initbusy
c860: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79   = db->init.busy
c870: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
c880: 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73  ll;..  pColl = s
c890: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
c8a0: 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65  q(db, enc, zName
c8b0: 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69  , initbusy);.  i
c8c0: 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20  f( !initbusy && 
c8d0: 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c  (!pColl || !pCol
c8e0: 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20  l->xCmp) ){.    
c8f0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
c900: 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  etCollSeq(pParse
c910: 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e  , enc, pColl, zN
c920: 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ame);.  }..  ret
c930: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f  urn pColl;.}.../
c940: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
c950: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63  de that will inc
c960: 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d  rement the schem
c970: 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20  a cookie..**.** 
c980: 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  The schema cooki
c990: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
c9a0: 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20  ermine when the 
c9b0: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a  schema for the.*
c9c0: 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
c9d0: 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  es.  After each 
c9e0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74  schema change, t
c9f0: 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a  he cookie value.
ca00: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65  ** changes.  Whe
ca10: 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73  n a process firs
ca20: 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65  t reads the sche
ca30: 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68  ma it records th
ca40: 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68  e.** cookie.  Th
ca50: 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76  ereafter, whenev
ca60: 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63  er it goes to ac
ca70: 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
ca80: 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20  e,.** it checks 
ca90: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61  the cookie to ma
caa0: 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65  ke sure the sche
cab0: 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  ma has not chang
cac0: 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77  ed.** since it w
cad0: 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a  as last read..**
cae0: 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73  .** This plan is
caf0: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
cb00: 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49  bullet-proof.  I
cb10: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
cb20: 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20  r.** the schema 
cb30: 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70  to change multip
cb40: 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72  le times and for
cb50: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62   the cookie to b
cb60: 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f  e.** set back to
cb70: 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42   prior value.  B
cb80: 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ut schema change
cb90: 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74  s are infrequent
cba0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62  .** and the prob
cbb0: 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69  ability of hitti
cbc0: 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b  ng the same cook
cbd0: 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79  ie value is only
cbe0: 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20  .** 1 chance in 
cbf0: 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20  2^32.  So we're 
cc00: 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2a 0a  safe enough..**.
cc10: 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
cc20: 4e 2d 4f 46 3a 20 52 2d 33 34 32 33 30 2d 35 36  N-OF: R-34230-56
cc30: 30 34 39 20 53 51 4c 69 74 65 20 61 75 74 6f 6d  049 SQLite autom
cc40: 61 74 69 63 61 6c 6c 79 20 69 6e 63 72 65 6d 65  atically increme
cc50: 6e 74 73 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  nts.** the schem
cc60: 61 2d 76 65 72 73 69 6f 6e 20 77 68 65 6e 65 76  a-version whenev
cc70: 65 72 20 74 68 65 20 73 63 68 65 6d 61 20 63 68  er the schema ch
cc80: 61 6e 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  anges..*/.void s
cc90: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
cca0: 69 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ie(Parse *pParse
ccb0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
ccc0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
ccd0: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
cce0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
ccf0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
cd00: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
cd10: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
cd20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
cd30: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
cd40: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52  Cookie, iDb, BTR
cd50: 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f  EE_SCHEMA_VERSIO
cd60: 4e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  N, .            
cd70: 20 20 20 20 20 20 20 28 69 6e 74 29 28 31 2b 28         (int)(1+(
cd80: 75 6e 73 69 67 6e 65 64 29 64 62 2d 3e 61 44 62  unsigned)db->aDb
cd90: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73  [iDb].pSchema->s
cda0: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 29 29 3b 0a  chema_cookie));.
cdb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65  }../*.** Measure
cdc0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
cdd0: 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64  haracters needed
cde0: 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67   to output the g
cdf0: 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69  iven.** identifi
ce00: 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  er.  The number 
ce10: 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65  returned include
ce20: 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65  s any quotes use
ce30: 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f  d.** but does no
ce40: 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75  t include the nu
ce50: 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a  ll terminator..*
ce60: 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74  *.** The estimat
ce70: 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76  e is conservativ
ce80: 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65 20  e.  It might be 
ce90: 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61 74  larger that what
cea0: 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65   is.** really ne
ceb0: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
cec0: 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28  int identLength(
ced0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
cee0: 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e    int n;.  for(n
cef0: 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b  =0; *z; n++, z++
cf00: 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27  ){.    if( *z=='
cf10: 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d  "' ){ n++; }.  }
cf20: 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b  .  return n + 2;
cf30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  .}../*.** The fi
cf40: 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  rst parameter is
cf50: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
cf60: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20   output buffer. 
cf70: 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70  The second .** p
cf80: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
cf90: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65  inter to an inte
cfa0: 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ger that contain
cfb0: 73 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 0a  s the offset at.
cfc0: 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72 69 74  ** which to writ
cfd0: 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
cfe0: 74 20 62 75 66 66 65 72 2e 20 54 68 69 73 20 66  t buffer. This f
cff0: 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73 20 74  unction copies t
d000: 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e  he.** nul-termin
d010: 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f 69 6e  ated string poin
d020: 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 74 68  ted to by the th
d030: 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c 20 7a  ird parameter, z
d040: 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20  SignedIdent,.** 
d050: 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64  to the specified
d060: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 62   offset in the b
d070: 75 66 66 65 72 20 61 6e 64 20 75 70 64 61 74 65  uffer and update
d080: 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66 65 72  s *pIdx to refer
d090: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
d0a0: 20 62 79 74 65 20 61 66 74 65 72 20 74 68 65 20   byte after the 
d0b0: 6c 61 73 74 20 62 79 74 65 20 77 72 69 74 74 65  last byte writte
d0c0: 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  n before returni
d0d0: 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  ng..** .** If th
d0e0: 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e 65 64  e string zSigned
d0f0: 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73 20 65  Ident consists e
d100: 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70 68 61  ntirely of alpha
d110: 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72  -numeric.** char
d120: 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74  acters, does not
d130: 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 64 69   begin with a di
d140: 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74 20 61  git and is not a
d150: 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a  n SQL keyword,.*
d160: 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70  * then it is cop
d170: 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ied to the outpu
d180: 74 20 62 75 66 66 65 72 20 65 78 61 63 74 6c 79  t buffer exactly
d190: 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68 65 72   as it is. Other
d1a0: 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71  wise,.** it is q
d1b0: 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f 75 62  uoted using doub
d1c0: 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74  le-quotes..*/.st
d1d0: 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50  atic void identP
d1e0: 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  ut(char *z, int 
d1f0: 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69  *pIdx, char *zSi
d200: 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e  gnedIdent){.  un
d210: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64  signed char *zId
d220: 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ent = (unsigned 
d230: 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65  char*)zSignedIde
d240: 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  nt;.  int i, j, 
d250: 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d  needQuote;.  i =
d260: 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a   *pIdx;..  for(j
d270: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
d280: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 71  ++){.    if( !sq
d290: 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64  lite3Isalnum(zId
d2a0: 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e  ent[j]) && zIden
d2b0: 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61  t[j]!='_' ) brea
d2c0: 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f  k;.  }.  needQuo
d2d0: 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73 64 69  te = sqlite3Isdi
d2e0: 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20  git(zIdent[0]). 
d2f0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
d300: 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65  lite3KeywordCode
d310: 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f  (zIdent, j)!=TK_
d320: 49 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  ID.            |
d330: 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20  | zIdent[j]!=0. 
d340: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3d             || j=
d350: 3d 30 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 51  =0;..  if( needQ
d360: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
d370: 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  '"';.  for(j=0; 
d380: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
d390: 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49  .    z[i++] = zI
d3a0: 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  dent[j];.    if(
d3b0: 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20   zIdent[j]=='"' 
d3c0: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
d3d0: 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75    }.  if( needQu
d3e0: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
d3f0: 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a  "';.  z[i] = 0;.
d400: 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a    *pIdx = i;.}..
d410: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
d420: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
d430: 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69  atement appropri
d440: 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ate for the give
d450: 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d  n.** table.  Mem
d460: 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ory to hold the 
d470: 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61 74  text of the stat
d480: 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65  ement is obtaine
d490: 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  d.** from sqlite
d4a0: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
d4b0: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
d4c0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
d4d0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  on..*/.static ch
d4e0: 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53  ar *createTableS
d4f0: 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  tmt(sqlite3 *db,
d500: 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e   Table *p){.  in
d510: 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61  t i, k, n;.  cha
d520: 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72  r *zStmt;.  char
d530: 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20   *zSep, *zSep2, 
d540: 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20  *zEnd;.  Column 
d550: 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a  *pCol;.  n = 0;.
d560: 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e    for(pCol = p->
d570: 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e  aCol, i=0; i<p->
d580: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
d590: 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65  +){.    n += ide
d5a0: 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a  ntLength(pCol->z
d5b0: 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20  Name) + 5;.  }. 
d5c0: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
d5d0: 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  h(p->zName);.  i
d5e0: 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20  f( n<50 ){ .    
d5f0: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a  zSep = "";.    z
d600: 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20  Sep2 = ",";.    
d610: 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65  zEnd = ")";.  }e
d620: 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20  lse{.    zSep = 
d630: 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70  "\n  ";.    zSep
d640: 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20  2 = ",\n  ";.   
d650: 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20   zEnd = "\n)";. 
d660: 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36   }.  n += 35 + 6
d670: 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d  *p->nCol;.  zStm
d680: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
d690: 6c 6f 63 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20  locRaw(0, n);.  
d6a0: 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a  if( zStmt==0 ){.
d6b0: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
d6c0: 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 72 65 74  ult(db);.    ret
d6d0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
d6e0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c  ite3_snprintf(n,
d6f0: 20 7a 53 74 6d 74 2c 20 22 43 52 45 41 54 45 20   zStmt, "CREATE 
d700: 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20  TABLE ");.  k = 
d710: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
d720: 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50  zStmt);.  identP
d730: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d  ut(zStmt, &k, p-
d740: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74  >zName);.  zStmt
d750: 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66  [k++] = '(';.  f
d760: 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c  or(pCol=p->aCol,
d770: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
d780: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
d790: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
d7a0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54  char * const azT
d7b0: 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ype[] = {.      
d7c0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    /* SQLITE_AFF_
d7d0: 42 4c 4f 42 20 20 20 20 2a 2f 20 22 22 2c 0a 20  BLOB    */ "",. 
d7e0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
d7f0: 5f 41 46 46 5f 54 45 58 54 20 20 20 20 2a 2f 20  _AFF_TEXT    */ 
d800: 22 20 54 45 58 54 22 2c 0a 20 20 20 20 20 20 20  " TEXT",.       
d810: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   /* SQLITE_AFF_N
d820: 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22  UMERIC */ " NUM"
d830: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
d840: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
d850: 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20 20 20 20  */ " INT",.     
d860: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
d870: 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22 20 52 45  _REAL    */ " RE
d880: 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69  AL".    };.    i
d890: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73  nt len;.    cons
d8a0: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a  t char *zType;..
d8b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
d8c0: 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74  intf(n-k, &zStmt
d8d0: 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20  [k], zSep);.    
d8e0: 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  k += sqlite3Strl
d8f0: 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b  en30(&zStmt[k]);
d900: 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70  .    zSep = zSep
d910: 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28  2;.    identPut(
d920: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d  zStmt, &k, pCol-
d930: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61 73 73  >zName);.    ass
d940: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
d950: 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ity-SQLITE_AFF_B
d960: 4c 4f 42 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20  LOB >= 0 );.    
d970: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66  assert( pCol->af
d980: 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46  finity-SQLITE_AF
d990: 46 5f 42 4c 4f 42 20 3c 20 41 72 72 61 79 53 69  F_BLOB < ArraySi
d9a0: 7a 65 28 61 7a 54 79 70 65 29 20 29 3b 0a 20 20  ze(azType) );.  
d9b0: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
d9c0: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
d9d0: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20  TE_AFF_BLOB );. 
d9e0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
d9f0: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
da00: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a  ITE_AFF_TEXT );.
da10: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
da20: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
da30: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
da40: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
da50: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
da60: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
da70: 45 47 45 52 20 29 3b 0a 20 20 20 20 74 65 73 74  EGER );.    test
da80: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
da90: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
daa0: 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20  _REAL );.    .  
dab0: 20 20 7a 54 79 70 65 20 3d 20 61 7a 54 79 70 65    zType = azType
dac0: 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20  [pCol->affinity 
dad0: 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  - SQLITE_AFF_BLO
dae0: 42 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71  B];.    len = sq
daf0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
db00: 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ype);.    assert
db10: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
db20: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  ==SQLITE_AFF_BLO
db30: 42 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  B .            |
db40: 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  | pCol->affinity
db50: 3d 3d 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  ==sqlite3Affinit
db60: 79 54 79 70 65 28 7a 54 79 70 65 2c 20 30 29 20  yType(zType, 0) 
db70: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
db80: 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20  Stmt[k], zType, 
db90: 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c  len);.    k += l
dba0: 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  en;.    assert( 
dbb0: 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71  k<=n );.  }.  sq
dbc0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
dbd0: 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22  -k, &zStmt[k], "
dbe0: 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65  %s", zEnd);.  re
dbf0: 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f  turn zStmt;.}../
dc00: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61 6e 20 49  *.** Resize an I
dc10: 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 68  ndex object to h
dc20: 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f  old N columns to
dc30: 74 61 6c 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  tal.  Return SQL
dc40: 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
dc50: 63 65 73 73 20 61 6e 64 20 53 51 4c 49 54 45 5f  cess and SQLITE_
dc60: 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20  NOMEM on an OOM 
dc70: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
dc80: 20 69 6e 74 20 72 65 73 69 7a 65 49 6e 64 65 78   int resizeIndex
dc90: 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Object(sqlite3 *
dca0: 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  db, Index *pIdx,
dcb0: 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68 61 72 20   int N){.  char 
dcc0: 2a 7a 45 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e  *zExtra;.  int n
dcd0: 42 79 74 65 3b 0a 20 20 69 66 28 20 70 49 64 78  Byte;.  if( pIdx
dce0: 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72  ->nColumn>=N ) r
dcf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
dd00: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d  .  assert( pIdx-
dd10: 3e 69 73 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b  >isResized==0 );
dd20: 0a 20 20 6e 42 79 74 65 20 3d 20 28 73 69 7a 65  .  nByte = (size
dd30: 6f 66 28 63 68 61 72 2a 29 20 2b 20 73 69 7a 65  of(char*) + size
dd40: 6f 66 28 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a  of(i16) + 1)*N;.
dd50: 20 20 7a 45 78 74 72 61 20 3d 20 73 71 6c 69 74    zExtra = sqlit
dd60: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
dd70: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  b, nByte);.  if(
dd80: 20 7a 45 78 74 72 61 3d 3d 30 20 29 20 72 65 74   zExtra==0 ) ret
dd90: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
dda0: 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28  _BKPT;.  memcpy(
ddb0: 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a  zExtra, pIdx->az
ddc0: 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61  Coll, sizeof(cha
ddd0: 72 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  r*)*pIdx->nColum
dde0: 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f  n);.  pIdx->azCo
ddf0: 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ll = (const char
de00: 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78  **)zExtra;.  zEx
de10: 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68  tra += sizeof(ch
de20: 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79  ar*)*N;.  memcpy
de30: 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61  (zExtra, pIdx->a
de40: 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28  iColumn, sizeof(
de50: 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75  i16)*pIdx->nColu
de60: 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43  mn);.  pIdx->aiC
de70: 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45  olumn = (i16*)zE
de80: 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b  xtra;.  zExtra +
de90: 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b  = sizeof(i16)*N;
dea0: 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61  .  memcpy(zExtra
deb0: 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  , pIdx->aSortOrd
dec0: 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  er, pIdx->nColum
ded0: 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72  n);.  pIdx->aSor
dee0: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 7a 45  tOrder = (u8*)zE
def0: 78 74 72 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43  xtra;.  pIdx->nC
df00: 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64  olumn = N;.  pId
df10: 78 2d 3e 69 73 52 65 73 69 7a 65 64 20 3d 20 31  x->isResized = 1
df20: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
df30: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  E_OK;.}../*.** E
df40: 73 74 69 6d 61 74 65 20 74 68 65 20 74 6f 74 61  stimate the tota
df50: 6c 20 72 6f 77 20 77 69 64 74 68 20 66 6f 72 20  l row width for 
df60: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  a table..*/.stat
df70: 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65  ic void estimate
df80: 54 61 62 6c 65 57 69 64 74 68 28 54 61 62 6c 65  TableWidth(Table
df90: 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e 73 69 67   *pTab){.  unsig
dfa0: 6e 65 64 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a  ned wTable = 0;.
dfb0: 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a    const Column *
dfc0: 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69  pTabCol;.  int i
dfd0: 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e  ;.  for(i=pTab->
dfe0: 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54  nCol, pTabCol=pT
dff0: 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69  ab->aCol; i>0; i
e000: 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a  --, pTabCol++){.
e010: 20 20 20 20 77 54 61 62 6c 65 20 2b 3d 20 70 54      wTable += pT
e020: 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20  abCol->szEst;.  
e030: 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50  }.  if( pTab->iP
e040: 4b 65 79 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b  Key<0 ) wTable++
e050: 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52  ;.  pTab->szTabR
e060: 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
e070: 73 74 28 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a  st(wTable*4);.}.
e080: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
e090: 74 68 65 20 61 76 65 72 61 67 65 20 73 69 7a 65  the average size
e0a0: 20 6f 66 20 61 20 72 6f 77 20 66 6f 72 20 61 6e   of a row for an
e0b0: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
e0c0: 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65 49  c void estimateI
e0d0: 6e 64 65 78 57 69 64 74 68 28 49 6e 64 65 78 20  ndexWidth(Index 
e0e0: 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e  *pIdx){.  unsign
e0f0: 65 64 20 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ed wIndex = 0;. 
e100: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
e110: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70  Column *aCol = p
e120: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
e130: 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  l;.  for(i=0; i<
e140: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
e150: 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20 78 20 3d  ++){.    i16 x =
e160: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
e170: 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
e180: 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  x<pIdx->pTable->
e190: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64  nCol );.    wInd
e1a0: 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20  ex += x<0 ? 1 : 
e1b0: 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c  aCol[pIdx->aiCol
e1c0: 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20  umn[i]].szEst;. 
e1d0: 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a 49 64 78   }.  pIdx->szIdx
e1e0: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
e1f0: 45 73 74 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d  Est(wIndex*4);.}
e200: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65  ../* Return true
e210: 20 69 66 20 76 61 6c 75 65 20 78 20 69 73 20 66   if value x is f
e220: 6f 75 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 20  ound any of the 
e230: 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69  first nCol entri
e240: 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f  es of aiCol[].*/
e250: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 43  .static int hasC
e260: 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20  olumn(const i16 
e270: 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c  *aiCol, int nCol
e280: 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c  , int x){.  whil
e290: 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 20  e( nCol-- > 0 ) 
e2a0: 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b  if( x==*(aiCol++
e2b0: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
e2c0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20  return 0;.}../* 
e2d0: 52 65 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  Recompute the co
e2e0: 6c 4e 6f 74 49 64 78 65 64 20 66 69 65 6c 64 20  lNotIdxed field 
e2f0: 6f 66 20 74 68 65 20 49 6e 64 65 78 2e 0a 2a 2a  of the Index..**
e300: 0a 2a 2a 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20  .** colNotIdxed 
e310: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61  is a bitmask tha
e320: 74 20 68 61 73 20 61 20 30 20 62 69 74 20 72 65  t has a 0 bit re
e330: 70 72 65 73 65 6e 74 69 6e 67 20 65 61 63 68 20  presenting each 
e340: 69 6e 64 65 78 65 64 0a 2a 2a 20 63 6f 6c 75 6d  indexed.** colum
e350: 6e 73 20 74 68 61 74 20 61 72 65 20 77 69 74 68  ns that are with
e360: 69 6e 20 74 68 65 20 66 69 72 73 74 20 36 33 20  in the first 63 
e370: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74  columns of the t
e380: 61 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 68 69  able.  The.** hi
e390: 67 68 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20  gh-order bit of 
e3a0: 63 6f 6c 4e 6f 74 49 64 78 65 64 20 69 73 20 61  colNotIdxed is a
e3b0: 6c 77 61 79 73 20 31 2e 20 20 41 6c 6c 20 75 6e  lways 1.  All un
e3c0: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 0a  indexed columns.
e3d0: 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
e3e0: 68 61 76 65 20 61 20 31 2e 0a 2a 2a 0a 2a 2a 20  have a 1..**.** 
e3f0: 54 68 65 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20  The colNotIdxed 
e400: 6d 61 73 6b 20 69 73 20 41 4e 44 2d 65 64 20 77  mask is AND-ed w
e410: 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2e  ith the SrcList.
e420: 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 6d 61 73 6b  a[].colUsed mask
e430: 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
e440: 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   if the index is
e450: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
e460: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e470: 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73  recomputeColumns
e480: 4e 6f 74 49 6e 64 65 78 65 64 28 49 6e 64 65 78  NotIndexed(Index
e490: 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61   *pIdx){.  Bitma
e4a0: 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20  sk m = 0;.  int 
e4b0: 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d  j;.  for(j=pIdx-
e4c0: 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30  >nColumn-1; j>=0
e4d0: 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; j--){.    int 
e4e0: 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  x = pIdx->aiColu
e4f0: 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78  mn[j];.    if( x
e500: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  >=0 ){.      tes
e510: 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20  tcase( x==BMS-1 
e520: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
e530: 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20  e( x==BMS-2 );. 
e540: 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31       if( x<BMS-1
e550: 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28   ) m |= MASKBIT(
e560: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  x);.    }.  }.  
e570: 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65  pIdx->colNotIdxe
e580: 64 20 3d 20 7e 6d 3b 0a 20 20 61 73 73 65 72 74  d = ~m;.  assert
e590: 28 20 28 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49  ( (pIdx->colNotI
e5a0: 64 78 65 64 3e 3e 36 33 29 3d 3d 31 20 29 3b 0a  dxed>>63)==1 );.
e5b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
e5c0: 75 74 69 6e 65 20 72 75 6e 73 20 61 74 20 74 68  utine runs at th
e5d0: 65 20 65 6e 64 20 6f 66 20 70 61 72 73 69 6e 67  e end of parsing
e5e0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
e5f0: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a  statement that.*
e600: 2a 20 68 61 73 20 61 20 57 49 54 48 4f 55 54 20  * has a WITHOUT 
e610: 52 4f 57 49 44 20 63 6c 61 75 73 65 2e 20 20 54  ROWID clause.  T
e620: 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72  he job of this r
e630: 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e  outine is to con
e640: 76 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74  vert both.** int
e650: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 61 74  ernal schema dat
e660: 61 20 73 74 72 75 63 74 75 72 65 73 20 61 6e 64  a structures and
e670: 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 56   the generated V
e680: 44 42 45 20 63 6f 64 65 20 73 6f 20 74 68 61 74  DBE code so that
e690: 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 61 70 70   they.** are app
e6a0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 61 20 57  ropriate for a W
e6b0: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
e6c0: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  le instead of a 
e6d0: 72 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20  rowid table..** 
e6e0: 43 68 61 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a  Changes include:
e6f0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20  .**.**     (1)  
e700: 53 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  Set all columns 
e710: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
e720: 45 59 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  EY schema object
e730: 20 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e   to be NOT NULL.
e740: 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 43 6f 6e  .**     (2)  Con
e750: 76 65 72 74 20 50 33 20 70 61 72 61 6d 65 74 65  vert P3 paramete
e760: 72 20 6f 66 20 74 68 65 20 4f 50 5f 43 72 65 61  r of the OP_Crea
e770: 74 65 42 74 72 65 65 20 66 72 6f 6d 20 42 54 52  teBtree from BTR
e780: 45 45 5f 49 4e 54 4b 45 59 20 0a 2a 2a 20 20 20  EE_INTKEY .**   
e790: 20 20 20 20 20 20 20 69 6e 74 6f 20 42 54 52 45         into BTRE
e7a0: 45 5f 42 4c 4f 42 4b 45 59 2e 0a 2a 2a 20 20 20  E_BLOBKEY..**   
e7b0: 20 20 28 33 29 20 20 42 79 70 61 73 73 20 74 68    (3)  Bypass th
e7c0: 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68  e creation of th
e7d0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
e7e0: 74 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20  table entry.**  
e7f0: 20 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20          for the 
e800: 50 52 49 4d 41 52 59 20 4b 45 59 20 61 73 20 74  PRIMARY KEY as t
e810: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  he primary key i
e820: 6e 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20  ndex is now.**  
e830: 20 20 20 20 20 20 20 20 69 64 65 6e 74 69 66 69          identifi
e840: 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ed by the sqlite
e850: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e  _master table en
e860: 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
e870: 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20   itself..**     
e880: 28 34 29 20 20 53 65 74 20 74 68 65 20 49 6e 64  (4)  Set the Ind
e890: 65 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65 20 50  ex.tnum of the P
e8a0: 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78  RIMARY KEY Index
e8b0: 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a   object in the.*
e8c0: 2a 20 20 20 20 20 20 20 20 20 20 73 63 68 65 6d  *          schem
e8d0: 61 20 74 6f 20 74 68 65 20 72 6f 6f 74 70 61 67  a to the rootpag
e8e0: 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  e from the main 
e8f0: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 35  table..**     (5
e900: 29 20 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65  )  Add all table
e910: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
e920: 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65  PRIMARY KEY Inde
e930: 78 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20 20  x object.**     
e940: 20 20 20 20 20 73 6f 20 74 68 61 74 20 74 68 65       so that the
e950: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20   PRIMARY KEY is 
e960: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
e970: 2e 20 20 54 68 65 20 73 75 72 70 6c 75 73 0a 2a  .  The surplus.*
e980: 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  *          colum
e990: 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66 20 4b  ns are part of K
e9a0: 65 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64  eyInfo.nAllField
e9b0: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 75 73 65   and are not use
e9c0: 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  d for.**        
e9d0: 20 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f    sorting or loo
e9e0: 6b 75 70 20 6f 72 20 75 6e 69 71 75 65 6e 65 73  kup or uniquenes
e9f0: 73 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20  s checks..**    
ea00: 20 28 36 29 20 20 52 65 70 6c 61 63 65 20 74 68   (6)  Replace th
ea10: 65 20 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20  e rowid tail on 
ea20: 61 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  all automaticall
ea30: 79 20 67 65 6e 65 72 61 74 65 64 20 55 4e 49 51  y generated UNIQ
ea40: 55 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  UE.**          i
ea50: 6e 64 69 63 65 73 20 77 69 74 68 20 74 68 65 20  ndices with the 
ea60: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
ea70: 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 76  mns..**.** For v
ea80: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 6f  irtual tables, o
ea90: 6e 6c 79 20 28 31 29 20 69 73 20 70 65 72 66 6f  nly (1) is perfo
eaa0: 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rmed..*/.static 
eab0: 76 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f 57 69  void convertToWi
eac0: 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28  thoutRowidTable(
ead0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
eae0: 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49  able *pTab){.  I
eaf0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e  ndex *pIdx;.  In
eb00: 64 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20  dex *pPk;.  int 
eb10: 6e 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  nPk;.  int i, j;
eb20: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
eb30: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
eb40: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
eb50: 3e 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 4d 61  >pVdbe;..  /* Ma
eb60: 72 6b 20 65 76 65 72 79 20 50 52 49 4d 41 52 59  rk every PRIMARY
eb70: 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 61 73 20 4e   KEY column as N
eb80: 4f 54 20 4e 55 4c 4c 20 28 65 78 63 65 70 74 20  OT NULL (except 
eb90: 66 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61 62  for imposter tab
eba0: 6c 65 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les).  */.  if( 
ebb0: 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74  !db->init.impost
ebc0: 65 72 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66  erTable ){.    f
ebd0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
ebe0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
ebf0: 20 20 69 66 28 20 28 70 54 61 62 2d 3e 61 43 6f    if( (pTab->aCo
ec00: 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20  l[i].colFlags & 
ec10: 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29  COLFLAG_PRIMKEY)
ec20: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
ec30: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74  Tab->aCol[i].not
ec40: 4e 75 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  Null = OE_Abort;
ec50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ec60: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74   }..  /* Convert
ec70: 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   the P3 operand 
ec80: 6f 66 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65  of the OP_Create
ec90: 42 74 72 65 65 20 6f 70 63 6f 64 65 20 66 72 6f  Btree opcode fro
eca0: 6d 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 0a 20  m BTREE_INTKEY. 
ecb0: 20 2a 2a 20 69 6e 74 6f 20 42 54 52 45 45 5f 42   ** into BTREE_B
ecc0: 4c 4f 42 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 69  LOBKEY..  */.  i
ecd0: 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43  f( pParse->addrC
ece0: 72 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  rTab ){.    asse
ecf0: 72 74 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c  rt( v );.    sql
ed00: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
ed10: 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72  (v, pParse->addr
ed20: 43 72 54 61 62 2c 20 42 54 52 45 45 5f 42 4c 4f  CrTab, BTREE_BLO
ed30: 42 4b 45 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  BKEY);.  }..  /*
ed40: 20 4c 6f 63 61 74 65 20 74 68 65 20 50 52 49 4d   Locate the PRIM
ed50: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 20  ARY KEY index.  
ed60: 4f 72 2c 20 69 66 20 74 68 69 73 20 74 61 62 6c  Or, if this tabl
ed70: 65 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79  e was originally
ed80: 0a 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47 45 52  .  ** an INTEGER
ed90: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74 61 62   PRIMARY KEY tab
eda0: 6c 65 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  le, create a new
edb0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
edc0: 65 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ex. .  */.  if( 
edd0: 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29  pTab->iPKey>=0 )
ede0: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
edf0: 70 4c 69 73 74 3b 0a 20 20 20 20 54 6f 6b 65 6e  pList;.    Token
ee00: 20 69 70 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20 73   ipkToken;.    s
ee10: 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28  qlite3TokenInit(
ee20: 26 69 70 6b 54 6f 6b 65 6e 2c 20 70 54 61 62 2d  &ipkToken, pTab-
ee30: 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65  >aCol[pTab->iPKe
ee40: 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  y].zName);.    p
ee50: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
ee60: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
ee70: 72 73 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  rse, 0, .       
ee80: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ee90: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
eea0: 54 4b 5f 49 44 2c 20 26 69 70 6b 54 6f 6b 65 6e  TK_ID, &ipkToken
eeb0: 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70  , 0));.    if( p
eec0: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
eed0: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30  ;.    pList->a[0
eee0: 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 50  ].sortOrder = pP
eef0: 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64  arse->iPkSortOrd
ef00: 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  er;.    assert( 
ef10: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
ef20: 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 73  e==pTab );.    s
ef30: 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
ef40: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  x(pParse, 0, 0, 
ef50: 30 2c 20 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e  0, pList, pTab->
ef60: 6b 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30  keyConf, 0, 0, 0
ef70: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
ef90: 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41  TE_IDXTYPE_PRIMA
efa0: 52 59 4b 45 59 29 3b 0a 20 20 20 20 69 66 28 20  RYKEY);.    if( 
efb0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
efc0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
efd0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
efe0: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
eff0: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
f000: 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  );.    pTab->iPK
f010: 65 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  ey = -1;.  }else
f020: 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69  {.    pPk = sqli
f030: 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
f040: 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 61 73  ex(pTab);.    as
f050: 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a  sert( pPk!=0 );.
f060: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52  .    /*.    ** R
f070: 65 6d 6f 76 65 20 61 6c 6c 20 72 65 64 75 6e 64  emove all redund
f080: 61 6e 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  ant columns from
f090: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
f0a0: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
f0b0: 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 22 50  change.    ** "P
f0c0: 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 61  RIMARY KEY(a,b,a
f0d0: 2c 62 2c 63 2c 62 2c 63 2c 64 29 22 20 69 6e 74  ,b,c,b,c,d)" int
f0e0: 6f 20 6a 75 73 74 20 22 50 52 49 4d 41 52 59 20  o just "PRIMARY 
f0f0: 4b 45 59 28 61 2c 62 2c 63 2c 64 29 22 2e 20 20  KEY(a,b,c,d)".  
f100: 4c 61 74 65 72 0a 20 20 20 20 2a 2a 20 63 6f 64  Later.    ** cod
f110: 65 20 61 73 73 75 6d 65 73 20 74 68 65 20 50 52  e assumes the PR
f120: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 74 61 69  IMARY KEY contai
f130: 6e 73 20 6e 6f 20 72 65 70 65 61 74 65 64 20 63  ns no repeated c
f140: 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20  olumns..    */. 
f150: 20 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c     for(i=j=1; i<
f160: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b  pPk->nKeyCol; i+
f170: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61  +){.      if( ha
f180: 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43  sColumn(pPk->aiC
f190: 6f 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61  olumn, j, pPk->a
f1a0: 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20  iColumn[i]) ){. 
f1b0: 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c         pPk->nCol
f1c0: 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c  umn--;.      }el
f1d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d  se{.        pPk-
f1e0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d  >aiColumn[j++] =
f1f0: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
f200: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
f210: 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  .    pPk->nKeyCo
f220: 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20 61 73 73  l = j;.  }.  ass
f230: 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20  ert( pPk!=0 );. 
f240: 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72 69 6e 67   pPk->isCovering
f250: 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 64 62 2d   = 1;.  if( !db-
f260: 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61  >init.imposterTa
f270: 62 6c 65 20 29 20 70 50 6b 2d 3e 75 6e 69 71 4e  ble ) pPk->uniqN
f280: 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 6e 50  otNull = 1;.  nP
f290: 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  k = pPk->nKeyCol
f2a0: 3b 0a 0a 20 20 2f 2a 20 42 79 70 61 73 73 20 74  ;..  /* Bypass t
f2b0: 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74  he creation of t
f2c0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 62  he PRIMARY KEY b
f2d0: 74 72 65 65 20 61 6e 64 20 74 68 65 20 73 71 6c  tree and the sql
f2e0: 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20  ite_master.  ** 
f2f0: 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 54 68 69  table entry. Thi
f300: 73 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72  s is only requir
f310: 65 64 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20  ed if currently 
f320: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 0a  generating VDBE.
f330: 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72 20 61 20    ** code for a 
f340: 43 52 45 41 54 45 20 54 41 42 4c 45 20 28 6e 6f  CREATE TABLE (no
f350: 74 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 6f  t when parsing o
f360: 6e 65 20 61 73 20 70 61 72 74 20 6f 66 20 72 65  ne as part of re
f370: 61 64 69 6e 67 0a 20 20 2a 2a 20 61 20 64 61 74  ading.  ** a dat
f380: 61 62 61 73 65 20 73 63 68 65 6d 61 29 2e 20 20  abase schema).  
f390: 2a 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70 50  */.  if( v && pP
f3a0: 6b 2d 3e 74 6e 75 6d 3e 30 20 29 7b 0a 20 20 20  k->tnum>0 ){.   
f3b0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69   assert( db->ini
f3c0: 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20  t.busy==0 );.   
f3d0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
f3e0: 67 65 4f 70 63 6f 64 65 28 76 2c 20 70 50 6b 2d  geOpcode(v, pPk-
f3f0: 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74 6f 29 3b  >tnum, OP_Goto);
f400: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
f410: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
f420: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 74  PRIMARY KEY is t
f430: 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61  he table root pa
f440: 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75  ge */.  pPk->tnu
f450: 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a  m = pTab->tnum;.
f460: 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
f470: 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
f480: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  sentation of all
f490: 20 55 4e 49 51 55 45 20 69 6e 64 69 63 65 73 20   UNIQUE indices 
f4a0: 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20  by converting.  
f4b0: 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  ** the final row
f4c0: 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f  id column into o
f4d0: 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d  ne or more colum
f4e0: 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  ns of the PRIMAR
f4f0: 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f  Y KEY..  */.  fo
f500: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
f510: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
f520: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
f530: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28    int n;.    if(
f540: 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64   IsPrimaryKeyInd
f550: 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69  ex(pIdx) ) conti
f560: 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e  nue;.    for(i=n
f570: 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b  =0; i<nPk; i++){
f580: 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43  .      if( !hasC
f590: 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f  olumn(pIdx->aiCo
f5a0: 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  lumn, pIdx->nKey
f5b0: 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  Col, pPk->aiColu
f5c0: 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20  mn[i]) ) n++;.  
f5d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30    }.    if( n==0
f5e0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
f5f0: 73 20 69 6e 64 65 78 20 69 73 20 61 20 73 75 70  s index is a sup
f600: 65 72 73 65 74 20 6f 66 20 74 68 65 20 70 72 69  erset of the pri
f610: 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20  mary key */.    
f620: 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20    pIdx->nColumn 
f630: 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  = pIdx->nKeyCol;
f640: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
f650: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
f660: 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74  esizeIndexObject
f670: 28 64 62 2c 20 70 49 64 78 2c 20 70 49 64 78 2d  (db, pIdx, pIdx-
f680: 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65  >nKeyCol+n) ) re
f690: 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  turn;.    for(i=
f6a0: 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  0, j=pIdx->nKeyC
f6b0: 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b  ol; i<nPk; i++){
f6c0: 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43  .      if( !hasC
f6d0: 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f  olumn(pIdx->aiCo
f6e0: 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  lumn, pIdx->nKey
f6f0: 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  Col, pPk->aiColu
f700: 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  mn[i]) ){.      
f710: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
f720: 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c  [j] = pPk->aiCol
f730: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  umn[i];.        
f740: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20  pIdx->azColl[j] 
f750: 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  = pPk->azColl[i]
f760: 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  ;.        j++;. 
f770: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
f780: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
f790: 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b  Column>=pIdx->nK
f7a0: 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61  eyCol+n );.    a
f7b0: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
f7c0: 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a  lumn>=j );.  }..
f7d0: 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61 62    /* Add all tab
f7e0: 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  le columns to th
f7f0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
f800: 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  dex.  */.  if( n
f810: 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  Pk<pTab->nCol ){
f820: 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49  .    if( resizeI
f830: 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70  ndexObject(db, p
f840: 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Pk, pTab->nCol) 
f850: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f  ) return;.    fo
f860: 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c  r(i=0, j=nPk; i<
f870: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
f880: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73  {.      if( !has
f890: 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f  Column(pPk->aiCo
f8a0: 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20  lumn, j, i) ){. 
f8b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
f8c0: 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  <pPk->nColumn );
f8d0: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69  .        pPk->ai
f8e0: 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20  Column[j] = i;. 
f8f0: 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f         pPk->azCo
f900: 6c 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53  ll[j] = sqlite3S
f910: 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20  trBINARY;.      
f920: 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    j++;.      }. 
f930: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
f940: 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a   pPk->nColumn==j
f950: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f960: 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b  pTab->nCol==j );
f970: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
f980: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61  k->nColumn = pTa
f990: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72  b->nCol;.  }.  r
f9a0: 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e  ecomputeColumnsN
f9b0: 6f 74 49 6e 64 65 78 65 64 28 70 50 6b 29 3b 0a  otIndexed(pPk);.
f9c0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
f9d0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
f9e0: 42 4c 45 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BLE./*.** Return
f9f0: 20 74 72 75 65 20 69 66 20 7a 4e 61 6d 65 20 69   true if zName i
fa00: 73 20 61 20 73 68 61 64 6f 77 20 74 61 62 6c 65  s a shadow table
fa10: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 63 75 72   name in the cur
fa20: 72 65 6e 74 20 64 61 74 61 62 61 73 65 0a 2a 2a  rent database.**
fa30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
fa40: 2a 2a 20 7a 4e 61 6d 65 20 69 73 20 74 65 6d 70  ** zName is temp
fa50: 6f 72 61 72 69 6c 79 20 6d 6f 64 69 66 69 65 64  orarily modified
fa60: 20 77 68 69 6c 65 20 74 68 69 73 20 72 6f 75 74   while this rout
fa70: 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e 67 2c 20  ine is running, 
fa80: 62 75 74 20 69 73 0a 2a 2a 20 72 65 73 74 6f 72  but is.** restor
fa90: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
faa0: 61 6c 20 76 61 6c 75 65 20 70 72 69 6f 72 20 74  al value prior t
fab0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  o this routine r
fac0: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
fad0: 74 69 63 20 69 6e 74 20 69 73 53 68 61 64 6f 77  tic int isShadow
fae0: 54 61 62 6c 65 4e 61 6d 65 28 73 71 6c 69 74 65  TableName(sqlite
faf0: 33 20 2a 64 62 2c 20 63 68 61 72 20 2a 7a 4e 61  3 *db, char *zNa
fb00: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 61  me){.  char *zTa
fb10: 69 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  il;             
fb20: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
fb30: 74 6f 20 74 68 65 20 6c 61 73 74 20 22 5f 22 20  to the last "_" 
fb40: 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 54 61  in zName */.  Ta
fb50: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
fb70: 61 62 6c 65 20 74 68 61 74 20 7a 4e 61 6d 65 20  able that zName 
fb80: 69 73 20 61 20 73 68 61 64 6f 77 20 6f 66 20 2a  is a shadow of *
fb90: 2f 0a 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64  /.  Module *pMod
fba0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fbb0: 20 20 2f 2a 20 4d 6f 64 75 6c 65 20 66 6f 72 20    /* Module for 
fbc0: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
fbd0: 65 20 2a 2f 0a 0a 20 20 7a 54 61 69 6c 20 3d 20  e */..  zTail = 
fbe0: 73 74 72 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27  strrchr(zName, '
fbf0: 5f 27 29 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c  _');.  if( zTail
fc00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
fc10: 20 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20    *zTail = 0;.  
fc20: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
fc30: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
fc40: 65 2c 20 30 29 3b 0a 20 20 2a 7a 54 61 69 6c 20  e, 0);.  *zTail 
fc50: 3d 20 27 5f 27 3b 0a 20 20 69 66 28 20 70 54 61  = '_';.  if( pTa
fc60: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  b==0 ) return 0;
fc70: 0a 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61  .  if( !IsVirtua
fc80: 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
fc90: 20 30 3b 0a 20 20 70 4d 6f 64 20 3d 20 28 4d 6f   0;.  pMod = (Mo
fca0: 64 75 6c 65 2a 29 73 71 6c 69 74 65 33 48 61 73  dule*)sqlite3Has
fcb0: 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75  hFind(&db->aModu
fcc0: 6c 65 2c 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75  le, pTab->azModu
fcd0: 6c 65 41 72 67 5b 30 5d 29 3b 0a 20 20 69 66 28  leArg[0]);.  if(
fce0: 20 70 4d 6f 64 3d 3d 30 20 29 20 72 65 74 75 72   pMod==0 ) retur
fcf0: 6e 20 30 3b 0a 20 20 69 66 28 20 70 4d 6f 64 2d  n 0;.  if( pMod-
fd00: 3e 70 4d 6f 64 75 6c 65 2d 3e 69 56 65 72 73 69  >pModule->iVersi
fd10: 6f 6e 3c 33 20 29 20 72 65 74 75 72 6e 20 30 3b  on<3 ) return 0;
fd20: 0a 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70 4d 6f  .  if( pMod->pMo
fd30: 64 75 6c 65 2d 3e 78 53 68 61 64 6f 77 4e 61 6d  dule->xShadowNam
fd40: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
fd50: 0a 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e  .  return pMod->
fd60: 70 4d 6f 64 75 6c 65 2d 3e 78 53 68 61 64 6f 77  pModule->xShadow
fd70: 4e 61 6d 65 28 7a 54 61 69 6c 2b 31 29 3b 0a 7d  Name(zTail+1);.}
fd80: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
fd90: 69 73 53 68 61 64 6f 77 54 61 62 6c 65 4e 61 6d  isShadowTableNam
fda0: 65 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 20  e(x,y) 0.#endif 
fdb0: 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /* ifndef SQLITE
fdc0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
fdd0: 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  LE */../*.** Thi
fde0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
fdf0: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
fe00: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
fe10: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
fe20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
fe30: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
fe40: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
fe50: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
fe60: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
fe70: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
fe80: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
fe90: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
fea0: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
feb0: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
fec0: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
fed0: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
fee0: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
fef0: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
ff00: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
ff10: 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20   unless.** this 
ff20: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
ff30: 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74  able or db->init
ff40: 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20  .busy==1.  When 
ff50: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
ff60: 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20  .** it means we 
ff70: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
ff80: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
ff90: 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a  ble because we j
ffa0: 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  ust.** connected
ffb0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
ffc0: 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
ffd0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
ffe0: 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e  ble has.** recen
fff0: 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20  tly changed, so 
10000 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
10010 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  is table already
10020 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68   exists in.** th
10030 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
10040 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f  table.  We do no
10050 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65  t want to create
10060 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a   it again..**.**
10070 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20   If the pSelect 
10080 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
10090 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
100a0 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
100b0 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74  .** was called t
100c0 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65  o create a table
100d0 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
100e0 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41  a .** "CREATE TA
100f0 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  BLE ... AS SELEC
10100 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74  T ..." statement
10110 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  .  The column na
10120 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  mes of.** the ne
10130 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74  w table will mat
10140 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ch the result se
10150 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  t of the SELECT.
10160 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10170 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73  EndTable(.  Pars
10180 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
10190 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
101a0 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
101b0 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20  *pCons,         
101c0 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b    /* The ',' tok
101d0 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  en after the las
101e0 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a  t column defn. *
101f0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  /.  Token *pEnd,
10200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10210 68 65 20 27 29 27 20 62 65 66 6f 72 65 20 6f 70  he ')' before op
10220 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 43 52 45  tions in the CRE
10230 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75  ATE TABLE */.  u
10240 38 20 74 61 62 4f 70 74 73 2c 20 20 20 20 20 20  8 tabOpts,      
10250 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
10260 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55  table options. U
10270 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53  sually 0. */.  S
10280 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20  elect *pSelect  
10290 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
102a0 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20   from a "CREATE 
102b0 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a  ... AS SELECT" *
102c0 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102e0 20 2f 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c   /* The new tabl
102f0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
10300 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10310 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
10320 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
10330 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
10340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
10350 74 61 62 61 73 65 20 69 6e 20 77 68 69 63 68 20  tabase in which 
10360 74 68 65 20 74 61 62 6c 65 20 6c 69 76 65 73 20  the table lives 
10370 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
10380 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
10390 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64  * An implied ind
103a0 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ex of the table 
103b0 2a 2f 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d  */..  if( pEnd==
103c0 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 20  0 && pSelect==0 
103d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
103e0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 64 62   }.  assert( !db
103f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
10400 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
10410 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
10420 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
10430 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d  .  if( pSelect==
10440 30 20 26 26 20 69 73 53 68 61 64 6f 77 54 61 62  0 && isShadowTab
10450 6c 65 4e 61 6d 65 28 64 62 2c 20 70 2d 3e 7a 4e  leName(db, p->zN
10460 61 6d 65 29 20 29 7b 0a 20 20 20 20 70 2d 3e 74  ame) ){.    p->t
10470 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 53 68  abFlags |= TF_Sh
10480 61 64 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  adow;.  }..  /* 
10490 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  If the db->init.
104a0 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61  busy is 1 it mea
104b0 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
104c0 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68  g the SQL off th
104d0 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d  e.  ** "sqlite_m
104e0 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74  aster" or "sqlit
104f0 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74  e_temp_master" t
10500 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b  able on the disk
10510 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74  ..  ** So do not
10520 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69   write to the di
10530 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61  sk again.  Extra
10540 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ct the root page
10550 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72   number.  ** for
10560 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
10570 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  the db->init.new
10580 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68  Tnum field.  (Th
10590 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  e page number.  
105a0 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  ** should have b
105b0 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79  een put there by
105c0 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43   the sqliteOpenC
105d0 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2a  b routine.).  **
105e0 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f  .  ** If the roo
105f0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  t page number is
10600 20 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74   1, that means t
10610 68 69 73 20 69 73 20 74 68 65 20 73 71 6c 69 74  his is the sqlit
10620 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61  e_master.  ** ta
10630 62 6c 65 20 69 74 73 65 6c 66 2e 20 20 53 6f 20  ble itself.  So 
10640 6d 61 72 6b 20 69 74 20 72 65 61 64 2d 6f 6e 6c  mark it read-onl
10650 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  y..  */.  if( db
10660 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
10670 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
10680 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
10690 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
106a0 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "");.      retur
106b0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  n;.    }.    p->
106c0 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
106d0 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 69 66 28  newTnum;.    if(
106e0 20 70 2d 3e 74 6e 75 6d 3d 3d 31 20 29 20 70 2d   p->tnum==1 ) p-
106f0 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
10700 52 65 61 64 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20  Readonly;.  }.. 
10710 20 2f 2a 20 53 70 65 63 69 61 6c 20 70 72 6f 63   /* Special proc
10720 65 73 73 69 6e 67 20 66 6f 72 20 57 49 54 48 4f  essing for WITHO
10730 55 54 20 52 4f 57 49 44 20 54 61 62 6c 65 73 20  UT ROWID Tables 
10740 2a 2f 0a 20 20 69 66 28 20 74 61 62 4f 70 74 73  */.  if( tabOpts
10750 20 26 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77   & TF_WithoutRow
10760 69 64 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70  id ){.    if( (p
10770 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
10780 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 20 29  Autoincrement) )
10790 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
107a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
107b0 20 20 20 20 20 20 20 20 20 20 22 41 55 54 4f 49            "AUTOI
107c0 4e 43 52 45 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c  NCREMENT not all
107d0 6f 77 65 64 20 6f 6e 20 57 49 54 48 4f 55 54 20  owed on WITHOUT 
107e0 52 4f 57 49 44 20 74 61 62 6c 65 73 22 29 3b 0a  ROWID tables");.
107f0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
10800 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e    }.    if( (p->
10810 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61  tabFlags & TF_Ha
10820 73 50 72 69 6d 61 72 79 4b 65 79 29 3d 3d 30 20  sPrimaryKey)==0 
10830 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10840 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10850 20 22 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 69   "PRIMARY KEY mi
10860 73 73 69 6e 67 20 6f 6e 20 74 61 62 6c 65 20 25  ssing on table %
10870 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  s", p->zName);. 
10880 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10890 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  p->tabFlags |= T
108a0 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 7c  F_WithoutRowid |
108b0 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77   TF_NoVisibleRow
108c0 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e 76 65 72  id;.      conver
108d0 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54  tToWithoutRowidT
108e0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 29 3b  able(pParse, p);
108f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 44  .    }.  }..  iD
10900 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
10910 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e  aToIndex(db, p->
10920 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64  pSchema);..#ifnd
10930 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
10940 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76  HECK.  /* Resolv
10950 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43  e names in all C
10960 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
10970 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a  expressions..  *
10980 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63  /.  if( p->pChec
10990 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  k ){.    sqlite3
109a0 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72  ResolveSelfRefer
109b0 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 2c 20  ence(pParse, p, 
109c0 4e 43 5f 49 73 43 68 65 63 6b 2c 20 30 2c 20 70  NC_IsCheck, 0, p
109d0 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 23  ->pCheck);.  }.#
109e0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
109f0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  d(SQLITE_OMIT_CH
10a00 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73  ECK) */..  /* Es
10a10 74 69 6d 61 74 65 20 74 68 65 20 61 76 65 72 61  timate the avera
10a20 67 65 20 72 6f 77 20 73 69 7a 65 20 66 6f 72 20  ge row size for 
10a30 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 66 6f  the table and fo
10a40 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64 20 69 6e  r all implied in
10a50 64 69 63 65 73 20 2a 2f 0a 20 20 65 73 74 69 6d  dices */.  estim
10a60 61 74 65 54 61 62 6c 65 57 69 64 74 68 28 70 29  ateTableWidth(p)
10a70 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e  ;.  for(pIdx=p->
10a80 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
10a90 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
10aa0 0a 20 20 20 20 65 73 74 69 6d 61 74 65 49 6e 64  .    estimateInd
10ab0 65 78 57 69 64 74 68 28 70 49 64 78 29 3b 0a 20  exWidth(pIdx);. 
10ac0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20   }..  /* If not 
10ad0 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68  initializing, th
10ae0 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f  en create a reco
10af0 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  rd for the new t
10b00 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  able.  ** in the
10b10 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
10b20 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61  able of the data
10b30 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  base..  **.  ** 
10b40 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  If this is a TEM
10b50 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72  PORARY table, wr
10b60 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e  ite the entry in
10b70 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  to the auxiliary
10b80 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  .  ** file inste
10b90 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d  ad of into the m
10ba0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
10bb0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  e..  */.  if( !d
10bc0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
10bd0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
10be0 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
10bf0 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22   *zType;    /* "
10c00 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22  view" or "table"
10c10 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54   */.    char *zT
10c20 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57  ype2;   /* "VIEW
10c30 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a  " or "TABLE" */.
10c40 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
10c50 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74      /* Text of t
10c60 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
10c70 6f 72 20 43 52 45 41 54 45 20 56 49 45 57 20 73  or CREATE VIEW s
10c80 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20  tatement */..   
10c90 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
10ca0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
10cb0 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
10cc0 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20   ) return;..    
10cd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10ce0 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  1(v, OP_Close, 0
10cf0 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20  );..    /* .    
10d00 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54  ** Initialize zT
10d10 79 70 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ype for the new 
10d20 76 69 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20  view or table.. 
10d30 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
10d40 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
10d50 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61       /* A regula
10d60 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  r table */.     
10d70 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22   zType = "table"
10d80 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d  ;.      zType2 =
10d90 20 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65   "TABLE";.#ifnde
10da0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10db0 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  EW.    }else{.  
10dc0 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f      /* A view */
10dd0 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
10de0 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79  view";.      zTy
10df0 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65  pe2 = "VIEW";.#e
10e00 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
10e10 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
10e20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20  CREATE TABLE xx 
10e30 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65  AS SELECT ..., e
10e40 78 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43  xecute the SELEC
10e50 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65  T.    ** stateme
10e60 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  nt to populate t
10e70 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68  he new table. Th
10e80 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  e root-page numb
10e90 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  er for the.    *
10ea0 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69  * new table is i
10eb0 6e 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73  n register pPars
10ec0 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20  e->regRoot..    
10ed0 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74  **.    ** Once t
10ee0 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65  he SELECT has be
10ef0 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69  en coded by sqli
10f00 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20  te3Select(), it 
10f10 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73  is in a.    ** s
10f20 75 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f  uitable state to
10f30 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63   query for the c
10f40 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20  olumn names and 
10f50 74 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64  types to be used
10f60 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e  .    ** by the n
10f70 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  ew table..    **
10f80 0a 20 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64  .    ** A shared
10f90 2d 63 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63  -cache write-loc
10fa0 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  k is not require
10fb0 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  d to write to th
10fc0 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20  e new table,.   
10fd0 20 2a 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d   ** as a schema-
10fe0 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61  lock must have a
10ff0 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61  lready been obta
11000 69 6e 65 64 20 74 6f 20 63 72 65 61 74 65 20 69  ined to create i
11010 74 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20  t. Since.    ** 
11020 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78  a schema-lock ex
11030 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72  cludes all other
11040 20 64 61 74 61 62 61 73 65 20 75 73 65 72 73 2c   database users,
11050 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20   the write-lock 
11060 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20  would.    ** be 
11070 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a  redundant..    *
11080 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  /.    if( pSelec
11090 74 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63  t ){.      Selec
110a0 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 2f  tDest dest;    /
110b0 2a 20 57 68 65 72 65 20 74 68 65 20 53 45 4c 45  * Where the SELE
110c0 43 54 20 73 68 6f 75 6c 64 20 73 74 6f 72 65 20  CT should store 
110d0 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20  results */.     
110e0 20 69 6e 74 20 72 65 67 59 69 65 6c 64 3b 20 20   int regYield;  
110f0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
11100 20 68 6f 6c 64 69 6e 67 20 63 6f 2d 72 6f 75 74   holding co-rout
11110 69 6e 65 20 65 6e 74 72 79 2d 70 6f 69 6e 74 20  ine entry-point 
11120 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
11130 72 54 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  rTop;        /* 
11140 54 6f 70 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f  Top of the co-ro
11150 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69  utine */.      i
11160 6e 74 20 72 65 67 52 65 63 3b 20 20 20 20 20 20  nt regRec;      
11170 20 20 20 2f 2a 20 41 20 72 65 63 6f 72 64 20 74     /* A record t
11180 6f 20 62 65 20 69 6e 73 65 72 74 20 69 6e 74 6f  o be insert into
11190 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a   the new table *
111a0 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52  /.      int regR
111b0 6f 77 69 64 3b 20 20 20 20 20 20 20 2f 2a 20 52  owid;       /* R
111c0 6f 77 69 64 20 6f 66 20 74 68 65 20 6e 65 78 74  owid of the next
111d0 20 72 6f 77 20 74 6f 20 69 6e 73 65 72 74 20 2a   row to insert *
111e0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
111f0 49 6e 73 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54  InsLoop;    /* T
11200 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  op of the loop f
11210 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 72 6f 77  or inserting row
11220 73 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65  s */.      Table
11230 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 20 20 2f   *pSelTab;     /
11240 2a 20 41 20 74 61 62 6c 65 20 74 68 61 74 20 64  * A table that d
11250 65 73 63 72 69 62 65 73 20 74 68 65 20 53 45 4c  escribes the SEL
11260 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a  ECT results */..
11270 20 20 20 20 20 20 72 65 67 59 69 65 6c 64 20 3d        regYield =
11280 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
11290 0a 20 20 20 20 20 20 72 65 67 52 65 63 20 3d 20  .      regRec = 
112a0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
112b0 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d        regRowid =
112c0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
112d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
112e0 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a  arse->nTab==1);.
112f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79        sqlite3May
11300 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20  Abort(pParse);. 
11310 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11320 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
11330 6e 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72 73  nWrite, 1, pPars
11340 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62 29  e->regRoot, iDb)
11350 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11360 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
11370 50 46 4c 41 47 5f 50 32 49 53 52 45 47 29 3b 0a  PFLAG_P2ISREG);.
11380 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54        pParse->nT
11390 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 61 64  ab = 2;.      ad
113a0 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
113b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
113c0 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 1;.      sql
113d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
113e0 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
113f0 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c  ne, regYield, 0,
11400 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20   addrTop);.     
11410 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
11420 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  r ) return;.    
11430 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
11440 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
11450 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
11460 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28  lect);.      if(
11470 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65   pSelTab==0 ) re
11480 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 73 73 65  turn;.      asse
11490 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29  rt( p->aCol==0 )
114a0 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20  ;.      p->nCol 
114b0 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
114c0 0a 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d  .      p->aCol =
114d0 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
114e0 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e        pSelTab->n
114f0 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Col = 0;.      p
11500 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30  SelTab->aCol = 0
11510 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
11520 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
11530 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 73  SelTab);.      s
11540 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
11550 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
11560 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69  Coroutine, regYi
11570 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eld);.      sqli
11580 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
11590 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74  , pSelect, &dest
115a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
115b0 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
115c0 72 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  rn;.      sqlite
115d0 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e  3VdbeEndCoroutin
115e0 65 28 76 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a  e(v, regYield);.
115f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11600 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
11610 72 54 6f 70 20 2d 20 31 29 3b 0a 20 20 20 20 20  rTop - 1);.     
11620 20 61 64 64 72 49 6e 73 4c 6f 6f 70 20 3d 20 73   addrInsLoop = s
11630 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
11640 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 64 65  (v, OP_Yield, de
11650 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  st.iSDParm);.   
11660 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
11670 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
11680 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
11690 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 64 65  P_MakeRecord, de
116a0 73 74 2e 69 53 64 73 74 2c 20 64 65 73 74 2e 6e  st.iSdst, dest.n
116b0 53 64 73 74 2c 20 72 65 67 52 65 63 29 3b 0a 20  Sdst, regRec);. 
116c0 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
116d0 65 41 66 66 69 6e 69 74 79 28 76 2c 20 70 2c 20  eAffinity(v, p, 
116e0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
116f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11700 50 5f 4e 65 77 52 6f 77 69 64 2c 20 31 2c 20 72  P_NewRowid, 1, r
11710 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
11720 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11730 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
11740 31 2c 20 72 65 67 52 65 63 2c 20 72 65 67 52 6f  1, regRec, regRo
11750 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
11760 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
11770 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20  ddrInsLoop);.   
11780 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
11790 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e  mpHere(v, addrIn
117a0 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71  sLoop);.      sq
117b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
117c0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b  v, OP_Close, 1);
117d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
117e0 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c  ompute the compl
117f0 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
11800 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
11810 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c   */.    if( pSel
11820 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74  ect ){.      zSt
11830 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65  mt = createTable
11840 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20 20 20  Stmt(db, p);.   
11850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 6f   }else{.      To
11860 6b 65 6e 20 2a 70 45 6e 64 32 20 3d 20 74 61 62  ken *pEnd2 = tab
11870 4f 70 74 73 20 3f 20 26 70 50 61 72 73 65 2d 3e  Opts ? &pParse->
11880 73 4c 61 73 74 54 6f 6b 65 6e 20 3a 20 70 45 6e  sLastToken : pEn
11890 64 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28 69 6e  d;.      n = (in
118a0 74 29 28 70 45 6e 64 32 2d 3e 7a 20 2d 20 70 50  t)(pEnd2->z - pP
118b0 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
118c0 2e 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  .z);.      if( p
118d0 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20  End2->z[0]!=';' 
118e0 29 20 6e 20 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b  ) n += pEnd2->n;
118f0 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73  .      zStmt = s
11900 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
11910 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  , .          "CR
11920 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a  EATE %s %.*s", z
11930 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65  Type2, n, pParse
11940 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20  ->sNameToken.z. 
11950 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
11960 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72     /* A slot for
11970 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20   the record has 
11980 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
11990 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20  ocated in the . 
119a0 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53     ** SQLITE_MAS
119b0 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a  TER table.  We j
119c0 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61  ust need to upda
119d0 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74  te that slot wit
119e0 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65  h all.    ** the
119f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27   information we'
11a00 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20  ve collected..  
11a10 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
11a20 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
11a30 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54  se,.      "UPDAT
11a40 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20  E %Q.%s ".      
11a50 20 20 20 22 53 45 54 20 74 79 70 65 3d 27 25 73     "SET type='%s
11a60 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f  ', name=%Q, tbl_
11a70 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67  name=%Q, rootpag
11a80 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a  e=#%d, sql=%Q ".
11a90 20 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f         "WHERE ro
11aa0 77 69 64 3d 23 25 64 22 2c 0a 20 20 20 20 20 20  wid=#%d",.      
11ab0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
11ac0 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  SName, MASTER_NA
11ad0 4d 45 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c  ME,.      zType,
11ae0 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c  .      p->zName,
11af0 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c  .      p->zName,
11b00 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
11b10 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53  egRoot,.      zS
11b20 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73  tmt,.      pPars
11b30 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20  e->regRowid.    
11b40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
11b50 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b  Free(db, zStmt);
11b60 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
11b70 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
11b80 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
11b90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
11ba0 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a  INCREMENT.    /*
11bb0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
11bc0 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
11bd0 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71  te an sqlite_seq
11be0 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a  uence table for.
11bf0 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74      ** keeping t
11c00 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72  rack of autoincr
11c10 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20  ement keys..    
11c20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74  */.    if( (p->t
11c30 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
11c40 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 20 29  oincrement)!=0 )
11c50 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20  {.      Db *pDb 
11c60 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
11c70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
11c80 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
11c90 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
11ca0 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
11cb0 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  Db->pSchema->pSe
11cc0 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  qTab==0 ){.     
11cd0 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
11ce0 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
11cf0 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
11d00 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f  TABLE %Q.sqlite_
11d10 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65  sequence(name,se
11d20 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  q)",.          p
11d30 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 0a 20 20 20  Db->zDbSName.   
11d40 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
11d50 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
11d60 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65    /* Reparse eve
11d70 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74  rything to updat
11d80 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64  e our internal d
11d90 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a  ata structures *
11da0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
11db0 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f  eAddParseSchemaO
11dc0 70 28 70 50 61 72 73 65 2c 20 69 44 62 2c 0a 20  p(pParse, iDb,. 
11dd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11de0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62  3MPrintf(db, "tb
11df0 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20  l_name='%q' AND 
11e00 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22  type!='trigger'"
11e10 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  , p->zName));.  
11e20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  }...  /* Add the
11e30 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e   table to the in
11e40 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
11e50 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
11e60 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  tabase..  */.  i
11e70 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
11e80 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
11e90 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20  Old;.    Schema 
11ea0 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53  *pSchema = p->pS
11eb0 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72  chema;.    asser
11ec0 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
11ed0 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
11ee0 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c  b, 0) );.    pOl
11ef0 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
11f00 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e  nsert(&pSchema->
11f10 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  tblHash, p->zNam
11f20 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
11f30 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
11f40 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
11f50 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
11f60 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
11f70 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
11f80 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
11f90 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
11fa0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
11fb0 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e  }.    pParse->pN
11fc0 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  ewTable = 0;.   
11fd0 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d   db->mDbFlags |=
11fe0 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68   DBFLAG_SchemaCh
11ff0 61 6e 67 65 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ange;..#ifndef S
12000 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52  QLITE_OMIT_ALTER
12010 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70  TABLE.    if( !p
12020 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
12030 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
12040 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
12050 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61  ar *)pParse->sNa
12060 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20  meToken.z;.     
12070 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20   int nName;.    
12080 20 20 61 73 73 65 72 74 28 20 21 70 53 65 6c 65    assert( !pSele
12090 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70  ct && pCons && p
120a0 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28  End );.      if(
120b0 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a   pCons->z==0 ){.
120c0 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20          pCons = 
120d0 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pEnd;.      }.  
120e0 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74      nName = (int
120f0 29 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  )((const char *)
12100 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65  pCons->z - zName
12110 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43  );.      p->addC
12120 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20  olOffset = 13 + 
12130 73 71 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c  sqlite3Utf8CharL
12140 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  en(zName, nName)
12150 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
12160 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
12170 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
12180 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20  *.** The parser 
12190 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
121a0 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ne in order to c
121b0 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57  reate a new VIEW
121c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
121d0 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61  CreateView(.  Pa
121e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
121f0 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
12200 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
12210 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20  en *pBegin,     
12220 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
12230 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
12240 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
12250 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
12260 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b  ,     /* The tok
12270 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  en that holds th
12280 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  e name of the vi
12290 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
122a0 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68  Name2,     /* Th
122b0 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c  e token that hol
122c0 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ds the name of t
122d0 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 45 78 70  he view */.  Exp
122e0 72 4c 69 73 74 20 2a 70 43 4e 61 6d 65 73 2c 20  rList *pCNames, 
122f0 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 6c 69 73 74  /* Optional list
12300 20 6f 66 20 76 69 65 77 20 63 6f 6c 75 6d 6e 20   of view column 
12310 6e 61 6d 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63  names */.  Selec
12320 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a  t *pSelect,   /*
12330 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   A SELECT statem
12340 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ent that will be
12350 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65  come the new vie
12360 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
12370 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55  p,        /* TRU
12380 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52  E for a TEMPORAR
12390 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  Y view */.  int 
123a0 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20 20 2f  noErr          /
123b0 2a 20 53 75 70 70 72 65 73 73 20 65 72 72 6f 72  * Suppress error
123c0 20 6d 65 73 73 61 67 65 73 20 69 66 20 56 49 45   messages if VIE
123d0 57 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  W already exists
123e0 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
123f0 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f  p;.  int n;.  co
12400 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54  nst char *z;.  T
12410 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46  oken sEnd;.  DbF
12420 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b  ixer sFix;.  Tok
12430 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20  en *pName = 0;. 
12440 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69   int iDb;.  sqli
12450 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
12460 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61  ->db;..  if( pPa
12470 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20  rse->nVar>0 ){. 
12480 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12490 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72 61  sg(pParse, "para
124a0 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61  meters are not a
124b0 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22  llowed in views"
124c0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61  );.    goto crea
124d0 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20  te_view_fail;.  
124e0 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  }.  sqlite3Start
124f0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e  Table(pParse, pN
12500 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73  ame1, pName2, is
12510 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72  Temp, 1, 0, noEr
12520 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  r);.  p = pParse
12530 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
12540 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
12550 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 63  e->nErr ) goto c
12560 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b  reate_view_fail;
12570 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  .  sqlite3TwoPar
12580 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
12590 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
125a0 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73  Name);.  iDb = s
125b0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
125c0 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65  dex(db, p->pSche
125d0 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69  ma);.  sqlite3Fi
125e0 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
125f0 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65 77 22  rse, iDb, "view"
12600 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
12610 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74  sqlite3FixSelect
12620 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29  (&sFix, pSelect)
12630 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76   ) goto create_v
12640 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20  iew_fail;..  /* 
12650 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  Make a copy of t
12660 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54  he entire SELECT
12670 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
12680 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
12690 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c  ..  ** This will
126a0 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45   force all the E
126b0 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75  xpr.token.z valu
126c0 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  es to be dynamic
126d0 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  ally.  ** alloca
126e0 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20  ted rather than 
126f0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70  point to the inp
12700 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63  ut string - whic
12710 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a  h means that.  *
12720 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73  * they will pers
12730 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63 75  ist after the cu
12740 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78  rrent sqlite3_ex
12750 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  ec() call return
12760 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 4e  s..  */.  if( IN
12770 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
12780 7b 0a 20 20 20 20 70 2d 3e 70 53 65 6c 65 63 74  {.    p->pSelect
12790 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20   = pSelect;.    
127a0 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d  pSelect = 0;.  }
127b0 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 53 65  else{.    p->pSe
127c0 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
127d0 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c  lectDup(db, pSel
127e0 65 63 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  ect, EXPRDUP_RED
127f0 55 43 45 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  UCE);.  }.  p->p
12800 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  Check = sqlite3E
12810 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
12820 43 4e 61 6d 65 73 2c 20 45 58 50 52 44 55 50 5f  CNames, EXPRDUP_
12830 52 45 44 55 43 45 29 3b 0a 20 20 69 66 28 20 64  REDUCE);.  if( d
12840 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12850 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69  ) goto create_vi
12860 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c  ew_fail;..  /* L
12870 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  ocate the end of
12880 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57   the CREATE VIEW
12890 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b   statement.  Mak
128a0 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a  e sEnd point to.
128b0 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20    ** the end..  
128c0 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72  */.  sEnd = pPar
128d0 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a  se->sLastToken;.
128e0 20 20 61 73 73 65 72 74 28 20 73 45 6e 64 2e 7a    assert( sEnd.z
128f0 5b 30 5d 21 3d 30 20 7c 7c 20 73 45 6e 64 2e 6e  [0]!=0 || sEnd.n
12900 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 45 6e  ==0 );.  if( sEn
12910 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20  d.z[0]!=';' ){. 
12920 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e     sEnd.z += sEn
12930 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e  d.n;.  }.  sEnd.
12940 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e  n = 0;.  n = (in
12950 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67  t)(sEnd.z - pBeg
12960 69 6e 2d 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74  in->z);.  assert
12970 28 20 6e 3e 30 20 29 3b 0a 20 20 7a 20 3d 20 70  ( n>0 );.  z = p
12980 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c  Begin->z;.  whil
12990 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  e( sqlite3Isspac
129a0 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d  e(z[n-1]) ){ n--
129b0 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26  ; }.  sEnd.z = &
129c0 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e  z[n-1];.  sEnd.n
129d0 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20   = 1;..  /* Use 
129e0 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
129f0 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65  ) to add the vie
12a00 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f  w to the SQLITE_
12a10 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a  MASTER table */.
12a20 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c    sqlite3EndTabl
12a30 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45  e(pParse, 0, &sE
12a40 6e 64 2c 20 30 2c 20 30 29 3b 0a 0a 63 72 65 61  nd, 0, 0);..crea
12a50 74 65 5f 76 69 65 77 5f 66 61 69 6c 3a 0a 20 20  te_view_fail:.  
12a60 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
12a70 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29  ete(db, pSelect)
12a80 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d  ;.  if( IN_RENAM
12a90 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
12aa0 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 45 78 70  sqlite3RenameExp
12ab0 72 6c 69 73 74 55 6e 6d 61 70 28 70 50 61 72 73  rlistUnmap(pPars
12ac0 65 2c 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20 7d  e, pCNames);.  }
12ad0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
12ae0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 4e  stDelete(db, pCN
12af0 61 6d 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 3b  ames);.  return;
12b00 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12b10 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
12b20 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
12b30 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
12b40 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
12b50 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
12b60 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65  TABLE)./*.** The
12b70 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
12b80 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c   pTable is reall
12b90 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20  y a VIEW.  Fill 
12ba0 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  in the names of.
12bb0 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  ** the columns o
12bc0 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68  f the view in th
12bd0 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75  e pTable structu
12be0 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  re.  Return the 
12bf0 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72  number.** of err
12c00 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  ors.  If an erro
12c10 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20  r is seen leave 
12c20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
12c30 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
12c40 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
12c50 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
12c60 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61  Names(Parse *pPa
12c70 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
12c80 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53  le){.  Table *pS
12c90 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61  elTab;   /* A fa
12ca0 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68  ke table from wh
12cb0 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20 72  ich we get the r
12cc0 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53  esult set */.  S
12cd0 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20  elect *pSel;    
12ce0 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20   /* Copy of the 
12cf0 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c  SELECT that impl
12d00 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 20  ements the view 
12d10 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  */.  int nErr = 
12d20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  0;     /* Number
12d30 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75   of errors encou
12d40 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ntered */.  int 
12d50 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
12d60 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c   Temporarily hol
12d70 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ds the number of
12d80 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65   cursors assigne
12d90 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
12da0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
12db0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
12dc0 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c  nnection for mal
12dd0 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 23 69  loc errors */.#i
12de0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12df0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
12e00 20 69 6e 74 20 72 63 3b 0a 23 65 6e 64 69 66 0a   int rc;.#endif.
12e10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12e20 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
12e30 4e 0a 20 20 73 71 6c 69 74 65 33 5f 78 61 75 74  N.  sqlite3_xaut
12e40 68 20 78 41 75 74 68 3b 20 20 20 20 20 20 20 2f  h xAuth;       /
12e50 2a 20 53 61 76 65 64 20 78 41 75 74 68 20 70 6f  * Saved xAuth po
12e60 69 6e 74 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a  inter */.#endif.
12e70 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
12e80 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  e );..#ifndef SQ
12e90 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
12ea0 4c 54 41 42 4c 45 0a 20 20 64 62 2d 3e 6e 53 63  LTABLE.  db->nSc
12eb0 68 65 6d 61 4c 6f 63 6b 2b 2b 3b 0a 20 20 72 63  hemaLock++;.  rc
12ec0 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 43 61   = sqlite3VtabCa
12ed0 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65  llConnect(pParse
12ee0 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 64 62 2d  , pTable);.  db-
12ef0 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 2d 2d 3b 0a  >nSchemaLock--;.
12f00 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
12f10 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
12f20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
12f30 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30  able) ) return 0
12f40 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
12f50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
12f60 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69  EW.  /* A positi
12f70 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68  ve nCol means th
12f80 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20  e columns names 
12f90 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72  for this view ar
12fa0 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b  e.  ** already k
12fb0 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nown..  */.  if(
12fc0 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20   pTable->nCol>0 
12fd0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
12fe0 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * A negative nCo
12ff0 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d  l is a special m
13000 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68  arker meaning th
13010 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e  at we are curren
13020 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20  tly.  ** trying 
13030 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63  to compute the c
13040 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66  olumn names.  If
13050 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72   we enter this r
13060 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a  outine with.  **
13070 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   a negative nCol
13080 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f  , it means two o
13090 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72  r more views for
130a0 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74  m a loop, like t
130b0 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
130c0 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f     CREATE VIEW o
130d0 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  ne AS SELECT * F
130e0 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20  ROM two;.  **   
130f0 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77    CREATE VIEW tw
13100 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  o AS SELECT * FR
13110 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a  OM one;.  **.  *
13120 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20  * Actually, the 
13130 65 72 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e  error above is n
13140 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20  ow caught prior 
13150 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73  to reaching this
13160 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74   point..  ** But
13170 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
13180 65 73 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70  est is still imp
13190 6f 72 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65  ortant as it doe
131a0 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69  s come up.  ** i
131b0 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  n the following:
131c0 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20  .  ** .  **     
131d0 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69  CREATE TABLE mai
131e0 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20  n.ex1(a);.  **  
131f0 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 56     CREATE TEMP V
13200 49 45 57 20 65 78 31 20 41 53 20 53 45 4c 45 43  IEW ex1 AS SELEC
13210 54 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20  T a FROM ex1;.  
13220 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  **     SELECT * 
13230 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20  FROM temp.ex1;. 
13240 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
13250 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ->nCol<0 ){.    
13260 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13270 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73  pParse, "view %s
13280 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64   is circularly d
13290 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d  efined", pTable-
132a0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
132b0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 1;.  }.  ass
132c0 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ert( pTable->nCo
132d0 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  l>=0 );..  /* If
132e0 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
132f0 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65  , it means we ne
13300 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
13310 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20  e table names.. 
13320 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
13330 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
13340 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
13350 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64  ct() will expand
13360 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c   any.  ** "*" el
13370 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65  ements in the re
13380 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65  sults set of the
13390 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61   view and will a
133a0 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20  ssign cursors.  
133b0 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e  ** to the elemen
133c0 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ts of the FROM c
133d0 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64  lause.  But we d
133e0 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65  o not want these
133f0 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
13400 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20   be permanent.  
13410 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  So the computati
13420 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20  on is done on a 
13430 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
13440 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  CT.  ** statemen
13450 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
13460 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20  he view..  */.  
13470 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
13480 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65  pSelect );.  pSe
13490 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  l = sqlite3Selec
134a0 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d  tDup(db, pTable-
134b0 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
134c0 69 66 28 20 70 53 65 6c 20 29 7b 0a 23 69 66 6e  if( pSel ){.#ifn
134d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
134e0 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 75  ALTERTABLE.    u
134f0 38 20 65 50 61 72 73 65 4d 6f 64 65 20 3d 20 70  8 eParseMode = p
13500 50 61 72 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64  Parse->eParseMod
13510 65 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 65  e;.    pParse->e
13520 50 61 72 73 65 4d 6f 64 65 20 3d 20 50 41 52 53  ParseMode = PARS
13530 45 5f 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3b 0a 23  E_MODE_NORMAL;.#
13540 65 6e 64 69 66 0a 20 20 20 20 6e 20 3d 20 70 50  endif.    n = pP
13550 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20  arse->nTab;.    
13560 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
13570 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
13580 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b  se, pSel->pSrc);
13590 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
135a0 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e  l = -1;.    db->
135b0 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62  lookaside.bDisab
135c0 6c 65 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51  le++;.#ifndef SQ
135d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
135e0 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41 75 74  IZATION.    xAut
135f0 68 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20  h = db->xAuth;. 
13600 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30     db->xAuth = 0
13610 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20  ;.    pSelTab = 
13620 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
13630 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
13640 20 70 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e   pSel);.    db->
13650 78 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23  xAuth = xAuth;.#
13660 65 6c 73 65 0a 20 20 20 20 70 53 65 6c 54 61 62  else.    pSelTab
13670 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
13680 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
13690 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69  se, pSel);.#endi
136a0 66 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54  f.    pParse->nT
136b0 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  ab = n;.    if( 
136c0 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 20 29  pTable->pCheck )
136d0 7b 0a 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54  {.      /* CREAT
136e0 45 20 56 49 45 57 20 6e 61 6d 65 28 61 72 67 6c  E VIEW name(argl
136f0 69 73 74 29 20 41 53 20 2e 2e 2e 0a 20 20 20 20  ist) AS ....    
13700 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65 73 20 6f    ** The names o
13710 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  f the columns in
13720 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 74   the table are t
13730 61 6b 65 6e 20 66 72 6f 6d 0a 20 20 20 20 20 20  aken from.      
13740 2a 2a 20 61 72 67 6c 69 73 74 20 77 68 69 63 68  ** arglist which
13750 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 54   is stored in pT
13760 61 62 6c 65 2d 3e 70 43 68 65 63 6b 2e 20 20 54  able->pCheck.  T
13770 68 65 20 70 43 68 65 63 6b 20 66 69 65 6c 64 0a  he pCheck field.
13780 20 20 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c        ** normall
13790 79 20 68 6f 6c 64 73 20 43 48 45 43 4b 20 63 6f  y holds CHECK co
137a0 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 61 6e 20  nstraints on an 
137b0 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 2c 20  ordinary table, 
137c0 62 75 74 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  but for.      **
137d0 20 61 20 56 49 45 57 20 69 74 20 68 6f 6c 64 73   a VIEW it holds
137e0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c   the list of col
137f0 75 6d 6e 20 6e 61 6d 65 73 2e 0a 20 20 20 20 20  umn names..     
13800 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
13810 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
13820 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61  List(pParse, pTa
13830 62 6c 65 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20  ble->pCheck, .  
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
13860 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70  pTable->nCol, &p
13870 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20  Table->aCol);.  
13880 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
13890 6f 63 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20  ocFailed==0 .   
138a0 20 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 6e      && pParse->n
138b0 45 72 72 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  Err==0.       &&
138c0 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 70   pTable->nCol==p
138d0 53 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sel->pEList->nEx
138e0 70 72 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  pr.      ){.    
138f0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
13900 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
13910 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73  dCollation(pPars
13920 65 2c 20 70 54 61 62 6c 65 2c 20 70 53 65 6c 29  e, pTable, pSel)
13930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
13940 6c 73 65 20 69 66 28 20 70 53 65 6c 54 61 62 20  lse if( pSelTab 
13950 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 52 45 41  ){.      /* CREA
13960 54 45 20 56 49 45 57 20 6e 61 6d 65 20 41 53 2e  TE VIEW name AS.
13970 2e 2e 20 20 77 69 74 68 6f 75 74 20 61 6e 20 61  ..  without an a
13980 72 67 75 6d 65 6e 74 20 6c 69 73 74 2e 20 20 43  rgument list.  C
13990 6f 6e 73 74 72 75 63 74 0a 20 20 20 20 20 20 2a  onstruct.      *
139a0 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * the column nam
139b0 65 73 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45  es from the SELE
139c0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
139d0 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
139e0 65 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ew..      */.   
139f0 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c     assert( pTabl
13a00 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  e->aCol==0 );.  
13a10 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
13a20 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
13a30 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ;.      pTable->
13a40 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
13a50 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c  aCol;.      pSel
13a60 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
13a70 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
13a80 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  ol = 0;.      as
13a90 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
13aa0 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
13ab0 20 30 2c 20 70 54 61 62 6c 65 2d 3e 70 53 63 68   0, pTable->pSch
13ac0 65 6d 61 29 20 29 3b 0a 20 20 20 20 7d 65 6c 73  ema) );.    }els
13ad0 65 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  e{.      pTable-
13ae0 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
13af0 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20   nErr++;.    }. 
13b00 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
13b10 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61  Table(db, pSelTa
13b20 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  b);.    sqlite3S
13b30 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
13b40 70 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 6c  pSel);.    db->l
13b50 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c  ookaside.bDisabl
13b60 65 2d 2d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  e--;.#ifndef SQL
13b70 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41  ITE_OMIT_ALTERTA
13b80 42 4c 45 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  BLE.    pParse->
13b90 65 50 61 72 73 65 4d 6f 64 65 20 3d 20 65 50 61  eParseMode = ePa
13ba0 72 73 65 4d 6f 64 65 3b 0a 23 65 6e 64 69 66 0a  rseMode;.#endif.
13bb0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e    } else {.    n
13bc0 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70 54 61  Err++;.  }.  pTa
13bd0 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63  ble->pSchema->sc
13be0 68 65 6d 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f  hemaFlags |= DB_
13bf0 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20  UnresetViews;.  
13c00 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
13c10 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
13c20 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  te3DeleteColumnN
13c30 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29  ames(db, pTable)
13c40 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43  ;.    pTable->aC
13c50 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 54 61 62  ol = 0;.    pTab
13c60 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
13c70 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
13c80 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
13c90 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
13ca0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
13cb0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
13cc0 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
13cd0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13ce0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f  VIRTUALTABLE) */
13cf0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13d00 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
13d10 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
13d20 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65  n names from eve
13d30 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62  ry VIEW in datab
13d40 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74  ase idx..*/.stat
13d50 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69  ic void sqliteVi
13d60 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74  ewResetAll(sqlit
13d70 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29  e3 *db, int idx)
13d80 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
13d90 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
13da0 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
13db0 64 28 64 62 2c 20 69 64 78 2c 20 30 29 20 29 3b  d(db, idx, 0) );
13dc0 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f  .  if( !DbHasPro
13dd0 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
13de0 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20  B_UnresetViews) 
13df0 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
13e00 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
13e10 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e  t(&db->aDb[idx].
13e20 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
13e30 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73  ); i;i=sqliteHas
13e40 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54  hNext(i)){.    T
13e50 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
13e60 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
13e70 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
13e80 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
13e90 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75  qlite3DeleteColu
13ea0 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62  mnNames(db, pTab
13eb0 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61  );.      pTab->a
13ec0 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Col = 0;.      p
13ed0 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
13ee0 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65     }.  }.  DbCle
13ef0 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  arProperty(db, i
13f00 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
13f10 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  ews);.}.#else.# 
13f20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65  define sqliteVie
13f30 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23  wResetAll(A,B).#
13f40 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13f50 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a  OMIT_VIEW */../*
13f60 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
13f70 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
13f80 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73  he VDBE to adjus
13f90 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
13fa0 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79  chema.** used by
13fb0 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65   SQLite when the
13fc0 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76   btree layer mov
13fd0 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20  es a table root 
13fe0 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f  page. The.** roo
13ff0 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c  t-page of a tabl
14000 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61  e or index in da
14010 74 61 62 61 73 65 20 69 44 62 20 68 61 73 20 63  tabase iDb has c
14020 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f  hanged from iFro
14030 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a  m.** to iTo..**.
14040 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a  ** Ticket #1728:
14050 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62    The symbol tab
14060 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63  le might still c
14070 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69  ontain informati
14080 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20  on.** on tables 
14090 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74  and/or indices t
140a0 68 61 74 20 61 72 65 20 74 68 65 20 70 72 6f 63  hat are the proc
140b0 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c  ess of being del
140c0 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20  eted..** If you 
140d0 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65  are unlucky, one
140e0 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65   of those delete
140f0 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62  d indices or tab
14100 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76  les might.** hav
14110 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70  e the same rootp
14120 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68  age number as th
14130 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20  e real table or 
14140 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a  index that is.**
14150 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53   being moved.  S
14160 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70  o we cannot stop
14170 20 73 65 61 72 63 68 69 6e 67 20 61 66 74 65 72   searching after
14180 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
14190 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65   .** because the
141a0 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67   first match mig
141b0 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66  ht be for one of
141c0 20 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64   the deleted ind
141d0 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65  ices.** or table
141e0 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61  s and not the ta
141f0 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69  ble/index that i
14200 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67  s actually being
14210 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75   moved..** We mu
14220 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70  st continue loop
14230 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61  ing until all ta
14240 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73  bles and indices
14250 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67   with.** rootpag
14260 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65  e==iFrom have be
14270 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  en converted to 
14280 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20  have a rootpage 
14290 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64  of iTo.** in ord
142a0 65 72 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e  er to be certain
142b0 20 74 68 61 74 20 77 65 20 67 6f 74 20 74 68 65   that we got the
142c0 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23   right one..*/.#
142d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
142e0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f  IT_AUTOVACUUM.vo
142f0 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61  id sqlite3RootPa
14300 67 65 4d 6f 76 65 64 28 73 71 6c 69 74 65 33 20  geMoved(sqlite3 
14310 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e  *db, int iDb, in
14320 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
14330 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  ){.  HashElem *p
14340 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48  Elem;.  Hash *pH
14350 61 73 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  ash;.  Db *pDb;.
14360 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
14370 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
14380 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
14390 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
143a0 62 5b 69 44 62 5d 3b 0a 20 20 70 48 61 73 68 20  b[iDb];.  pHash 
143b0 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  = &pDb->pSchema-
143c0 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28  >tblHash;.  for(
143d0 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
143e0 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45  First(pHash); pE
143f0 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
14400 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
14410 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
14420 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
14430 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
14440 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d  if( pTab->tnum==
14450 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
14460 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Tab->tnum = iTo;
14470 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61  .    }.  }.  pHa
14480 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65  sh = &pDb->pSche
14490 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66  ma->idxHash;.  f
144a0 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
144b0 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b  ashFirst(pHash);
144c0 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
144d0 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
144e0 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  em)){.    Index 
144f0 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61  *pIdx = sqliteHa
14500 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
14510 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75     if( pIdx->tnu
14520 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  m==iFrom ){.    
14530 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69    pIdx->tnum = i
14540 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  To;.    }.  }.}.
14550 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
14560 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73  ite code to eras
14570 65 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  e the table with
14580 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
14590 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20  e from database 
145a0 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69  iDb..** Also wri
145b0 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66  te code to modif
145c0 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  y the sqlite_mas
145d0 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e  ter table and in
145e0 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a  ternal schema.**
145f0 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20   if a root-page 
14600 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  of another table
14610 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65   is moved by the
14620 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69   btree-layer whi
14630 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69  lst.** erasing i
14640 54 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20  Table (this can 
14650 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
14660 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
14670 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  ase)..*/ .static
14680 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f   void destroyRoo
14690 74 50 61 67 65 28 50 61 72 73 65 20 2a 70 50 61  tPage(Parse *pPa
146a0 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c  rse, int iTable,
146b0 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
146c0 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
146d0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
146e0 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
146f0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
14700 73 65 29 3b 0a 20 20 69 66 28 20 69 54 61 62 6c  se);.  if( iTabl
14710 65 3c 32 20 29 20 73 71 6c 69 74 65 33 45 72 72  e<2 ) sqlite3Err
14720 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
14730 6f 72 72 75 70 74 20 73 63 68 65 6d 61 22 29 3b  orrupt schema");
14740 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14750 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72  dOp3(v, OP_Destr
14760 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20  oy, iTable, r1, 
14770 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d  iDb);.  sqlite3M
14780 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
14790 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
147a0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
147b0 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    /* OP_Destroy 
147c0 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e 74  stores an in int
147d0 65 67 65 72 20 72 31 2e 20 49 66 20 74 68 69 73  eger r1. If this
147e0 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73   integer.  ** is
147f0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
14800 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
14810 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
14820 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20  table moved to. 
14830 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61   ** location iTa
14840 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ble. The followi
14850 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73  ng code modifies
14860 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
14870 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a  er table to.  **
14880 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20   reflect this.. 
14890 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e   **.  ** The "#N
148a0 4e 4e 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69  NN" in the SQL i
148b0 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73  s a special cons
148c0 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20  tant that means 
148d0 77 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20  whatever value. 
148e0 20 2a 2a 20 69 73 20 69 6e 20 72 65 67 69 73 74   ** is in regist
148f0 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61  er NNN.  See gra
14900 6d 6d 61 72 20 72 75 6c 65 73 20 61 73 73 6f 63  mmar rules assoc
14910 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 54  iated with the T
14920 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 2a 2a 20  K_REGISTER.  ** 
14930 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69 74 69  token for additi
14940 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
14950 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
14960 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
14970 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54  se, .     "UPDAT
14980 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74  E %Q.%s SET root
14990 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23 25  page=%d WHERE #%
149a0 64 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23  d AND rootpage=#
149b0 25 64 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65  %d",.     pParse
149c0 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
149d0 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f  DbSName, MASTER_
149e0 4e 41 4d 45 2c 20 69 54 61 62 6c 65 2c 20 72 31  NAME, iTable, r1
149f0 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  , r1);.#endif.  
14a00 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
14a10 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
14a20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  );.}../*.** Writ
14a30 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65  e VDBE code to e
14a40 72 61 73 65 20 74 61 62 6c 65 20 70 54 61 62 20  rase table pTab 
14a50 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74  and all associat
14a60 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69  ed indices on di
14a70 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75  sk..** Code to u
14a80 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  pdate the sqlite
14a90 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 61  _master tables a
14aa0 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
14ab0 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a  ma definitions.*
14ac0 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74  * in case a root
14ad0 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20  -page belonging 
14ae0 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  to another table
14af0 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65   is moved by the
14b00 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20   btree layer.** 
14b10 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74  is also added (t
14b20 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
14b30 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
14b40 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
14b50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
14b60 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20  troyTable(Parse 
14b70 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
14b80 70 54 61 62 29 7b 0a 20 20 2f 2a 20 49 66 20 74  pTab){.  /* If t
14b90 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
14ba0 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  be auto-vacuum c
14bb0 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54  apable (if SQLIT
14bc0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
14bd0 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65  M.  ** is not de
14be0 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20  fined), then it 
14bf0 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
14c00 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20  call OP_Destroy 
14c10 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c  on the.  ** tabl
14c20 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74  e and index root
14c30 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c  -pages in order,
14c40 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74   starting with t
14c50 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a  he numerically .
14c60 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f    ** largest roo
14c70 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54  t-page number. T
14c80 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74  his guarantees t
14c90 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hat none of the 
14ca0 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20  root-pages.  ** 
14cb0 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  to be destroyed 
14cc0 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20  is relocated by 
14cd0 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65  an earlier OP_De
14ce0 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74  stroy. i.e. if t
14cf0 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  he.  ** followin
14d00 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20  g were coded:.  
14d10 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72  **.  ** OP_Destr
14d20 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a  oy 4 0.  ** ....
14d30 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
14d40 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e  5 0.  **.  ** an
14d50 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61  d root page 5 ha
14d60 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65  ppened to be the
14d70 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
14d80 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  ge number in the
14d90 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
14da0 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35  then root page 5
14db0 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20   would be moved 
14dc0 74 6f 20 70 61 67 65 20 34 20 62 79 20 74 68 65  to page 4 by the
14dd0 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72   .  ** "OP_Destr
14de0 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20  oy 4 0" opcode. 
14df0 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 22  The subsequent "
14e00 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20  OP_Destroy 5 0" 
14e10 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61  would hit.  ** a
14e20 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e   free-list page.
14e30 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  .  */.  int iTab
14e40 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20   = pTab->tnum;. 
14e50 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20   int iDestroyed 
14e60 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31  = 0;..  while( 1
14e70 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
14e80 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61  Idx;.    int iLa
14e90 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20  rgest = 0;..    
14ea0 69 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d  if( iDestroyed==
14eb0 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72  0 || iTab<iDestr
14ec0 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c  oyed ){.      iL
14ed0 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20  argest = iTab;. 
14ee0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64     }.    for(pId
14ef0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
14f00 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
14f10 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
14f20 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e  nt iIdx = pIdx->
14f30 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65  tnum;.      asse
14f40 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d  rt( pIdx->pSchem
14f50 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
14f60 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
14f70 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20  Destroyed==0 || 
14f80 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64  (iIdx<iDestroyed
14f90 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67  )) && iIdx>iLarg
14fa0 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  est ){.        i
14fb0 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a  Largest = iIdx;.
14fc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14fd0 20 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d    if( iLargest==
14fe0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
14ff0 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  n;.    }else{.  
15000 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
15010 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
15020 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
15030 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
15040 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62       assert( iDb
15050 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72 73  >=0 && iDb<pPars
15060 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  e->db->nDb );.  
15070 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
15080 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72  age(pParse, iLar
15090 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20  gest, iDb);.    
150a0 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69    iDestroyed = i
150b0 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20  Largest;.    }. 
150c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f   }.}../*.** Remo
150d0 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
150e0 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e  the sqlite_statN
150f0 20 74 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69   tables (for N i
15100 6e 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66  n (1,2,3)).** af
15110 74 65 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58  ter a DROP INDEX
15120 20 6f 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63   or DROP TABLE c
15130 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  ommand..*/.stati
15140 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c  c void sqlite3Cl
15150 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20  earStatTables(. 
15160 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
15170 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
15180 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
15190 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20  /.  int iDb,    
151a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
151b0 65 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65  e database numbe
151c0 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
151d0 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a  r *zType,     /*
151e0 20 22 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20   "idx" or "tbl" 
151f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
15200 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e  *zName      /* N
15210 61 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20  ame of index or 
15220 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  table */.){.  in
15230 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t i;.  const cha
15240 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61  r *zDbName = pPa
15250 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
15260 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 66 6f  ].zDbSName;.  fo
15270 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b  r(i=1; i<=4; i++
15280 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62  ){.    char zTab
15290 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  [24];.    sqlite
152a0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
152b0 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71  f(zTab),zTab,"sq
152c0 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b  lite_stat%d",i);
152d0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
152e0 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
152f0 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e  ->db, zTab, zDbN
15300 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ame) ){.      sq
15310 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
15320 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
15330 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
15340 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25 51 22  .%s WHERE %s=%Q"
15350 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d  ,.        zDbNam
15360 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20  e, zTab, zType, 
15370 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
15380 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
15390 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
153a0 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e  to drop a table.
153b0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
153c0 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61  CodeDropTable(Pa
153d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
153e0 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44  le *pTab, int iD
153f0 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a  b, int isView){.
15400 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
15410 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
15420 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72  e->db;.  Trigger
15430 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62   *pTrigger;.  Db
15440 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
15450 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71  [iDb];..  v = sq
15460 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
15470 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
15480 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  v!=0 );.  sqlite
15490 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
154a0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
154b0 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
154c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
154d0 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73  ALTABLE.  if( Is
154e0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
154f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15500 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65  AddOp0(v, OP_VBe
15510 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  gin);.  }.#endif
15520 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20  ..  /* Drop all 
15530 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61  triggers associa
15540 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
15550 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
15560 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67  . Code.  ** is g
15570 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f  enerated to remo
15580 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
15590 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e  sqlite_master an
155a0 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65  d/or.  ** sqlite
155b0 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20  _temp_master if 
155c0 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20  required..  */. 
155d0 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69   pTrigger = sqli
155e0 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28 70  te3TriggerList(p
155f0 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
15600 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20  while( pTrigger 
15610 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15620 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
15630 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
15640 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72 69  || .        pTri
15650 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  gger->pSchema==d
15660 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
15670 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  a );.    sqlite3
15680 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70  DropTriggerPtr(p
15690 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29  Parse, pTrigger)
156a0 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  ;.    pTrigger =
156b0 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74   pTrigger->pNext
156c0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
156d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
156e0 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65  NCREMENT.  /* Re
156f0 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73  move any entries
15700 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73   of the sqlite_s
15710 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73  equence table as
15720 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20  sociated with.  
15730 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
15740 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73  ng dropped. This
15750 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   is done before 
15760 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f  the table is dro
15770 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65  pped.  ** at the
15780 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e   btree level, in
15790 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65   case the sqlite
157a0 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
157b0 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f  needs to.  ** mo
157c0 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ve as a result o
157d0 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20  f the drop (can 
157e0 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76  happen in auto-v
157f0 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a  acuum mode)..  *
15800 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61  /.  if( pTab->ta
15810 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
15820 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20  increment ){.   
15830 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
15840 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
15850 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
15860 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  Q.sqlite_sequenc
15870 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  e WHERE name=%Q"
15880 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62  ,.      pDb->zDb
15890 53 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  SName, pTab->zNa
158a0 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65  me.    );.  }.#e
158b0 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20  ndif..  /* Drop 
158c0 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  all SQLITE_MASTE
158d0 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  R table and inde
158e0 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72  x entries that r
158f0 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  efer to the.  **
15900 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67   table. The prog
15910 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74  ram name loops t
15920 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65  hrough the maste
15930 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65  r table and dele
15940 74 65 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72  tes.  ** every r
15950 6f 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74  ow that refers t
15960 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  o a table of the
15970 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
15980 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a  e one being.  **
15990 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65   dropped. Trigge
159a0 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  rs are handled s
159b0 65 70 61 72 61 74 65 6c 79 20 62 65 63 61 75 73  eparately becaus
159c0 65 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20  e a trigger can 
159d0 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  be.  ** created 
159e0 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  in the temp data
159f0 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73  base that refers
15a00 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61   to a table in a
15a10 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61  nother.  ** data
15a20 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  base..  */.  sql
15a30 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
15a40 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
15a50 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
15a60 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65  s WHERE tbl_name
15a70 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74  =%Q and type!='t
15a80 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20  rigger'",.      
15a90 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 4d  pDb->zDbSName, M
15aa0 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70 54 61 62  ASTER_NAME, pTab
15ab0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
15ac0 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56 69  !isView && !IsVi
15ad0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
15ae0 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28     destroyTable(
15af0 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
15b00 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20   }..  /* Remove 
15b10 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
15b20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e  from SQLite's in
15b30 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e  ternal schema an
15b40 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68  d modify.  ** th
15b50 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
15b60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  .  */.  if( IsVi
15b70 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
15b80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15b90 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74  dOp4(v, OP_VDest
15ba0 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  roy, iDb, 0, 0, 
15bb0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
15bc0 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41  .    sqlite3MayA
15bd0 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
15be0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
15bf0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70  ddOp4(v, OP_Drop
15c00 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30  Table, iDb, 0, 0
15c10 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
15c20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 68 61 6e  );.  sqlite3Chan
15c30 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
15c40 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 56   iDb);.  sqliteV
15c50 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20  iewResetAll(db, 
15c60 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iDb);.}../*.** T
15c70 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
15c80 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
15c90 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
15ca0 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
15cb0 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
15cc0 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
15cd0 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
15ce0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15cf0 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
15d00 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
15d10 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56   *pName, int isV
15d20 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b  iew, int noErr){
15d30 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
15d40 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
15d50 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
15d60 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
15d70 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  ;..  if( db->mal
15d80 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
15d90 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
15da0 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73  table;.  }.  ass
15db0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
15dc0 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
15dd0 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
15de0 20 29 3b 0a 20 20 69 66 28 20 21 49 73 52 65 75   );.  if( !IsReu
15df0 73 65 53 63 68 65 6d 61 28 64 62 29 20 26 26 20  seSchema(db) && 
15e00 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
15e10 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f  a(pParse) ) goto
15e20 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
15e30 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20  ;.  if( noErr ) 
15e40 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2b  db->suppressErr+
15e50 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 56  +;.  assert( isV
15e60 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77  iew==0 || isView
15e70 3d 3d 4c 4f 43 41 54 45 5f 56 49 45 57 20 29 3b  ==LOCATE_VIEW );
15e80 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
15e90 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d  3LocateTableItem
15ea0 28 70 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c  (pParse, isView,
15eb0 20 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a   &pName->a[0]);.
15ec0 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62    if( noErr ) db
15ed0 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2d 2d 3b  ->suppressErr--;
15ee0 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ..  if( pTab==0 
15ef0 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45 72 72  ){.    if( noErr
15f00 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65   ) sqlite3CodeVe
15f10 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28  rifyNamedSchema(
15f20 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61  pParse, pName->a
15f30 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
15f40 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
15f50 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
15f60 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
15f70 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
15f80 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
15f90 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
15fa0 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
15fb0 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d  ;.  sqlite3Schem
15fc0 61 57 72 69 74 61 62 6c 65 28 70 50 61 72 73 65  aWritable(pParse
15fd0 2c 20 69 44 62 29 3b 0a 0a 20 20 2f 2a 20 49 66  , iDb);..  /* If
15fe0 20 70 54 61 62 20 69 73 20 61 20 76 69 72 74 75   pTab is a virtu
15ff0 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56  al table, call V
16000 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
16010 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20  s() to ensure.  
16020 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c  ** it is initial
16030 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ized..  */.  if(
16040 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
16050 20 26 26 20 73 71 6c 69 74 65 33 56 69 65 77 47   && sqlite3ViewG
16060 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
16070 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20  arse, pTab) ){. 
16080 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
16090 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66  p_table;.  }.#if
160a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
160b0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
160c0 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b   {.    int code;
160d0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
160e0 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
160f0 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63  ABLE(iDb);.    c
16100 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
16110 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
16120 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  bSName;.    cons
16130 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20  t char *zArg2 = 
16140 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
16150 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
16160 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
16170 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
16180 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
16190 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
161a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56     }.    if( isV
161b0 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  iew ){.      if(
161c0 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
161d0 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
161e0 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
161f0 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b  _DROP_TEMP_VIEW;
16200 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16210 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
16220 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20  ITE_DROP_VIEW;. 
16230 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
16240 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
16250 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73  ALTABLE.    }els
16260 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
16270 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63  pTab) ){.      c
16280 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
16290 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  P_VTABLE;.      
162a0 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47  zArg2 = sqlite3G
162b0 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
162c0 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b  b)->pMod->zName;
162d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
162e0 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  e{.      if( !OM
162f0 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
16300 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
16310 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
16320 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  P_TEMP_TABLE;.  
16330 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16340 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
16350 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _DROP_TABLE;.   
16360 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
16370 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
16380 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
16390 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
163a0 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Arg2, zDb) ){.  
163b0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
163c0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
163d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
163e0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
163f0 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
16400 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  pTab->zName, 0, 
16410 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
16420 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
16430 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  le;.    }.  }.#e
16440 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74  ndif.  if( sqlit
16450 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
16460 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
16470 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26  ", 7)==0 .    &&
16480 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
16490 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
164a0 71 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29  qlite_stat", 11)
164b0 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
164c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
164d0 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
164e0 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22   not be dropped"
164f0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
16500 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
16510 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23  op_table;.  }..#
16520 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16530 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73  IT_VIEW.  /* Ens
16540 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69  ure DROP TABLE i
16550 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20  s not used on a 
16560 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56  view, and DROP V
16570 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a  IEW is not used.
16580 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e    ** on a table.
16590 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69  .  */.  if( isVi
165a0 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
165b0 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
165c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
165d0 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
165e0 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20  TABLE to delete 
165f0 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d  table %s", pTab-
16600 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
16610 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
16620 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73  e;.  }.  if( !is
16630 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
16640 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
16650 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
16660 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56  rse, "use DROP V
16670 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69  IEW to delete vi
16680 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  ew %s", pTab->zN
16690 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
166a0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
166b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
166c0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
166d0 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62  o remove the tab
166e0 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  le from the mast
166f0 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e  er table.  ** on
16700 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20   disk..  */.  v 
16710 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
16720 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
16730 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
16740 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
16750 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
16760 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73  Db);.    if( !is
16770 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71  View ){.      sq
16780 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61  lite3ClearStatTa
16790 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62  bles(pParse, iDb
167a0 2c 20 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a  , "tbl", pTab->z
167b0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
167c0 69 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28  ite3FkDropTable(
167d0 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70  pParse, pName, p
167e0 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Tab);.    }.    
167f0 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54  sqlite3CodeDropT
16800 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
16810 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77 29 3b  b, iDb, isView);
16820 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  .  }..exit_drop_
16830 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33  table:.  sqlite3
16840 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
16850 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , pName);.}../*.
16860 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16870 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  is called to cre
16880 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67  ate a new foreig
16890 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62  n key on the tab
168a0 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  le.** currently 
168b0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
168c0 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65  on.  pFromCol de
168d0 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63  termines which c
168e0 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
168f0 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70   current table p
16900 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65  oint to the fore
16910 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72  ign key.  If pFr
16920 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a  omCol==0 then.**
16930 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79   connect the key
16940 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   to the last col
16950 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70  umn inserted.  p
16960 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  To is the name o
16970 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72  f.** the table r
16980 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e 6b 2e  eferred to (a.k.
16990 61 20 74 68 65 20 22 70 61 72 65 6e 74 22 20 74  a the "parent" t
169a0 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c 20 69  able).  pToCol i
169b0 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 74  s a list.** of t
169c0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 61 72  ables in the par
169d0 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e 20 20  ent pTo table.  
169e0 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61  flags contains a
169f0 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
16a00 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66  n about the conf
16a10 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
16a20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69  algorithms speci
16a30 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  fied.** in the O
16a40 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44  N DELETE, ON UPD
16a50 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52  ATE and ON INSER
16a60 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  T clauses..**.**
16a70 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75   An FKey structu
16a80 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  re is created an
16a90 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  d added to the t
16aa0 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a  able currently.*
16ab0 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  * under construc
16ac0 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72  tion in the pPar
16ad0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69  se->pNewTable fi
16ae0 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  eld..**.** The f
16af0 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65  oreign key is se
16b00 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20  t for IMMEDIATE 
16b10 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73  processing.  A s
16b20 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a  ubsequent call.*
16b30 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65  * to sqlite3Defe
16b40 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69  rForeignKey() mi
16b50 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20  ght change this 
16b60 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a  to DEFERRED..*/.
16b70 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
16b80 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20  teForeignKey(.  
16b90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
16ba0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
16bb0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
16bc0 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c  rList *pFromCol,
16bd0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
16be0 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20  this table that 
16bf0 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74  point to other t
16c00 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  able */.  Token 
16c10 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  *pTo,          /
16c20 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74  * Name of the ot
16c30 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45  her table */.  E
16c40 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c  xprList *pToCol,
16c50 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69      /* Columns i
16c60 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  n the other tabl
16c70 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
16c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
16c90 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
16ca0 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a  on algorithms. *
16cb0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
16cc0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
16cd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16ce0 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
16cf0 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d  .  FKey *pFKey =
16d00 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78   0;.  FKey *pNex
16d10 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20  tTo;.  Table *p 
16d20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
16d30 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  ble;.  int nByte
16d40 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
16d50 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a   nCol;.  char *z
16d60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  ;..  assert( pTo
16d70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
16d80 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f  0 || IN_DECLARE_
16d90 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65  VTAB ) goto fk_e
16da0 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43  nd;.  if( pFromC
16db0 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ol==0 ){.    int
16dc0 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d   iCol = p->nCol-
16dd0 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  1;.    if( NEVER
16de0 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20  (iCol<0) ) goto 
16df0 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  fk_end;.    if( 
16e00 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
16e10 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20  ->nExpr!=1 ){.  
16e20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
16e30 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72  Msg(pParse, "for
16e40 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a  eign key on %s".
16e50 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c           " shoul
16e60 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79  d reference only
16e70 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   one column of t
16e80 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20  able %T",.      
16e90 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d     p->aCol[iCol]
16ea0 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20  .zName, pTo);.  
16eb0 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
16ec0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20  .    }.    nCol 
16ed0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
16ee0 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
16ef0 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43  l->nExpr!=pFromC
16f00 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  ol->nExpr ){.   
16f10 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16f20 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
16f30 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75   "number of colu
16f40 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  mns in foreign k
16f50 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ey does not matc
16f60 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
16f70 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d  ".        "colum
16f80 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65  ns in the refere
16f90 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20  nced table");.  
16fa0 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
16fb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
16fc0 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78   = pFromCol->nEx
16fd0 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20  pr;.  }.  nByte 
16fe0 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29  = sizeof(*pFKey)
16ff0 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65   + (nCol-1)*size
17000 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30  of(pFKey->aCol[0
17010 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b  ]) + pTo->n + 1;
17020 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
17030 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
17040 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69  pToCol->nExpr; i
17050 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  ++){.      nByte
17060 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
17070 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  n30(pToCol->a[i]
17080 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  .zName) + 1;.   
17090 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d   }.  }.  pFKey =
170a0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
170b0 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 29  Zero(db, nByte )
170c0 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30  ;.  if( pFKey==0
170d0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f   ){.    goto fk_
170e0 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79  end;.  }.  pFKey
170f0 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70  ->pFrom = p;.  p
17100 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20  FKey->pNextFrom 
17110 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20  = p->pFKey;.  z 
17120 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 2d  = (char*)&pFKey-
17130 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70  >aCol[nCol];.  p
17140 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20  FKey->zTo = z;. 
17150 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
17160 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c  BJECT ){.    sql
17170 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d  ite3RenameTokenM
17180 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64  ap(pParse, (void
17190 2a 29 7a 2c 20 70 54 6f 29 3b 0a 20 20 7d 0a 20  *)z, pTo);.  }. 
171a0 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e   memcpy(z, pTo->
171b0 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b  z, pTo->n);.  z[
171c0 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73  pTo->n] = 0;.  s
171d0 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29  qlite3Dequote(z)
171e0 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b  ;.  z += pTo->n+
171f0 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c  1;.  pFKey->nCol
17200 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70   = nCol;.  if( p
17210 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
17220 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d    pFKey->aCol[0]
17230 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c  .iFrom = p->nCol
17240 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
17250 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
17260 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
17270 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
17280 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a  =0; j<p->nCol; j
17290 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
172a0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
172b0 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  p->aCol[j].zName
172c0 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d  , pFromCol->a[i]
172d0 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
172e0 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61          pFKey->a
172f0 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a  Col[i].iFrom = j
17300 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
17310 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
17320 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
17330 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  >=p->nCol ){.   
17340 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
17350 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
17360 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e          "unknown
17370 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69   column \"%s\" i
17380 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  n foreign key de
17390 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20  finition", .    
173a0 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e        pFromCol->
173b0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
173c0 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
173d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
173e0 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
173f0 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  JECT ){.        
17400 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
17410 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20  enRemap(pParse, 
17420 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2c  &pFKey->aCol[i],
17430 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
17440 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
17450 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
17460 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
17470 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
17480 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
17490 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
174a0 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  30(pToCol->a[i].
174b0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
174c0 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
174d0 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 69 66 28  l = z;.      if(
174e0 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
174f0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  T ){.        sql
17500 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52  ite3RenameTokenR
17510 65 6d 61 70 28 70 50 61 72 73 65 2c 20 7a 2c 20  emap(pParse, z, 
17520 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
17530 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
17540 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f     memcpy(z, pTo
17550 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  Col->a[i].zName,
17560 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20   n);.      z[n] 
17570 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  = 0;.      z += 
17580 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n+1;.    }.  }. 
17590 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
175a0 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d  ed = 0;.  pFKey-
175b0 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75  >aAction[0] = (u
175c0 38 29 28 66 6c 61 67 73 20 26 20 30 78 66 66 29  8)(flags & 0xff)
175d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
175e0 4f 4e 20 44 45 4c 45 54 45 20 61 63 74 69 6f 6e  ON DELETE action
175f0 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63   */.  pFKey->aAc
17600 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28  tion[1] = (u8)((
17610 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30  flags >> 8 ) & 0
17620 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55  xff);    /* ON U
17630 50 44 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a  PDATE action */.
17640 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17650 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
17660 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68  d(db, 0, p->pSch
17670 65 6d 61 29 20 29 3b 0a 20 20 70 4e 65 78 74 54  ema) );.  pNextT
17680 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c 69  o = (FKey *)sqli
17690 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
176a0 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48  ->pSchema->fkeyH
176b0 61 73 68 2c 20 0a 20 20 20 20 20 20 70 46 4b 65  ash, .      pFKe
176c0 79 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29  y->zTo, (void *)
176d0 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66 28  pFKey.  );.  if(
176e0 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20   pNextTo==pFKey 
176f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  ){.    sqlite3Oo
17700 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
17710 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
17720 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 20 29  .  if( pNextTo )
17730 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
17740 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d  extTo->pPrevTo==
17750 30 20 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e  0 );.    pFKey->
17760 70 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78 74 54  pNextTo = pNextT
17770 6f 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e  o;.    pNextTo->
17780 70 50 72 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b  pPrevTo = pFKey;
17790 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  .  }..  /* Link 
177a0 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
177b0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20  to the table as 
177c0 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20  the last step.. 
177d0 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d   */.  p->pFKey =
177e0 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20   pFKey;.  pFKey 
177f0 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20  = 0;..fk_end:.  
17800 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
17810 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66  , pFKey);.#endif
17820 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
17830 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
17840 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74  _KEY) */.  sqlit
17850 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
17860 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a  (db, pFromCol);.
17870 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
17880 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43  tDelete(db, pToC
17890 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ol);.}../*.** Th
178a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
178b0 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49  lled when an INI
178c0 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
178d0 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45   or INITIALLY DE
178e0 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65  FERRED.** clause
178f0 20 69 73 20 73 65 65 6e 20 61 73 20 70 61 72 74   is seen as part
17900 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65   of a foreign ke
17910 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54  y definition.  T
17920 68 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a  he isDeferred.**
17930 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 31 20   parameter is 1 
17940 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  for INITIALLY DE
17950 46 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72  FERRED and 0 for
17960 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
17970 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68  IATE..** The beh
17980 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73  avior of the mos
17990 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74  t recently creat
179a0 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  ed foreign key i
179b0 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63  s adjusted.** ac
179c0 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f  cordingly..*/.vo
179d0 69 64 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  id sqlite3DeferF
179e0 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20  oreignKey(Parse 
179f0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44  *pParse, int isD
17a00 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65  eferred){.#ifnde
17a10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
17a20 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c  REIGN_KEY.  Tabl
17a30 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20  e *pTab;.  FKey 
17a40 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70  *pFKey;.  if( (p
17a50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
17a60 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28  ewTable)==0 || (
17a70 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46  pFKey = pTab->pF
17a80 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Key)==0 ) return
17a90 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 65  ;.  assert( isDe
17aa0 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44  ferred==0 || isD
17ab0 65 66 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a  eferred==1 ); /*
17ac0 20 45 56 3a 20 52 2d 33 30 33 32 33 2d 32 31 39   EV: R-30323-219
17ad0 31 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69  17 */.  pFKey->i
17ae0 73 44 65 66 65 72 72 65 64 20 3d 20 28 75 38 29  sDeferred = (u8)
17af0 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64  isDeferred;.#end
17b00 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  if.}../*.** Gene
17b10 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
17b20 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65  ill erase and re
17b30 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78  fill index *pIdx
17b40 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73  .  This is.** us
17b50 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
17b60 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64   a newly created
17b70 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63   index or to rec
17b80 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f  ompute the.** co
17b90 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65  ntent of an inde
17ba0 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f  x in response to
17bb0 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61   a REINDEX comma
17bc0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d  nd..**.** if mem
17bd0 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20  RootPage is not 
17be0 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61  negative, it mea
17bf0 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ns that the inde
17c00 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72  x is newly.** cr
17c10 65 61 74 65 64 2e 20 20 54 68 65 20 72 65 67 69  eated.  The regi
17c20 73 74 65 72 20 73 70 65 63 69 66 69 65 64 20 62  ster specified b
17c30 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f  y memRootPage co
17c40 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f  ntains the.** ro
17c50 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
17c60 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66  f the index.  If
17c70 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20   memRootPage is 
17c80 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a  negative, then.*
17c90 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65  * the index alre
17ca0 61 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d  ady exists and m
17cb0 75 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62  ust be cleared b
17cc0 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69  efore being refi
17cd0 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20  lled and.** the 
17ce0 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
17cf0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   of the index is
17d00 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64   taken from pInd
17d10 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61  ex->tnum..*/.sta
17d20 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
17d30 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73  RefillIndex(Pars
17d40 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
17d50 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65   *pIndex, int me
17d60 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61  mRootPage){.  Ta
17d70 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
17d80 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20  ex->pTable;  /* 
17d90 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  The table that i
17da0 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  s indexed */.  i
17db0 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65  nt iTab = pParse
17dc0 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
17dd0 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
17de0 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20  ed for pTab */. 
17df0 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72   int iIdx = pPar
17e00 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
17e10 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20  /* Btree cursor 
17e20 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20  used for pIndex 
17e30 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 65 72  */.  int iSorter
17e40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17e50 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
17e60 65 6e 65 64 20 62 79 20 4f 70 65 6e 53 6f 72 74  ened by OpenSort
17e70 65 72 20 28 69 66 20 69 6e 20 75 73 65 29 20 2a  er (if in use) *
17e80 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20  /.  int addr1;  
17e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ea0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
17eb0 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a   top of loop */.
17ec0 20 20 69 6e 74 20 61 64 64 72 32 3b 20 20 20 20    int addr2;    
17ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ee0 20 2f 2a 20 41 64 64 72 65 73 73 20 74 6f 20 6a   /* Address to j
17ef0 75 6d 70 20 74 6f 20 66 6f 72 20 6e 65 78 74 20  ump to for next 
17f00 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  iteration */.  i
17f10 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  nt tnum;        
17f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17f30 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e   Root page of in
17f40 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  dex */.  int iPa
17f50 72 74 49 64 78 4c 61 62 65 6c 3b 20 20 20 20 20  rtIdxLabel;     
17f60 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
17f70 74 6f 20 74 68 69 73 20 6c 61 62 65 6c 20 74 6f  to this label to
17f80 20 73 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20   skip a row */. 
17f90 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
17fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fb0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
17fc0 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75   into this virtu
17fd0 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20  al machine */.  
17fe0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20  KeyInfo *pKey;  
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18000 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e  * KeyInfo for in
18010 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  dex */.  int reg
18020 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
18030 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
18040 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65  ter holding asse
18050 6d 62 6c 65 64 20 69 6e 64 65 78 20 72 65 63 6f  mbled index reco
18060 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  rd */.  sqlite3 
18070 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
18080 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  ;      /* The da
18090 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
180a0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d  n */.  int iDb =
180b0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
180c0 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
180d0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66  ->pSchema);..#if
180e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
180f0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
18100 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
18110 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
18120 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49  LITE_REINDEX, pI
18130 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a  ndex->zName, 0,.
18140 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
18150 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 29 20 29 7b  b].zDbSName ) ){
18160 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
18170 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
18180 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
18190 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  ck on the table 
181a0 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20  to perform this 
181b0 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  operation */.  s
181c0 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
181d0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
181e0 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62  b->tnum, 1, pTab
181f0 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d  ->zName);..  v =
18200 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
18210 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
18220 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
18230 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  if( memRootPage>
18240 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d  =0 ){.    tnum =
18250 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20   memRootPage;.  
18260 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20  }else{.    tnum 
18270 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a  = pIndex->tnum;.
18280 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c    }.  pKey = sql
18290 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
182a0 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
182b0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  x);.  assert( pK
182c0 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  ey!=0 || db->mal
182d0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
182e0 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 0a 20 20  rse->nErr );..  
182f0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74  /* Open the sort
18300 65 72 20 63 75 72 73 6f 72 20 69 66 20 77 65 20  er cursor if we 
18310 61 72 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20  are to use one. 
18320 2a 2f 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70  */.  iSorter = p
18330 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
18340 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18350 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f  p4(v, OP_SorterO
18360 70 65 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c  pen, iSorter, 0,
18370 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c   pIndex->nKeyCol
18380 2c 20 28 63 68 61 72 2a 29 0a 20 20 20 20 20 20  , (char*).      
18390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
183a0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
183b0 70 4b 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46  pKey), P4_KEYINF
183c0 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  O);..  /* Open t
183d0 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74  he table. Loop t
183e0 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20  hrough all rows 
183f0 6f 66 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e  of the table, in
18400 73 65 72 74 69 6e 67 20 69 6e 64 65 78 0a 20 20  serting index.  
18410 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20  ** records into 
18420 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20  the sorter. */. 
18430 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
18440 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20  e(pParse, iTab, 
18450 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
18460 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31  enRead);.  addr1
18470 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
18480 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
18490 64 2c 20 69 54 61 62 2c 20 30 29 3b 20 56 64 62  d, iTab, 0); Vdb
184a0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
184b0 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
184c0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
184d0 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
184e0 4d 75 6c 74 69 57 72 69 74 65 28 70 50 61 72 73  MultiWrite(pPars
184f0 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65  e);..  sqlite3Ge
18500 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70  nerateIndexKey(p
18510 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69 54 61  Parse,pIndex,iTa
18520 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c 26 69  b,regRecord,0,&i
18530 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30  PartIdxLabel,0,0
18540 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
18550 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
18560 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f 72 74  terInsert, iSort
18570 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  er, regRecord);.
18580 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
18590 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61  PartIdxLabel(pPa
185a0 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c 61 62  rse, iPartIdxLab
185b0 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  el);.  sqlite3Vd
185c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
185d0 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31  ext, iTab, addr1
185e0 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +1); VdbeCoverag
185f0 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
18600 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
18610 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d  ddr1);.  if( mem
18620 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c  RootPage<0 ) sql
18630 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18640 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d  , OP_Clear, tnum
18650 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
18660 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
18670 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64  P_OpenWrite, iId
18680 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20  x, tnum, iDb, . 
18690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186a0 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c     (char *)pKey,
186b0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
186c0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
186d0 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55  eP5(v, OPFLAG_BU
186e0 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50  LKCSR|((memRootP
186f0 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50  age>=0)?OPFLAG_P
18700 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61  2ISREG:0));..  a
18710 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
18720 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
18730 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f 72 74  orterSort, iSort
18740 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  er, 0); VdbeCove
18750 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20 49  rage(v);.  if( I
18760 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e  sUniqueIndex(pIn
18770 64 65 78 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  dex) ){.    int 
18780 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j2 = sqlite3Vdbe
18790 47 6f 74 6f 28 76 2c 20 31 29 3b 0a 20 20 20 20  Goto(v, 1);.    
187a0 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
187b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
187c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
187d0 62 65 56 65 72 69 66 79 41 62 6f 72 74 61 62 6c  beVerifyAbortabl
187e0 65 28 76 2c 20 4f 45 5f 41 62 6f 72 74 29 3b 0a  e(v, OE_Abort);.
187f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18800 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53  ddOp4Int(v, OP_S
18810 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20 69 53  orterCompare, iS
18820 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67 52 65  orter, j2, regRe
18830 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  cord,.          
18840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
18850 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b  Index->nKeyCol);
18860 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
18870 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69  ;.    sqlite3Uni
18880 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  queConstraint(pP
18890 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20  arse, OE_Abort, 
188a0 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c  pIndex);.    sql
188b0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
188c0 28 76 2c 20 6a 32 29 3b 0a 20 20 7d 65 6c 73 65  (v, j2);.  }else
188d0 7b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  {.    addr2 = sq
188e0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
188f0 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73  Addr(v);.  }.  s
18900 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
18910 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
18920 61 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52  a, iSorter, regR
18930 65 63 6f 72 64 2c 20 69 49 64 78 29 3b 0a 20 20  ecord, iIdx);.  
18940 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18950 31 28 76 2c 20 4f 50 5f 53 65 65 6b 45 6e 64 2c  1(v, OP_SeekEnd,
18960 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65   iIdx);.  sqlite
18970 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18980 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64  P_IdxInsert, iId
18990 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  x, regRecord);. 
189a0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
189b0 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55  geP5(v, OPFLAG_U
189c0 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20  SESEEKRESULT);. 
189d0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
189e0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
189f0 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
18a00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18a10 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
18a20 20 69 53 6f 72 74 65 72 2c 20 61 64 64 72 32 29   iSorter, addr2)
18a30 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
18a40 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
18a50 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
18a60 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64  1);..  sqlite3Vd
18a70 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
18a80 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73  lose, iTab);.  s
18a90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
18aa0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
18ab0 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dx);.  sqlite3Vd
18ac0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
18ad0 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a  lose, iSorter);.
18ae0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
18af0 65 20 68 65 61 70 20 73 70 61 63 65 20 74 6f 20  e heap space to 
18b00 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f 62  hold an Index ob
18b10 6a 65 63 74 20 77 69 74 68 20 6e 43 6f 6c 20 63  ject with nCol c
18b20 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e  olumns..**.** In
18b30 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 63  crease the alloc
18b40 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72  ation size to pr
18b50 6f 76 69 64 65 20 61 6e 20 65 78 74 72 61 20 6e  ovide an extra n
18b60 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f  Extra bytes.** o
18b70 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  f 8-byte aligned
18b80 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65   space after the
18b90 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 61 6e   Index object an
18ba0 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f  d return a.** po
18bb0 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 65 78  inter to this ex
18bc0 74 72 61 20 73 70 61 63 65 20 69 6e 20 2a 70 70  tra space in *pp
18bd0 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20  Extra..*/.Index 
18be0 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65  *sqlite3Allocate
18bf0 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20 20 73  IndexObject(.  s
18c00 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
18c10 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
18c20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
18c30 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20  i16 nCol,       
18c40 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
18c50 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
18c60 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  in the index */.
18c70 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
18c80 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18c90 20 6f 66 20 62 79 74 65 73 20 6f 66 20 65 78 74   of bytes of ext
18ca0 72 61 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  ra space to allo
18cb0 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70  c */.  char **pp
18cc0 45 78 74 72 61 20 20 20 20 20 20 20 2f 2a 20 50  Extra       /* P
18cd0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 65  ointer to the "e
18ce0 78 74 72 61 22 20 73 70 61 63 65 20 2a 2f 0a 29  xtra" space */.)
18cf0 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20 20 20  {.  Index *p;   
18d00 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
18d10 63 61 74 65 64 20 69 6e 64 65 78 20 6f 62 6a 65  cated index obje
18d20 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ct */.  int nByt
18d30 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
18d40 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  Bytes of space f
18d50 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  or Index object 
18d60 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e  + arrays */..  n
18d70 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69  Byte = ROUND8(si
18d80 7a 65 6f 66 28 49 6e 64 65 78 29 29 20 2b 20 20  zeof(Index)) +  
18d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
18da0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 20  ndex structure  
18db0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55  */.          ROU
18dc0 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  ND8(sizeof(char*
18dd0 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20 20  )*nCol) +       
18de0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c    /* Index.azCol
18df0 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  l     */.       
18e00 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
18e10 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31  (LogEst)*(nCol+1
18e20 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  ) +     /* Index
18e30 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a  .aiRowLogEst   *
18e40 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
18e50 20 20 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e     sizeof(i16)*n
18e60 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20  Col +           
18e70 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75   /* Index.aiColu
18e80 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  mn   */.        
18e90 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
18ea0 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20  u8)*nCol);      
18eb0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
18ec0 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20  aSortOrder */.  
18ed0 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
18ee0 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
18ef0 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  e + nExtra);.  i
18f00 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68 61 72  f( p ){.    char
18f10 20 2a 70 45 78 74 72 61 20 3d 20 28 28 63 68 61   *pExtra = ((cha
18f20 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a  r*)p)+ROUND8(siz
18f30 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20  eof(Index));.   
18f40 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f   p->azColl = (co
18f50 6e 73 74 20 63 68 61 72 2a 2a 29 70 45 78 74 72  nst char**)pExtr
18f60 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 52 4f 55  a; pExtra += ROU
18f70 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  ND8(sizeof(char*
18f80 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e  )*nCol);.    p->
18f90 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c  aiRowLogEst = (L
18fa0 6f 67 45 73 74 2a 29 70 45 78 74 72 61 3b 20 70  ogEst*)pExtra; p
18fb0 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
18fc0 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29  LogEst)*(nCol+1)
18fd0 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d  ;.    p->aiColum
18fe0 6e 20 3d 20 28 69 31 36 2a 29 70 45 78 74 72 61  n = (i16*)pExtra
18ff0 3b 20 20 20 20 20 20 20 70 45 78 74 72 61 20 2b  ;       pExtra +
19000 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43  = sizeof(i16)*nC
19010 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74  ol;.    p->aSort
19020 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 70 45 78  Order = (u8*)pEx
19030 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c  tra;.    p->nCol
19040 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20  umn = nCol;.    
19050 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f  p->nKeyCol = nCo
19060 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70 70 45 78  l - 1;.    *ppEx
19070 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29  tra = ((char*)p)
19080 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20   + nByte;.  }.  
19090 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
190a0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
190b0 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c  index for an SQL
190c0 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e   table.  pName1.
190d0 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61  pName2 is the na
190e0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
190f0 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74  .** and pTblList
19100 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
19110 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
19120 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
19130 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20    Both will .** 
19140 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72  be NULL for a pr
19150 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20  imary key or an 
19160 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72  index that is cr
19170 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79  eated to satisfy
19180 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e   a.** UNIQUE con
19190 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61  straint.  If pTa
191a0 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61  ble and pIndex a
191b0 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61  re NULL, use pPa
191c0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a  rse->pNewTable.*
191d0 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74  * as the table t
191e0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
191f0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
19200 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74   is a table that
19210 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79   is.** currently
19220 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
19230 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54  ed by a CREATE T
19240 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
19250 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61  **.** pList is a
19260 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
19270 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
19280 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e   pList will be N
19290 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ULL if this.** i
192a0 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  s a primary key 
192b0 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72  or unique-constr
192c0 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74  aint on the most
192d0 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61   recent column a
192e0 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74  dded.** to the t
192f0 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
19300 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
19310 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  n.  .*/.void sql
19320 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
19330 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
19340 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66  ,     /* All inf
19350 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
19360 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54  his parse */.  T
19370 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
19380 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20    /* First part 
19390 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
193a0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
193b0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
193c0 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
193d0 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e  t of index name.
193e0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
193f0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e    SrcList *pTblN
19400 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f  ame, /* Table to
19410 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72   index. Use pPar
19420 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66  se->pNewTable if
19430 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74   0 */.  ExprList
19440 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20   *pList,   /* A 
19450 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
19460 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
19470 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
19480 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72        /* OE_Abor
19490 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45  t, OE_Ignore, OE
194a0 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f  _Replace, or OE_
194b0 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  None */.  Token 
194c0 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20  *pStart,     /* 
194d0 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
194e0 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 69   that begins thi
194f0 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  s statement */. 
19500 20 45 78 70 72 20 2a 70 50 49 57 68 65 72 65 2c   Expr *pPIWhere,
19510 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61      /* WHERE cla
19520 75 73 65 20 66 6f 72 20 70 61 72 74 69 61 6c 20  use for partial 
19530 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74  indices */.  int
19540 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20   sortOrder,     
19550 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66  /* Sort order of
19560 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65   primary key whe
19570 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f  n pList==NULL */
19580 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73  .  int ifNotExis
19590 74 2c 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72  t,    /* Omit er
195a0 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72  ror if index alr
195b0 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20  eady exists */. 
195c0 20 75 38 20 69 64 78 54 79 70 65 20 20 20 20 20   u8 idxType     
195d0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
195e0 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 54 61   type */.){.  Ta
195f0 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
19600 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
19610 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49  e indexed */.  I
19620 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30  ndex *pIndex = 0
19630 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ;   /* The index
19640 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a   to be created *
19650 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  /.  char *zName 
19660 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  = 0;     /* Name
19670 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   of the index */
19680 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
19690 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
196a0 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
196b0 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e  in zName */.  in
196c0 74 20 69 2c 20 6a 3b 0a 20 20 44 62 46 69 78 65  t i, j;.  DbFixe
196d0 72 20 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f  r sFix;        /
196e0 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20  * For assigning 
196f0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74  database names t
19700 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  o pTable */.  in
19710 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b  t sortOrderMask;
19720 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72     /* 1 to honor
19730 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20   DESC in index. 
19740 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f   0 to ignore. */
19750 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
19760 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44   pParse->db;.  D
19770 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20  b *pDb;         
19780 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69      /* The speci
19790 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  fic table contai
197a0 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64  ning the indexed
197b0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
197c0 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
197d0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
197e0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
197f0 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  t is being writt
19800 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
19810 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Name = 0;    /* 
19820 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
19830 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f   of the index to
19840 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72   create */.  str
19850 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
19860 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a  m *pListItem; /*
19870 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
19880 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  r pList */.  int
19890 20 6e 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20   nExtra = 0;    
198a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
198b0 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   Space allocated
198c0 20 66 6f 72 20 7a 45 78 74 72 61 5b 5d 20 2a 2f   for zExtra[] */
198d0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 43 6f 6c  .  int nExtraCol
198e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
198f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19900 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e   extra columns n
19910 65 65 64 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  eeded */.  char 
19920 2a 7a 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20  *zExtra = 0;    
19930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
19940 78 74 72 61 20 73 70 61 63 65 20 61 66 74 65 72  xtra space after
19950 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
19960 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  t */.  Index *pP
19970 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50  k = 0;      /* P
19980 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
19990 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
199a0 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a 0a 20 20  ID tables */..  
199b0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
199c0 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
199d0 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 67 6f  nErr>0 ){.    go
199e0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
199f0 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
19a00 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
19a10 26 26 20 69 64 78 54 79 70 65 21 3d 53 51 4c 49  && idxType!=SQLI
19a20 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41  TE_IDXTYPE_PRIMA
19a30 52 59 4b 45 59 20 29 7b 0a 20 20 20 20 67 6f 74  RYKEY ){.    got
19a40 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
19a50 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  dex;.  }.  if( !
19a60 49 73 52 65 75 73 65 53 63 68 65 6d 61 28 64 62  IsReuseSchema(db
19a70 29 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  ) && SQLITE_OK!=
19a80 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
19a90 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
19aa0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
19ab0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
19ac0 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
19ad0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
19ae0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52  o be indexed.  R
19af0 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e  eturn early if n
19b00 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
19b10 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
19b20 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20   ){..    /* Use 
19b30 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64  the two-part ind
19b40 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  ex name to deter
19b50 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73  mine the databas
19b60 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61  e .    ** to sea
19b70 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c  rch for the tabl
19b80 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62  e. 'Fix' the tab
19b90 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20  le name to this 
19ba0 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  db.    ** before
19bb0 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20   looking up the 
19bc0 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
19bd0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
19be0 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20   && pName2 );.  
19bf0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
19c00 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
19c10 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
19c20 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
19c30 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f  if( iDb<0 ) goto
19c40 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19c50 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
19c60 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e  pName && pName->
19c70 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  z );..#ifndef SQ
19c80 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42  LITE_OMIT_TEMPDB
19c90 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
19ca0 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e  ndex name was un
19cb0 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b  qualified, check
19cc0 20 69 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20   if the table.  
19cd0 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74    ** is a temp t
19ce0 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74  able. If so, set
19cf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
19d00 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68   1. Do not do th
19d10 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69  is.    ** if ini
19d20 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61  tialising a data
19d30 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20  base schema..   
19d40 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d   */.    if( !db-
19d50 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
19d60 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
19d70 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28  e3SrcListLookup(
19d80 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65  pParse, pTblName
19d90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61  );.      if( pNa
19da0 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61  me2->n==0 && pTa
19db0 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65  b && pTab->pSche
19dc0 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
19dd0 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
19de0 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20    iDb = 1;.     
19df0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
19e00 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 49  .    sqlite3FixI
19e10 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
19e20 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c  e, iDb, "index",
19e30 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   pName);.    if(
19e40 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
19e50 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61  st(&sFix, pTblNa
19e60 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  me) ){.      /* 
19e70 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73  Because the pars
19e80 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54  er constructs pT
19e90 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69  blName from a si
19ea0 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c  ngle identifier,
19eb0 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
19ec0 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20  3FixSrcList can 
19ed0 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20  never fail. */. 
19ee0 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
19ef0 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
19f00 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
19f10 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
19f20 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b  0, &pTblName->a[
19f30 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0]);.    assert(
19f40 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
19f50 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20  d==0 || pTab==0 
19f60 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
19f70 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
19f80 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
19f90 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26 20 64   if( iDb==1 && d
19fa0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
19fb0 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema!=pTab->pSche
19fc0 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ma ){.      sqli
19fd0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
19fe0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
19ff0 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61  "cannot create a
1a000 20 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e   TEMP index on n
1a010 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c 22  on-TEMP table \"
1a020 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\"",.         
1a030 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
1a040 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1a050 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1a060 20 20 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73    }.    if( !Has
1a070 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 50  Rowid(pTab) ) pP
1a080 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
1a090 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
1a0a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1a0b0 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
1a0c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1a0d0 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Start==0 );.    
1a0e0 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
1a0f0 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66  NewTable;.    if
1a100 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65  ( !pTab ) goto e
1a110 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1a120 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
1a130 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
1a140 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
1a150 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d  ma);.  }.  pDb =
1a160 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
1a170 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21  .  assert( pTab!
1a180 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1a190 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
1a1a0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1a1b0 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
1a1c0 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
1a1d0 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26   7)==0 .       &
1a1e0 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  & db->init.busy=
1a1f0 3d 30 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53  =0.#if SQLITE_US
1a200 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
1a210 4e 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  N.       && sqli
1a220 74 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65  te3UserAuthTable
1a230 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30  (pTab->zName)==0
1a240 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
1a250 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 53 51 4c 49  QLITE_ALLOW_SQLI
1a260 54 45 5f 4d 41 53 54 45 52 5f 49 4e 44 45 58 0a  TE_MASTER_INDEX.
1a270 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1a280 33 53 74 72 49 43 6d 70 28 26 70 54 61 62 2d 3e  3StrICmp(&pTab->
1a290 7a 4e 61 6d 65 5b 37 5d 2c 22 6d 61 73 74 65 72  zName[7],"master
1a2a0 22 29 21 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20  ")!=0.#endif.   
1a2b0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
1a2c0 72 4e 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e  rNICmp(&pTab->zN
1a2d0 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62  ame[7],"altertab
1a2e0 5f 22 2c 39 29 21 3d 30 0a 20 29 7b 0a 20 20 20  _",9)!=0. ){.   
1a2f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1a300 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
1a310 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  %s may not be in
1a320 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  dexed", pTab->zN
1a330 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
1a340 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1a350 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
1a360 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
1a370 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
1a380 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
1a390 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1a3a0 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74  , "views may not
1a3b0 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
1a3c0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1a3d0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
1a3e0 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
1a3f0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1a400 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56  LTABLE.  if( IsV
1a410 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
1a420 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1a430 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72  Msg(pParse, "vir
1a440 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20  tual tables may 
1a450 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
1a460 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
1a470 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1a480 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  }.#endif..  /*. 
1a490 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d   ** Find the nam
1a4a0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  e of the index. 
1a4b0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
1a4c0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1a4d0 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64  another.  ** ind
1a4e0 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68  ex or table with
1a4f0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
1a500 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65   .  **.  ** Exce
1a510 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72  ption:  If we ar
1a520 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61  e reading the na
1a530 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74  mes of permanent
1a540 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68   indices from th
1a550 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  e.  ** sqlite_ma
1a560 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61  ster table (beca
1a570 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  use some other p
1a580 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74  rocess changed t
1a590 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20  he schema) and. 
1a5a0 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   ** one of the i
1a5b0 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69  ndex names colli
1a5c0 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d  des with the nam
1a5d0 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79  e of a temporary
1a5e0 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69   table or.  ** i
1a5f0 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69  ndex, then we wi
1a600 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70  ll continue to p
1a610 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65  rocess this inde
1a620 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  x..  **.  ** If 
1a630 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  pName==0 it mean
1a640 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20  s that we are.  
1a650 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  ** dealing with 
1a660 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
1a670 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
1a680 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  nt.  We have to 
1a690 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20  invent our.  ** 
1a6a0 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  own name..  */. 
1a6b0 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
1a6c0 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
1a6d0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1a6e0 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b, pName);.    i
1a6f0 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
1a700 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1a710 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
1a720 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b  ( pName->z!=0 );
1a730 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
1a740 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
1a750 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
1a760 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
1a770 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1a780 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
1a790 0a 20 20 20 20 69 66 28 20 21 49 4e 5f 52 45 4e  .    if( !IN_REN
1a7a0 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
1a7b0 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
1a7c0 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
1a7d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
1a7e0 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
1a7f0 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)!=0 ){.     
1a800 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1a810 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
1a820 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
1a830 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22   table named %s"
1a840 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
1a850 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1a860 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1a870 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1a880 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
1a890 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
1a8a0 6d 65 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  me, pDb->zDbSNam
1a8b0 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
1a8c0 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74   if( !ifNotExist
1a8d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
1a8e0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1a8f0 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20  arse, "index %s 
1a900 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
1a910 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
1a920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a930 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
1a940 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20  nit.busy );.    
1a950 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
1a960 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
1a970 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
1a980 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f      }.        go
1a990 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1a9a0 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
1a9b0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1a9c0 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65   int n;.    Inde
1a9d0 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f  x *pLoop;.    fo
1a9e0 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49  r(pLoop=pTab->pI
1a9f0 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70  ndex, n=1; pLoop
1aa00 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
1aa10 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  Next, n++){}.   
1aa20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
1aa30 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c  MPrintf(db, "sql
1aa40 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73  ite_autoindex_%s
1aa50 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  _%d", pTab->zNam
1aa60 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a  e, n);.    if( z
1aa70 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
1aa80 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1aa90 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 0a  e_index;.    }..
1aaa0 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63      /* Automatic
1aab0 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 67 65 6e   index names gen
1aac0 65 72 61 74 65 64 20 66 72 6f 6d 20 77 69 74 68  erated from with
1aad0 69 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61  in sqlite3_decla
1aae0 72 65 5f 76 74 61 62 28 29 0a 20 20 20 20 2a 2a  re_vtab().    **
1aaf0 20 6d 75 73 74 20 68 61 76 65 20 6e 61 6d 65 73   must have names
1ab00 20 74 68 61 74 20 61 72 65 20 64 69 73 74 69 6e   that are distin
1ab10 63 74 20 66 72 6f 6d 20 6e 6f 72 6d 61 6c 20 61  ct from normal a
1ab20 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6e  utomatic index n
1ab30 61 6d 65 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65  ames..    ** The
1ab40 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65   following state
1ab50 6d 65 6e 74 20 63 6f 6e 76 65 72 74 73 20 22 73  ment converts "s
1ab60 71 6c 69 74 65 33 5f 61 75 74 6f 69 6e 64 65 78  qlite3_autoindex
1ab70 2e 2e 2e 22 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ..." into.    **
1ab80 20 22 73 71 6c 69 74 65 33 5f 62 75 74 6f 69 6e   "sqlite3_butoin
1ab90 64 65 78 2e 2e 2e 22 20 69 6e 20 6f 72 64 65 72  dex..." in order
1aba0 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d   to make the nam
1abb0 65 73 20 64 69 73 74 69 6e 63 74 2e 0a 20 20 20  es distinct..   
1abc0 20 2a 2a 20 54 68 65 20 22 76 74 61 62 5f 65 72   ** The "vtab_er
1abd0 72 2e 74 65 73 74 22 20 74 65 73 74 20 64 65 6d  r.test" test dem
1abe0 6f 6e 73 74 72 61 74 65 73 20 74 68 65 20 6e 65  onstrates the ne
1abf0 65 64 20 6f 66 20 74 68 69 73 20 73 74 61 74 65  ed of this state
1ac00 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ment. */.    if(
1ac10 20 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53   IN_SPECIAL_PARS
1ac20 45 20 29 20 7a 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a  E ) zName[7]++;.
1ac30 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
1ac40 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  for authorizatio
1ac50 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69  n to create an i
1ac60 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ndex..  */.#ifnd
1ac70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1ac80 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69  UTHORIZATION.  i
1ac90 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  f( !IN_RENAME_OB
1aca0 4a 45 43 54 20 29 7b 0a 20 20 20 20 63 6f 6e 73  JECT ){.    cons
1acb0 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44  t char *zDb = pD
1acc0 62 2d 3e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b->zDbSName;.   
1acd0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1ace0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1acf0 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
1ad00 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
1ad10 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
1ad20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1ad30 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
1ad40 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52     i = SQLITE_CR
1ad50 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20  EATE_INDEX;.    
1ad60 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
1ad70 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d   && iDb==1 ) i =
1ad80 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
1ad90 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
1ada0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1adb0 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a  eck(pParse, i, z
1adc0 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
1add0 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
1ade0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1adf0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
1ae00 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1ae10 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20  If pList==0, it 
1ae20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69  means this routi
1ae30 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ne was called to
1ae40 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a   make a primary.
1ae50 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20    ** key out of 
1ae60 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
1ae70 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
1ae80 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
1ae90 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63  ction..  ** So c
1aea0 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73  reate a fake lis
1aeb0 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68  t to simulate th
1aec0 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  is..  */.  if( p
1aed0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54  List==0 ){.    T
1aee0 6f 6b 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20 20  oken prevCol;.  
1aef0 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
1af00 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61   &pTab->aCol[pTa
1af10 62 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 20 20  b->nCol-1];.    
1af20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
1af30 3d 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45  = COLFLAG_UNIQUE
1af40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b  ;.    sqlite3Tok
1af50 65 6e 49 6e 69 74 28 26 70 72 65 76 43 6f 6c 2c  enInit(&prevCol,
1af60 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
1af70 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
1af80 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
1af90 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20  (pParse, 0,.    
1afa0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1afb0 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
1afc0 4b 5f 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20  K_ID, &prevCol, 
1afd0 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  0));.    if( pLi
1afe0 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  st==0 ) goto exi
1aff0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1b000 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
1b010 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20  t->nExpr==1 );. 
1b020 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
1b030 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 70  stSetSortOrder(p
1b040 4c 69 73 74 2c 20 73 6f 72 74 4f 72 64 65 72 29  List, sortOrder)
1b050 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1b060 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
1b070 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65  eckLength(pParse
1b080 2c 20 70 4c 69 73 74 2c 20 22 69 6e 64 65 78 22  , pList, "index"
1b090 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  );.  }..  /* Fig
1b0a0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
1b0b0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
1b0c0 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
1b0d0 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79  store explicitly
1b0e0 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20  .  ** specified 
1b0f0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1b100 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20  ce names..  */. 
1b110 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1b120 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1b130 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
1b140 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
1b150 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
1b160 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20   pExpr!=0 );.   
1b170 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
1b180 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
1b190 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31      nExtra += (1
1b1a0 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   + sqlite3Strlen
1b1b0 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  30(pExpr->u.zTok
1b1c0 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  en));.    }.  }.
1b1d0 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f  .  /* .  ** Allo
1b1e0 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  cate the index s
1b1f0 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a  tructure. .  */.
1b200 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
1b210 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
1b220 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20  ;.  nExtraCol = 
1b230 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43  pPk ? pPk->nKeyC
1b240 6f 6c 20 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78  ol : 1;.  pIndex
1b250 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61   = sqlite3Alloca
1b260 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62  teIndexObject(db
1b270 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b  , pList->nExpr +
1b280 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20   nExtraCol,.    
1b290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2b0 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61    nName + nExtra
1b2c0 20 2b 20 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a   + 1, &zExtra);.
1b2d0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1b2e0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
1b2f0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1b300 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
1b310 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1b320 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d  LIGNMENT(pIndex-
1b330 3e 61 69 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b  >aiRowLogEst) );
1b340 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
1b350 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
1b360 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20  pIndex->azColl) 
1b370 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  );.  pIndex->zNa
1b380 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a  me = zExtra;.  z
1b390 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b  Extra += nName +
1b3a0 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e   1;.  memcpy(pIn
1b3b0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  dex->zName, zNam
1b3c0 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70  e, nName+1);.  p
1b3d0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20  Index->pTable = 
1b3e0 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  pTab;.  pIndex->
1b3f0 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e  onError = (u8)on
1b400 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d  Error;.  pIndex-
1b410 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f  >uniqNotNull = o
1b420 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b  nError!=OE_None;
1b430 0a 20 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79  .  pIndex->idxTy
1b440 70 65 20 3d 20 69 64 78 54 79 70 65 3b 0a 20 20  pe = idxType;.  
1b450 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20  pIndex->pSchema 
1b460 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
1b470 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e 64 65 78  Schema;.  pIndex
1b480 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c 69 73  ->nKeyCol = pLis
1b490 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  t->nExpr;.  if( 
1b4a0 70 50 49 57 68 65 72 65 20 29 7b 0a 20 20 20 20  pPIWhere ){.    
1b4b0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
1b4c0 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72  lfReference(pPar
1b4d0 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 50 61 72  se, pTab, NC_Par
1b4e0 74 49 64 78 2c 20 70 50 49 57 68 65 72 65 2c 20  tIdx, pPIWhere, 
1b4f0 30 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  0);.    pIndex->
1b500 70 50 61 72 74 49 64 78 57 68 65 72 65 20 3d 20  pPartIdxWhere = 
1b510 70 50 49 57 68 65 72 65 3b 0a 20 20 20 20 70 50  pPIWhere;.    pP
1b520 49 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  IWhere = 0;.  }.
1b530 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1b540 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
1b550 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
1b560 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
1b570 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20  ee if we should 
1b580 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65  honor DESC reque
1b590 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c  sts on index col
1b5a0 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  umns.  */.  if( 
1b5b0 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69  pDb->pSchema->fi
1b5c0 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a  le_format>=4 ){.
1b5d0 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73      sortOrderMas
1b5e0 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e  k = -1;   /* Hon
1b5f0 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c  or DESC */.  }el
1b600 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65  se{.    sortOrde
1b610 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a  rMask = 0;    /*
1b620 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a   Ignore DESC */.
1b630 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a    }..  /* Analyz
1b640 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78  e the list of ex
1b650 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 66  pressions that f
1b660 6f 72 6d 20 74 68 65 20 74 65 72 6d 73 20 6f 66  orm the terms of
1b670 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 0a 20   the index and. 
1b680 20 2a 2a 20 72 65 70 6f 72 74 20 61 6e 79 20 65   ** report any e
1b690 72 72 6f 72 73 2e 20 20 49 6e 20 74 68 65 20 63  rrors.  In the c
1b6a0 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
1b6b0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1b6c0 69 73 20 65 78 61 63 74 6c 79 0a 20 20 2a 2a 20  is exactly.  ** 
1b6d0 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20  a table column, 
1b6e0 73 74 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d  store that colum
1b6f0 6e 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e  n in aiColumn[].
1b700 20 20 46 6f 72 20 67 65 6e 65 72 61 6c 20 65 78    For general ex
1b710 70 72 65 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20  pressions,.  ** 
1b720 70 6f 70 75 6c 61 74 65 20 70 49 6e 64 65 78 2d  populate pIndex-
1b730 3e 61 43 6f 6c 45 78 70 72 20 61 6e 64 20 73 74  >aColExpr and st
1b740 6f 72 65 20 58 4e 5f 45 58 50 52 20 28 2d 32 29  ore XN_EXPR (-2)
1b750 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a   in aiColumn[]..
1b760 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20    **.  ** TODO: 
1b770 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20  Issue a warning 
1b780 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63  if two or more c
1b790 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
1b7a0 64 65 78 20 61 72 65 20 69 64 65 6e 74 69 63 61  dex are identica
1b7b0 6c 2e 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73  l..  ** TODO: Is
1b7c0 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66  sue a warning if
1b7d0 20 74 68 65 20 74 61 62 6c 65 20 70 72 69 6d 61   the table prima
1b7e0 72 79 20 6b 65 79 20 69 73 20 75 73 65 64 20 61  ry key is used a
1b7f0 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20  s part of the.  
1b800 2a 2a 20 69 6e 64 65 78 20 6b 65 79 2e 0a 20 20  ** index key..  
1b810 2a 2f 0a 20 20 70 4c 69 73 74 49 74 65 6d 20 3d  */.  pListItem =
1b820 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 69 66 28   pList->a;.  if(
1b830 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
1b840 54 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  T ){.    pIndex-
1b850 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70 4c 69 73  >aColExpr = pLis
1b860 74 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30  t;.    pList = 0
1b870 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1b880 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43   i<pIndex->nKeyC
1b890 6f 6c 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74  ol; i++, pListIt
1b8a0 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
1b8b0 2a 70 43 45 78 70 72 3b 20 20 20 20 20 20 20 20  *pCExpr;        
1b8c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b8d0 20 69 2d 74 68 20 69 6e 64 65 78 20 65 78 70 72   i-th index expr
1b8e0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e  ession */.    in
1b8f0 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  t requestedSortO
1b900 72 64 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  rder;        /* 
1b910 41 53 43 20 6f 72 20 44 45 53 43 20 6f 6e 20 74  ASC or DESC on t
1b920 68 65 20 69 2d 74 68 20 65 78 70 72 65 73 73 69  he i-th expressi
1b930 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  on */.    const 
1b940 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20  char *zColl;    
1b950 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
1b960 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
1b970 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69  ame */..    sqli
1b980 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70 4c  te3StringToId(pL
1b990 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  istItem->pExpr);
1b9a0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
1b9b0 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65  lveSelfReference
1b9c0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e  (pParse, pTab, N
1b9d0 43 5f 49 64 78 45 78 70 72 2c 20 70 4c 69 73 74  C_IdxExpr, pList
1b9e0 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b  Item->pExpr, 0);
1b9f0 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
1ba00 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69  >nErr ) goto exi
1ba10 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1ba20 20 20 20 20 70 43 45 78 70 72 20 3d 20 73 71 6c      pCExpr = sql
1ba30 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
1ba40 61 74 65 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70  ate(pListItem->p
1ba50 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
1ba60 43 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  CExpr->op!=TK_CO
1ba70 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69 66  LUMN ){.      if
1ba80 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e  ( pTab==pParse->
1ba90 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20  pNewTable ){.   
1baa0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1bab0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65 78  rMsg(pParse, "ex
1bac0 70 72 65 73 73 69 6f 6e 73 20 70 72 6f 68 69 62  pressions prohib
1bad0 69 74 65 64 20 69 6e 20 50 52 49 4d 41 52 59 20  ited in PRIMARY 
1bae0 4b 45 59 20 61 6e 64 20 22 0a 20 20 20 20 20 20  KEY and ".      
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb00 20 20 20 20 20 20 20 20 20 20 22 55 4e 49 51 55            "UNIQU
1bb10 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b  E constraints");
1bb20 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
1bb30 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1bb40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1bb50 66 28 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45  f( pIndex->aColE
1bb60 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  xpr==0 ){.      
1bb70 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78    pIndex->aColEx
1bb80 70 72 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  pr = pList;.    
1bb90 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
1bba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d       }.      j =
1bbb0 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20   XN_EXPR;.      
1bbc0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1bbd0 5b 69 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20  [i] = XN_EXPR;. 
1bbe0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69       pIndex->uni
1bbf0 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  qNotNull = 0;.  
1bc00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a    }else{.      j
1bc10 20 3d 20 70 43 45 78 70 72 2d 3e 69 43 6f 6c 75   = pCExpr->iColu
1bc20 6d 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  mn;.      assert
1bc30 28 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a 20  ( j<=0x7fff );. 
1bc40 20 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a       if( j<0 ){.
1bc50 20 20 20 20 20 20 20 20 6a 20 3d 20 70 54 61 62          j = pTab
1bc60 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 7d  ->iPKey;.      }
1bc70 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 61  else if( pTab->a
1bc80 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  Col[j].notNull==
1bc90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  0 ){.        pIn
1bca0 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  dex->uniqNotNull
1bcb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1bcc0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
1bcd0 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29 6a  lumn[i] = (i16)j
1bce0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c  ;.    }.    zCol
1bcf0 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  l = 0;.    if( p
1bd00 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d  ListItem->pExpr-
1bd10 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
1bd20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  ){.      int nCo
1bd30 6c 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20  ll;.      zColl 
1bd40 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  = pListItem->pEx
1bd50 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
1bd60 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69      nColl = sqli
1bd70 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c  te3Strlen30(zCol
1bd80 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73  l) + 1;.      as
1bd90 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43  sert( nExtra>=nC
1bda0 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  oll );.      mem
1bdb0 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c  cpy(zExtra, zCol
1bdc0 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  l, nColl);.     
1bdd0 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b   zColl = zExtra;
1bde0 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d  .      zExtra +=
1bdf0 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45   nColl;.      nE
1be00 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20  xtra -= nColl;. 
1be10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3e 3d     }else if( j>=
1be20 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  0 ){.      zColl
1be30 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
1be40 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  .zColl;.    }.  
1be50 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a    if( !zColl ) z
1be60 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74  Coll = sqlite3St
1be70 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 69 66 28  rBINARY;.    if(
1be80 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
1be90 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74  && !sqlite3Locat
1bea0 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
1beb0 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
1bec0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1bed0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
1bee0 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c     pIndex->azCol
1bef0 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20  l[i] = zColl;.  
1bf00 20 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f    requestedSortO
1bf10 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d  rder = pListItem
1bf20 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f  ->sortOrder & so
1bf30 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20  rtOrderMask;.   
1bf40 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
1bf50 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72 65 71  der[i] = (u8)req
1bf60 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b  uestedSortOrder;
1bf70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e  .  }..  /* Appen
1bf80 64 20 74 68 65 20 74 61 62 6c 65 20 6b 65 79 20  d the table key 
1bf90 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1bfa0 65 20 69 6e 64 65 78 2e 20 20 46 6f 72 20 57 49  e index.  For WI
1bfb0 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 2a 2a  THOUT ROWID.  **
1bfc0 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50   tables (when pP
1bfd0 6b 21 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20  k!=0) this will 
1bfe0 62 65 20 74 68 65 20 64 65 63 6c 61 72 65 64 20  be the declared 
1bff0 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f  PRIMARY KEY.  Fo
1c000 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 74 61  r.  ** normal ta
1c010 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 3d 3d  bles (when pPk==
1c020 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  0) this will be 
1c030 74 68 65 20 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a  the rowid..  */.
1c040 20 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20    if( pPk ){.   
1c050 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d   for(j=0; j<pPk-
1c060 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  >nKeyCol; j++){.
1c070 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50        int x = pP
1c080 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  k->aiColumn[j];.
1c090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78 3e        assert( x>
1c0a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
1c0b0 68 61 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78  hasColumn(pIndex
1c0c0 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64  ->aiColumn, pInd
1c0d0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29 20  ex->nKeyCol, x) 
1c0e0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
1c0f0 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20  x->nColumn--; . 
1c100 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c110 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
1c120 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20 20  lumn[i] = x;.   
1c130 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43       pIndex->azC
1c140 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a  oll[i] = pPk->az
1c150 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  Coll[j];.       
1c160 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
1c170 64 65 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 53  der[i] = pPk->aS
1c180 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20  ortOrder[j];.   
1c190 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
1c1a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
1c1b0 72 74 28 20 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e  rt( i==pIndex->n
1c1c0 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73  Column );.  }els
1c1d0 65 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  e{.    pIndex->a
1c1e0 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f  iColumn[i] = XN_
1c1f0 52 4f 57 49 44 3b 0a 20 20 20 20 70 49 6e 64 65  ROWID;.    pInde
1c200 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 73  x->azColl[i] = s
1c210 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b  qlite3StrBINARY;
1c220 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
1c230 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64  faultRowEst(pInd
1c240 65 78 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  ex);.  if( pPars
1c250 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20  e->pNewTable==0 
1c260 29 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57  ) estimateIndexW
1c270 69 64 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a 20  idth(pIndex);.. 
1c280 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65   /* If this inde
1c290 78 20 63 6f 6e 74 61 69 6e 73 20 65 76 65 72 79  x contains every
1c2a0 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 74 73 20 74   column of its t
1c2b0 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 72 6b 0a  able, then mark.
1c2c0 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 6f 76    ** it as a cov
1c2d0 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  ering index */. 
1c2e0 20 61 73 73 65 72 74 28 20 48 61 73 52 6f 77 69   assert( HasRowi
1c2f0 64 28 70 54 61 62 29 20 0a 20 20 20 20 20 20 7c  d(pTab) .      |
1c300 7c 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20  | pTab->iPKey<0 
1c310 7c 7c 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  || sqlite3Column
1c320 4f 66 49 6e 64 65 78 28 70 49 6e 64 65 78 2c 20  OfIndex(pIndex, 
1c330 70 54 61 62 2d 3e 69 50 4b 65 79 29 3e 3d 30 20  pTab->iPKey)>=0 
1c340 29 3b 0a 20 20 72 65 63 6f 6d 70 75 74 65 43 6f  );.  recomputeCo
1c350 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28  lumnsNotIndexed(
1c360 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 70  pIndex);.  if( p
1c370 54 62 6c 4e 61 6d 65 21 3d 30 20 26 26 20 70 49  TblName!=0 && pI
1c380 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70  ndex->nColumn>=p
1c390 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
1c3a0 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72   pIndex->isCover
1c3b0 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72  ing = 1;.    for
1c3c0 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
1c3d0 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
1c3e0 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b  if( j==pTab->iPK
1c3f0 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ey ) continue;. 
1c400 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1c410 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
1c420 6e 64 65 78 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e  ndex,j)>=0 ) con
1c430 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 49 6e  tinue;.      pIn
1c440 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  dex->isCovering 
1c450 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
1c460 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1c470 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d  f( pTab==pParse-
1c480 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20  >pNewTable ){.  
1c490 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
1c4a0 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  e has been calle
1c4b0 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61  d to create an a
1c4c0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61  utomatic index a
1c4d0 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  s a.    ** resul
1c4e0 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b  t of a PRIMARY K
1c4f0 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
1c500 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20  use on a column 
1c510 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20  definition, or. 
1c520 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20     ** a PRIMARY 
1c530 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
1c540 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ause following t
1c550 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69  he column defini
1c560 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e  tions..    ** i.
1c570 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a  e. one of:.    *
1c580 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  *.    ** CREATE 
1c590 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52  TABLE t(x PRIMAR
1c5a0 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a  Y KEY, y);.    *
1c5b0 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
1c5c0 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c  (x, y, UNIQUE(x,
1c5d0 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20   y));.    **.   
1c5e0 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20   ** Either way, 
1c5f0 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
1c600 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
1c610 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e  y has such an in
1c620 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73  dex. If.    ** s
1c630 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20  o, don't bother 
1c640 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e  creating this on
1c650 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70  e. This only app
1c660 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61  lies to.    ** a
1c670 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65  utomatically cre
1c680 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73  ated indices. Us
1c690 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68  ers can do as th
1c6a0 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20  ey wish with.   
1c6b0 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64   ** explicit ind
1c6c0 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ices..    **.   
1c6d0 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f   ** Two UNIQUE o
1c6e0 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
1c6f0 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f  nstraints are co
1c700 6e 73 69 64 65 72 65 64 20 65 71 75 69 76 61 6c  nsidered equival
1c710 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20  ent.    ** (and 
1c720 74 68 75 73 20 73 75 70 70 72 65 73 73 69 6e 67  thus suppressing
1c730 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29   the second one)
1c740 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 68 61   even if they ha
1c750 76 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20  ve different.   
1c760 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e   ** sort orders.
1c770 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1c780 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66  f there are diff
1c790 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20  erent collating 
1c7a0 73 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20  sequences or if 
1c7b0 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20  the columns of. 
1c7c0 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72     ** the constr
1c7d0 61 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69  aint occur in di
1c7e0 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20  fferent orders, 
1c7f0 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61  then the constra
1c800 69 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  ints are.    ** 
1c810 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74 69  considered disti
1c820 6e 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73  nct and both res
1c830 75 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65 20  ult in separate 
1c840 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a  indices..    */.
1c850 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
1c860 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
1c870 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
1c880 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
1c890 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  xt){.      int k
1c8a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c8b0 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
1c8c0 64 78 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  dx) );.      ass
1c8d0 65 72 74 28 20 70 49 64 78 2d 3e 69 64 78 54 79  ert( pIdx->idxTy
1c8e0 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe!=SQLITE_IDXTY
1c8f0 50 45 5f 41 50 50 44 45 46 20 29 3b 0a 20 20 20  PE_APPDEF );.   
1c900 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e 69     assert( IsUni
1c910 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  queIndex(pIndex)
1c920 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70   );..      if( p
1c930 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49  Idx->nKeyCol!=pI
1c940 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20  ndex->nKeyCol ) 
1c950 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1c960 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d  for(k=0; k<pIdx-
1c970 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a  >nKeyCol; k++){.
1c980 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1c990 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20  ar *z1;.        
1c9a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a  const char *z2;.
1c9b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1c9c0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
1c9d0 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ]>=0 );.        
1c9e0 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
1c9f0 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61  mn[k]!=pIndex->a
1ca00 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65  iColumn[k] ) bre
1ca10 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d  ak;.        z1 =
1ca20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d   pIdx->azColl[k]
1ca30 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70  ;.        z2 = p
1ca40 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d  Index->azColl[k]
1ca50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
1ca60 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c  lite3StrICmp(z1,
1ca70 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20   z2) ) break;.  
1ca80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1ca90 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  k==pIdx->nKeyCol
1caa0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1cab0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70  pIdx->onError!=p
1cac0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29  Index->onError )
1cad0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
1cae0 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  his constraint c
1caf0 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20  reates the same 
1cb00 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69  index as a previ
1cb10 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ous.          **
1cb20 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63   constraint spec
1cb30 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20  ified somewhere 
1cb40 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41  in the CREATE TA
1cb50 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  BLE statement.. 
1cb60 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65           ** Howe
1cb70 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c  ver the ON CONFL
1cb80 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20  ICT clauses are 
1cb90 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f  different. If bo
1cba0 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  th this .       
1cbb0 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
1cbc0 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75   and the previou
1cbd0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e  s equivalent con
1cbe0 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70  straint have exp
1cbf0 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20  licit.          
1cc00 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ** ON CONFLICT c
1cc10 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61  lauses this is a
1cc20 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69  n error. Otherwi
1cc30 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20  se, use the.    
1cc40 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69        ** explici
1cc50 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65  tly specified be
1cc60 68 61 76 69 6f 72 20 66 6f 72 20 74 68 65 20 69  havior for the i
1cc70 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20  ndex..          
1cc80 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1cc90 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72   !(pIdx->onError
1cca0 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20  ==OE_Default || 
1ccb0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
1ccc0 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a  =OE_Default) ){.
1ccd0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1cce0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1ccf0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
1cd00 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e       "conflictin
1cd10 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  g ON CONFLICT cl
1cd20 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22  auses specified"
1cd30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1cd40 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
1cd50 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
1cd60 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  E_Default ){.   
1cd70 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f           pIdx->o
1cd80 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d  nError = pIndex-
1cd90 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  >onError;.      
1cda0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1cdb0 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78 54          if( idxT
1cdc0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54  ype==SQLITE_IDXT
1cdd0 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29  YPE_PRIMARYKEY )
1cde0 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 20 3d   pIdx->idxType =
1cdf0 20 69 64 78 54 79 70 65 3b 0a 20 20 20 20 20 20   idxType;.      
1ce00 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
1ce10 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20  OBJECT ){.      
1ce20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
1ce30 74 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  t = pParse->pNew
1ce40 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20  Index;.         
1ce50 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64   pParse->pNewInd
1ce60 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  ex = pIndex;.   
1ce70 20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20         pIndex = 
1ce80 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
1ce90 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1cea0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1ceb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1cec0 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45    if( !IN_RENAME
1ced0 5f 4f 42 4a 45 43 54 20 29 7b 0a 0a 20 20 20 20  _OBJECT ){..    
1cee0 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
1cef0 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
1cf00 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64  to its table and
1cf10 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20   to the other.  
1cf20 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    ** in-memory d
1cf30 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
1cf40 65 73 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  es. .    */.    
1cf50 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1cf60 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 69  nErr==0 );.    i
1cf70 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1cf80 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   ){.      Index 
1cf90 2a 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  *p;.      assert
1cfa0 28 20 21 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41  ( !IN_SPECIAL_PA
1cfb0 52 53 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  RSE );.      ass
1cfc0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
1cfd0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
1cfe0 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  0, pIndex->pSche
1cff0 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ma) );.      if(
1d000 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
1d010 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1d020 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
1d030 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 20 20 20  newTnum;.       
1d040 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65   if( sqlite3Inde
1d050 78 48 61 73 44 75 70 6c 69 63 61 74 65 52 6f 6f  xHasDuplicateRoo
1d060 74 50 61 67 65 28 70 49 6e 64 65 78 29 20 29 7b  tPage(pIndex) ){
1d070 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1d080 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1d090 65 2c 20 22 69 6e 76 61 6c 69 64 20 72 6f 6f 74  e, "invalid root
1d0a0 70 61 67 65 22 29 3b 0a 20 20 20 20 20 20 20 20  page");.        
1d0b0 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
1d0c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1d0d0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
1d0e0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1d0f0 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ndex;.        }.
1d100 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 20        }.      p 
1d110 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
1d120 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63  ert(&pIndex->pSc
1d130 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a  hema->idxHash, .
1d140 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78            pIndex
1d150 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 29  ->zName, pIndex)
1d160 3b 0a 20 20 20 20 20 20 69 66 28 20 70 20 29 7b  ;.      if( p ){
1d170 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1d180 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f   p==pIndex );  /
1d190 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
1d1a0 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  ve failed */.   
1d1b0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
1d1c0 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20  ault(db);.      
1d1d0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1d1e0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
1d1f0 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6d 44 62 46  }.      db->mDbF
1d200 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53  lags |= DBFLAG_S
1d210 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 20  chemaChange;.   
1d220 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1d230 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  is is the initia
1d240 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  l CREATE INDEX s
1d250 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45  tatement (or CRE
1d260 41 54 45 20 54 41 42 4c 45 20 69 66 20 74 68 65  ATE TABLE if the
1d270 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 69 73  .    ** index is
1d280 20 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65   an implied inde
1d290 78 20 66 6f 72 20 61 20 55 4e 49 51 55 45 20 6f  x for a UNIQUE o
1d2a0 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
1d2b0 6e 73 74 72 61 69 6e 74 29 20 74 68 65 6e 0a 20  nstraint) then. 
1d2c0 20 20 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20     ** emit code 
1d2d0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  to allocate the 
1d2e0 69 6e 64 65 78 20 72 6f 6f 74 70 61 67 65 20 6f  index rootpage o
1d2f0 6e 20 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20  n disk and make 
1d300 61 6e 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20  an entry for.   
1d310 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 6e   ** the index in
1d320 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
1d330 65 72 20 74 61 62 6c 65 20 61 6e 64 20 70 6f 70  er table and pop
1d340 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ulate the index 
1d350 77 69 74 68 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  with.    ** cont
1d360 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f  ent.  But, do no
1d370 74 20 64 6f 20 74 68 69 73 20 69 66 20 77 65 20  t do this if we 
1d380 61 72 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69  are simply readi
1d390 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
1d3a0 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c  ster.    ** tabl
1d3b0 65 20 74 6f 20 70 61 72 73 65 20 74 68 65 20 73  e to parse the s
1d3c0 63 68 65 6d 61 2c 20 6f 72 20 69 66 20 74 68 69  chema, or if thi
1d3d0 73 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 50  s index is the P
1d3e0 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
1d3f0 0a 20 20 20 20 2a 2a 20 6f 66 20 61 20 57 49 54  .    ** of a WIT
1d400 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
1d410 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1d420 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69  If pTblName==0 i
1d430 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64  t means this ind
1d440 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ex is generated 
1d450 61 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52  as an implied PR
1d460 49 4d 41 52 59 20 4b 45 59 0a 20 20 20 20 2a 2a  IMARY KEY.    **
1d470 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78   or UNIQUE index
1d480 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
1d490 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
1d4a0 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
1d4b0 20 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62     ** has just b
1d4c0 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20  een created, it 
1d4d0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
1d4e0 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
1d4f0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
1d500 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65    ** step can be
1d510 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f   skipped..    */
1d520 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 48 61  .    else if( Ha
1d530 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20  sRowid(pTab) || 
1d540 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  pTblName!=0 ){. 
1d550 20 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20       Vdbe *v;.  
1d560 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
1d570 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20  .      int iMem 
1d580 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1d590 3b 0a 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c  ;..      v = sql
1d5a0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1d5b0 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76  se);.      if( v
1d5c0 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
1d5d0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20  create_index;.. 
1d5e0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
1d5f0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
1d600 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
1d610 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  ..      /* Creat
1d620 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  e the rootpage f
1d630 6f 72 20 74 68 65 20 69 6e 64 65 78 20 75 73 69  or the index usi
1d640 6e 67 20 43 72 65 61 74 65 49 6e 64 65 78 2e 20  ng CreateIndex. 
1d650 42 75 74 20 62 65 66 6f 72 65 0a 20 20 20 20 20  But before.     
1d660 20 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f   ** doing so, co
1d670 64 65 20 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75  de a Noop instru
1d680 63 74 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20  ction and store 
1d690 69 74 73 20 61 64 64 72 65 73 73 20 69 6e 20 0a  its address in .
1d6a0 20 20 20 20 20 20 2a 2a 20 49 6e 64 65 78 2e 74        ** Index.t
1d6b0 6e 75 6d 2e 20 54 68 69 73 20 69 73 20 72 65 71  num. This is req
1d6c0 75 69 72 65 64 20 69 6e 20 63 61 73 65 20 74 68  uired in case th
1d6d0 69 73 20 69 6e 64 65 78 20 69 73 20 61 63 74 75  is index is actu
1d6e0 61 6c 6c 79 20 61 20 0a 20 20 20 20 20 20 2a 2a  ally a .      **
1d6f0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64   PRIMARY KEY and
1d700 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 63   the table is ac
1d710 74 75 61 6c 6c 79 20 61 20 57 49 54 48 4f 55 54  tually a WITHOUT
1d720 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 49 6e   ROWID table. In
1d730 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20   .      ** that 
1d740 63 61 73 65 20 74 68 65 20 63 6f 6e 76 65 72 74  case the convert
1d750 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61  ToWithoutRowidTa
1d760 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 20 77 69  ble() routine wi
1d770 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20  ll replace.     
1d780 20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69 74   ** the Noop wit
1d790 68 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70  h a Goto to jump
1d7a0 20 6f 76 65 72 20 74 68 65 20 56 44 42 45 20 63   over the VDBE c
1d7b0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 65  ode generated be
1d7c0 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49  low. */.      pI
1d7d0 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c  ndex->tnum = sql
1d7e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
1d7f0 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20  , OP_Noop);.    
1d800 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d810 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  Op3(v, OP_Create
1d820 42 74 72 65 65 2c 20 69 44 62 2c 20 69 4d 65 6d  Btree, iDb, iMem
1d830 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29  , BTREE_BLOBKEY)
1d840 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 61 74 68  ;..      /* Gath
1d850 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  er the complete 
1d860 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
1d870 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
1d880 6e 74 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a  nt into.      **
1d890 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61   the zStmt varia
1d8a0 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ble.      */.   
1d8b0 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b     if( pStart ){
1d8c0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
1d8d0 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e 73   (int)(pParse->s
1d8e0 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e  LastToken.z - pN
1d8f0 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65  ame->z) + pParse
1d900 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a  ->sLastToken.n;.
1d910 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d          if( pNam
1d920 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29  e->z[n-1]==';' )
1d930 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 2f 2a   n--;.        /*
1d940 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77   A named index w
1d950 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20  ith an explicit 
1d960 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
1d970 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  tement */.      
1d980 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
1d990 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52  3MPrintf(db, "CR
1d9a0 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a  EATE%s INDEX %.*
1d9b0 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
1d9c0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
1d9d0 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45   ? "" : " UNIQUE
1d9e0 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b  ", n, pName->z);
1d9f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1da00 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f        /* An auto
1da10 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61  matic index crea
1da20 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52 59  ted by a PRIMARY
1da30 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
1da40 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
1da50 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20       /* zStmt = 
1da60 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
1da70 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a  "); */.        z
1da80 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1da90 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20  }..      /* Add 
1daa0 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69  an entry in sqli
1dab0 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68  te_master for th
1dac0 69 73 20 69 6e 64 65 78 0a 20 20 20 20 20 20 2a  is index.      *
1dad0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  /.      sqlite3N
1dae0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
1daf0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 49  e, .          "I
1db00 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73  NSERT INTO %Q.%s
1db10 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c   VALUES('index',
1db20 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c  %Q,%Q,#%d,%Q);",
1db30 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61  .          db->a
1db40 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
1db50 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20  , MASTER_NAME,. 
1db60 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d           pIndex-
1db70 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
1db80 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
1db90 20 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20           iMem,. 
1dba0 20 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20           zStmt. 
1dbb0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
1dbc0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1dbd0 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20  db, zStmt);..   
1dbe0 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69     /* Fill the i
1dbf0 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20 61  ndex with data a
1dc00 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20 73  nd reparse the s
1dc10 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f  chema. Code an O
1dc20 50 5f 45 78 70 69 72 65 0a 20 20 20 20 20 20 2a  P_Expire.      *
1dc30 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
1dc40 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64  all pre-compiled
1dc50 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20   statements..   
1dc60 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1dc70 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pTblName ){.    
1dc80 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
1dc90 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
1dca0 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20  Index, iMem);.  
1dcb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61        sqlite3Cha
1dcc0 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
1dcd0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
1dce0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61  sqlite3VdbeAddPa
1dcf0 72 73 65 53 63 68 65 6d 61 4f 70 28 70 50 61 72  rseSchemaOp(pPar
1dd00 73 65 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  se, iDb,.       
1dd10 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
1dd20 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25  ntf(db, "name='%
1dd30 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64  q' AND type='ind
1dd40 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  ex'", pIndex->zN
1dd50 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 73  ame));.        s
1dd60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1dd70 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30  (v, OP_Expire, 0
1dd80 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 1);.      }.. 
1dd90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1dda0 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 64  JumpHere(v, pInd
1ddb0 65 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 7d  ex->tnum);.    }
1ddc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
1ddd0 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  adding an index 
1dde0 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
1ddf0 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62  ndices for a tab
1de00 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75  le, make.  ** su
1de10 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c  re all indices l
1de20 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63  abeled OE_Replac
1de30 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c  e come after all
1de40 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20   those labeled. 
1de50 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20   ** OE_Ignore.  
1de60 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
1de70 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63  y for the correc
1de80 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65  t constraint che
1de90 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69  ck.  ** processi
1dea0 6e 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65  ng (in sqlite3Ge
1deb0 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  nerateConstraint
1dec0 43 68 65 63 6b 73 28 29 29 20 61 73 20 70 61 72  Checks()) as par
1ded0 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45  t of.  ** UPDATE
1dee0 20 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74   and INSERT stat
1def0 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20  ements.  .  */. 
1df00 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
1df10 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d  sy || pTblName==
1df20 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45  0 ){.    if( onE
1df30 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
1df40 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
1df50 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
1df60 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e  pTab->pIndex->on
1df70 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
1df80 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  e){.      pIndex
1df90 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e  ->pNext = pTab->
1dfa0 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54  pIndex;.      pT
1dfb0 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  ab->pIndex = pIn
1dfc0 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dex;.    }else{.
1dfd0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74        Index *pOt
1dfe0 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  her = pTab->pInd
1dff0 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ex;.      while(
1e000 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26   pOther->pNext &
1e010 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d  & pOther->pNext-
1e020 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70  >onError!=OE_Rep
1e030 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lace ){.        
1e040 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d  pOther = pOther-
1e050 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
1e060 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
1e070 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  ext = pOther->pN
1e080 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65  ext;.      pOthe
1e090 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  r->pNext = pInde
1e0a0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
1e0b0 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 65  dex = 0;.  }.  e
1e0c0 6c 73 65 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d  lse if( IN_RENAM
1e0d0 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
1e0e0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1e0f0 70 4e 65 77 49 6e 64 65 78 3d 3d 30 20 29 3b 0a  pNewIndex==0 );.
1e100 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
1e110 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
1e120 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
1e130 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
1e140 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  up before exitin
1e150 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65  g */.exit_create
1e160 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49  _index:.  if( pI
1e170 6e 64 65 78 20 29 20 73 71 6c 69 74 65 33 46 72  ndex ) sqlite3Fr
1e180 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  eeIndex(db, pInd
1e190 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ex);.  sqlite3Ex
1e1a0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 50 49  prDelete(db, pPI
1e1b0 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
1e1c0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
1e1d0 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71  db, pList);.  sq
1e1e0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1e1f0 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29  te(db, pTblName)
1e200 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1e210 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a  e(db, zName);.}.
1e220 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20  ./*.** Fill the 
1e230 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d  Index.aiRowEst[]
1e240 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61   array with defa
1e250 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ult information 
1e260 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  - information.**
1e270 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e   to be used when
1e280 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e   we have not run
1e290 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d   the ANALYZE com
1e2a0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f  mand..**.** aiRo
1e2b0 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f  wEst[0] is suppo
1e2c0 73 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  sed to contain t
1e2d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
1e2e0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64  ments in the ind
1e2f0 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20  ex..** Since we 
1e300 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65  do not know, gue
1e310 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61  ss 1 million.  a
1e320 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e  iRowEst[1] is an
1e330 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
1e340 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
1e350 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
1e360 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70  that match any p
1e370 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20  articular value 
1e380 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  of the.** first 
1e390 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
1e3a0 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32  dex.  aiRowEst[2
1e3b0 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  ] is an estimate
1e3c0 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a   of the number.*
1e3d0 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d  * of rows that m
1e3e0 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
1e3f0 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  lar combination 
1e400 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63  of the first 2 c
1e410 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65  olumns.** of the
1e420 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20   index.  And so 
1e430 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20  forth.  It must 
1e440 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61  always be the ca
1e450 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20  se that.*.**    
1e460 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
1e470 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31  N]<=aiRowEst[N-1
1e480 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  ].**           a
1e490 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a  iRowEst[N]>=1.**
1e4a0 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74  .** Apart from t
1e4b0 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74  hat, we have lit
1e4c0 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73  tle to go on bes
1e4d0 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61  ides intuition a
1e4e0 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f  s to.** how aiRo
1e4f0 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65  wEst[] should be
1e500 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54   initialized.  T
1e510 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72  he numbers gener
1e520 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65  ated here.** are
1e530 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61   based on typica
1e540 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69  l values found i
1e550 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73  n actual indices
1e560 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1e570 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49  3DefaultRowEst(I
1e580 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f  ndex *pIdx){.  /
1e590 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1e5a0 20 31 30 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c   10,  9,  8,  7,
1e5b0 20 20 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20    6 */.  LogEst 
1e5c0 61 56 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33  aVal[] = { 33, 3
1e5d0 32 2c 20 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b  2, 30, 28, 26 };
1e5e0 0a 20 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70  .  LogEst *a = p
1e5f0 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  Idx->aiRowLogEst
1e600 3b 0a 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20  ;.  int nCopy = 
1e610 4d 49 4e 28 41 72 72 61 79 53 69 7a 65 28 61 56  MIN(ArraySize(aV
1e620 61 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  al), pIdx->nKeyC
1e630 6f 6c 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  ol);.  int i;.. 
1e640 20 2f 2a 20 49 6e 64 65 78 65 73 20 77 69 74 68   /* Indexes with
1e650 20 64 65 66 61 75 6c 74 20 72 6f 77 20 65 73 74   default row est
1e660 69 6d 61 74 65 73 20 73 68 6f 75 6c 64 20 6e 6f  imates should no
1e670 74 20 68 61 76 65 20 73 74 61 74 31 20 64 61 74  t have stat1 dat
1e680 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  a */.  assert( !
1e690 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20 29  pIdx->hasStat1 )
1e6a0 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
1e6b0 66 69 72 73 74 20 65 6e 74 72 79 20 28 6e 75 6d  first entry (num
1e6c0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1e6d0 68 65 20 69 6e 64 65 78 29 20 74 6f 20 74 68 65  he index) to the
1e6e0 20 65 73 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a   estimated .  **
1e6f0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1e700 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 6f 72  in the table, or
1e710 20 68 61 6c 66 20 74 68 65 20 6e 75 6d 62 65 72   half the number
1e720 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1e730 74 61 62 6c 65 0a 20 20 2a 2a 20 66 6f 72 20 61  table.  ** for a
1e740 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 20   partial index. 
1e750 20 20 42 75 74 20 64 6f 20 6e 6f 74 20 6c 65 74    But do not let
1e760 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 64 72   the estimate dr
1e770 6f 70 20 62 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a  op below 10. */.
1e780 20 20 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70    a[0] = pIdx->p
1e790 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73  Table->nRowLogEs
1e7a0 74 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 70  t;.  if( pIdx->p
1e7b0 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 20  PartIdxWhere!=0 
1e7c0 29 20 61 5b 30 5d 20 2d 3d 20 31 30 3b 20 20 61  ) a[0] -= 10;  a
1e7d0 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74  ssert( 10==sqlit
1e7e0 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20  e3LogEst(2) );. 
1e7f0 20 69 66 28 20 61 5b 30 5d 3c 33 33 20 29 20 61   if( a[0]<33 ) a
1e800 5b 30 5d 20 3d 20 33 33 3b 20 20 20 20 20 20 20  [0] = 33;       
1e810 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1e820 74 28 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 33==sqlite3Lo
1e830 67 45 73 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f  gEst(10) );..  /
1e840 2a 20 45 73 74 69 6d 61 74 65 20 74 68 61 74 20  * Estimate that 
1e850 61 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d  a[1] is 10, a[2]
1e860 20 69 73 20 39 2c 20 61 5b 33 5d 20 69 73 20 38   is 9, a[3] is 8
1e870 2c 20 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35  , a[4] is 7, a[5
1e880 5d 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20  ] is.  ** 6 and 
1e890 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20  each subsequent 
1e8a0 76 61 6c 75 65 20 28 69 66 20 61 6e 79 29 20 69  value (if any) i
1e8b0 73 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70  s 5.  */.  memcp
1e8c0 79 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e  y(&a[1], aVal, n
1e8d0 43 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45  Copy*sizeof(LogE
1e8e0 73 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43  st));.  for(i=nC
1e8f0 6f 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e  opy+1; i<=pIdx->
1e900 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nKeyCol; i++){. 
1e910 20 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20     a[i] = 23;   
1e920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e930 20 61 73 73 65 72 74 28 20 32 33 3d 3d 73 71 6c   assert( 23==sql
1e940 69 74 65 33 4c 6f 67 45 73 74 28 35 29 20 29 3b  ite3LogEst(5) );
1e950 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1e960 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
1e970 28 31 29 20 29 3b 0a 20 20 69 66 28 20 49 73 55  (1) );.  if( IsU
1e980 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
1e990 20 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43   ) a[pIdx->nKeyC
1e9a0 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ol] = 0;.}../*.*
1e9b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
1e9c0 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73  ill drop an exis
1e9d0 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78  ting named index
1e9e0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
1e9f0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** implements th
1ea00 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61  e DROP INDEX sta
1ea10 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
1ea20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78  sqlite3DropIndex
1ea30 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1ea40 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
1ea50 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20  int ifExists){. 
1ea60 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
1ea70 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
1ea80 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1ea90 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
1eaa0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1eab0 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20  rse->nErr==0 ); 
1eac0 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65    /* Never calle
1ead0 64 20 77 69 74 68 20 70 72 69 6f 72 20 65 72 72  d with prior err
1eae0 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ors */.  if( db-
1eaf0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1eb00 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
1eb10 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
1eb20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
1eb30 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nSrc==1 );.  if(
1eb40 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
1eb50 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
1eb60 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  arse) ){.    got
1eb70 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1eb80 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20  x;.  }.  pIndex 
1eb90 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
1eba0 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b  ex(db, pName->a[
1ebb0 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  0].zName, pName-
1ebc0 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
1ebd0 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d  ;.  if( pIndex==
1ebe0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66  0 ){.    if( !if
1ebf0 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  Exists ){.      
1ec00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1ec10 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1ec20 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61   index: %S", pNa
1ec30 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  me, 0);.    }els
1ec40 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1ec50 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53  CodeVerifyNamedS
1ec60 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e  chema(pParse, pN
1ec70 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
1ec80 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ase);.    }.    
1ec90 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
1eca0 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74  ema = 1;.    got
1ecb0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1ecc0 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  x;.  }.  if( pIn
1ecd0 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51  dex->idxType!=SQ
1ece0 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50  LITE_IDXTYPE_APP
1ecf0 44 45 46 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  DEF ){.    sqlit
1ed00 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1ed10 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69  e, "index associ
1ed20 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45  ated with UNIQUE
1ed30 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49   ".      "or PRI
1ed40 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
1ed50 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72  int cannot be dr
1ed60 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  opped", 0);.    
1ed70 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1ed80 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20  ndex;.  }.  iDb 
1ed90 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
1eda0 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  oIndex(db, pInde
1edb0 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73  x->pSchema);.  s
1edc0 71 6c 69 74 65 33 53 63 68 65 6d 61 57 72 69 74  qlite3SchemaWrit
1edd0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62  able(pParse, iDb
1ede0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1edf0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
1ee00 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
1ee10 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
1ee20 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54  ROP_INDEX;.    T
1ee30 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
1ee40 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  dex->pTable;.   
1ee50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1ee60 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
1ee70 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  zDbSName;.    co
1ee80 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
1ee90 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
1eea0 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  b);.    if( sqli
1eeb0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1eec0 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
1eed0 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
1eee0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
1eef0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1ef00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
1ef10 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
1ef20 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49  Db ) code = SQLI
1ef30 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
1ef40 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
1ef50 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1ef60 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65  rse, code, pInde
1ef70 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  x->zName, pTab->
1ef80 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
1ef90 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
1efa0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
1efb0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1efc0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1efd0 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  to remove the in
1efe0 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65  dex and from the
1eff0 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f   master table */
1f000 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1f010 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1f020 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
1f030 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1f040 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
1f050 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   1, iDb);.    sq
1f060 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
1f070 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
1f080 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
1f090 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  %s WHERE name=%Q
1f0a0 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78   AND type='index
1f0b0 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61  '",.       db->a
1f0c0 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
1f0d0 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70  , MASTER_NAME, p
1f0e0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20  Index->zName.   
1f0f0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   );.    sqlite3C
1f100 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
1f110 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78  Parse, iDb, "idx
1f120 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ", pIndex->zName
1f130 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
1f140 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
1f150 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73  e, iDb);.    des
1f160 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
1f170 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  rse, pIndex->tnu
1f180 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  m, iDb);.    sql
1f190 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1f1a0 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20  , OP_DropIndex, 
1f1b0 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65  iDb, 0, 0, pInde
1f1c0 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  x->zName, 0);.  
1f1d0 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  }..exit_drop_ind
1f1e0 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  ex:.  sqlite3Src
1f1f0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1f200 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
1f210 70 41 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e  pArray is a poin
1f220 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20  ter to an array 
1f230 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68  of objects. Each
1f240 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a   object in the.*
1f250 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74  * array is szEnt
1f260 72 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ry bytes in size
1f270 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  . This routine u
1f280 73 65 73 20 73 71 6c 69 74 65 33 44 62 52 65 61  ses sqlite3DbRea
1f290 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74  lloc().** to ext
1f2a0 65 6e 64 20 74 68 65 20 61 72 72 61 79 20 73 6f  end the array so
1f2b0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73   that there is s
1f2c0 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f  pace for a new o
1f2d0 62 6a 65 63 74 20 61 74 20 74 68 65 20 65 6e 64  bject at the end
1f2e0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1f2f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1f300 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63  lled, *pnEntry c
1f310 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 75 72 72  ontains the curr
1f320 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74  ent size of.** t
1f330 68 65 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74  he array (in ent
1f340 72 69 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c  ries - so the al
1f350 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70  location is ((*p
1f360 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72  nEntry) * szEntr
1f370 79 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74  y) bytes.** in t
1f380 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  otal)..**.** If 
1f390 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73  the realloc() is
1f3a0 20 73 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65   successful (i.e
1f3b0 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64  . if no OOM cond
1f3c0 69 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74  ition occurs), t
1f3d0 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f  he.** space allo
1f3e0 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65  cated for the ne
1f3f0 77 20 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f  w object is zero
1f400 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64  ed, *pnEntry upd
1f410 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65  ated to.** refle
1f420 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20  ct the new size 
1f430 6f 66 20 74 68 65 20 61 72 72 61 79 20 61 6e 64  of the array and
1f440 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1f450 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
1f460 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70  .** returned. *p
1f470 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  Idx is set to th
1f480 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
1f490 65 77 20 61 72 72 61 79 20 65 6e 74 72 79 20 69  ew array entry i
1f4a0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
1f4b0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
1f4c0 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66   the realloc() f
1f4d0 61 69 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73  ails, *pIdx is s
1f4e0 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74  et to -1, *pnEnt
1f4f0 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e  ry remains.** un
1f500 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f  changed and a co
1f510 70 79 20 6f 66 20 70 41 72 72 61 79 20 72 65 74  py of pArray ret
1f520 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  urned..*/.void *
1f530 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
1f540 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20  cate(.  sqlite3 
1f550 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  *db,      /* Con
1f560 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
1f570 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  y of malloc fail
1f580 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ures */.  void *
1f590 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41  pArray,     /* A
1f5a0 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e  rray of objects.
1f5b0 20 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c    Might be reall
1f5c0 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ocated */.  int 
1f5d0 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a  szEntry,      /*
1f5e0 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62   Size of each ob
1f5f0 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72 72 61  ject in the arra
1f600 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e  y */.  int *pnEn
1f610 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  try,     /* Numb
1f620 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75  er of objects cu
1f630 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a  rrently in use *
1f640 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20  /.  int *pIdx   
1f650 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1f660 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65  he index of a ne
1f670 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29  w slot here */.)
1f680 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  {.  char *z;.  i
1f690 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b  nt n = *pnEntry;
1f6a0 0a 20 20 69 66 28 20 28 6e 20 26 20 28 6e 2d 31  .  if( (n & (n-1
1f6b0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))==0 ){.    int
1f6c0 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31   sz = (n==0) ? 1
1f6d0 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64   : 2*n;.    void
1f6e0 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
1f6f0 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41  DbRealloc(db, pA
1f700 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79  rray, sz*szEntry
1f710 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
1f720 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64  =0 ){.      *pId
1f730 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  x = -1;.      re
1f740 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20  turn pArray;.   
1f750 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20   }.    pArray = 
1f760 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  pNew;.  }.  z = 
1f770 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20  (char*)pArray;. 
1f780 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73   memset(&z[n * s
1f790 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e  zEntry], 0, szEn
1f7a0 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  try);.  *pIdx = 
1f7b0 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b  n;.  ++*pnEntry;
1f7c0 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79  .  return pArray
1f7d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1f7e0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
1f7f0 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c  to the given IdL
1f800 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
1f810 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20  ew IdList if.** 
1f820 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41  need be..**.** A
1f830 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72   new IdList is r
1f840 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
1f850 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
1f860 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  ls..*/.IdList *s
1f870 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
1f880 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nd(Parse *pParse
1f890 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  , IdList *pList,
1f8a0 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
1f8b0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1f8c0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1f8d0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1f8e0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
1f8f0 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
1f900 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
1f910 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
1f920 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1f930 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1f940 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69   pList->a = sqli
1f950 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
1f960 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  (.      db,.    
1f970 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20    pList->a,.    
1f980 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e    sizeof(pList->
1f990 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c  a[0]),.      &pL
1f9a0 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20  ist->nId,.      
1f9b0 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c  &i.  );.  if( i<
1f9c0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1f9d0 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
1f9e0 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74   pList);.    ret
1f9f0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  urn 0;.  }.  pLi
1fa00 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
1fa10 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1fa20 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e  Token(db, pToken
1fa30 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41  );.  if( IN_RENA
1fa40 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20 70 4c 69  ME_OBJECT && pLi
1fa50 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  st->a[i].zName )
1fa60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e  {.    sqlite3Ren
1fa70 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72  ameTokenMap(pPar
1fa80 73 65 2c 20 28 76 6f 69 64 2a 29 70 4c 69 73 74  se, (void*)pList
1fa90 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
1faa0 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  oken);.  }.  ret
1fab0 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
1fac0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64  .** Delete an Id
1fad0 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  List..*/.void sq
1fae0 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
1faf0 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  e(sqlite3 *db, I
1fb00 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  dList *pList){. 
1fb10 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1fb20 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1fb30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1fb40 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
1fb50 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1fb60 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  e(db, pList->a[i
1fb70 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
1fb80 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1fb90 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  , pList->a);.  s
1fba0 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
1fbb0 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
1fbc0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
1fbd0 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66  ndex in pList of
1fbe0 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20   the identifier 
1fbf0 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75  named zId.  Retu
1fc00 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20  rn -1.** if not 
1fc10 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  found..*/.int sq
1fc20 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
1fc30 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
1fc40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1fc50 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  e){.  int i;.  i
1fc60 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1fc70 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69  turn -1;.  for(i
1fc80 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
1fc90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1fca0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1fcb0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1fcc0 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65  , zName)==0 ) re
1fcd0 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
1fce0 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
1fcf0 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f  * Maximum size o
1fd00 66 20 61 20 53 72 63 4c 69 73 74 20 6f 62 6a 65  f a SrcList obje
1fd10 63 74 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69  ct..** The SrcLi
1fd20 73 74 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65  st object is use
1fd30 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74  d to represent t
1fd40 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1fd50 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  f a.** SELECT st
1fd60 61 74 65 6d 65 6e 74 2c 20 61 6e 64 20 74 68 65  atement, and the
1fd70 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 63   query planner c
1fd80 61 6e 6e 6f 74 20 64 65 61 6c 20 77 69 74 68 20  annot deal with 
1fd90 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 36 34 20  more.** than 64 
1fda0 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e  tables in a join
1fdb0 2e 20 20 53 6f 20 61 6e 79 20 76 61 6c 75 65 20  .  So any value 
1fdc0 6c 61 72 67 65 72 20 74 68 61 6e 20 36 34 20 68  larger than 64 h
1fdd0 65 72 65 0a 2a 2a 20 69 73 20 73 75 66 66 69 63  ere.** is suffic
1fde0 69 65 6e 74 20 66 6f 72 20 6d 6f 73 74 20 75 73  ient for most us
1fdf0 65 73 2e 20 20 53 6d 61 6c 6c 65 72 20 76 61 6c  es.  Smaller val
1fe00 75 65 73 2c 20 6c 69 6b 65 20 73 61 79 20 31 30  ues, like say 10
1fe10 2c 20 61 72 65 0a 2a 2a 20 61 70 70 72 6f 70 72  , are.** appropr
1fe20 69 61 74 65 20 66 6f 72 20 73 6d 61 6c 6c 20 61  iate for small a
1fe30 6e 64 20 6d 65 6d 6f 72 79 2d 6c 69 6d 69 74 65  nd memory-limite
1fe40 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 2e 0a  d applications..
1fe50 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1fe60 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 0a 23 20  E_MAX_SRCLIST.# 
1fe70 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41  define SQLITE_MA
1fe80 58 5f 53 52 43 4c 49 53 54 20 32 30 30 0a 23 65  X_SRCLIST 200.#e
1fe90 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61  ndif../*.** Expa
1fea0 6e 64 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c  nd the space all
1feb0 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 67  ocated for the g
1fec0 69 76 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a  iven SrcList obj
1fed0 65 63 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69  ect by.** creati
1fee0 6e 67 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c  ng nExtra new sl
1fef0 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ots beginning at
1ff00 20 69 53 74 61 72 74 2e 20 20 69 53 74 61 72 74   iStart.  iStart
1ff10 20 69 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a   is zero based..
1ff20 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65  ** New slots are
1ff30 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46   zeroed..**.** F
1ff40 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70  or example, supp
1ff50 6f 73 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e  ose a SrcList in
1ff60 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73  itially contains
1ff70 20 74 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c   two entries: A,
1ff80 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20  B..** To append 
1ff90 33 20 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e  3 new entries on
1ffa0 74 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74  to the end, do t
1ffb0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71  his:.**.**    sq
1ffc0 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
1ffd0 72 67 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74  rge(db, pSrclist
1ffe0 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41  , 3, 2);.**.** A
1fff0 66 74 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62  fter the call ab
20000 6f 76 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e  ove it would con
20010 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c  tain:  A, B, nil
20020 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49  , nil, nil..** I
20030 66 20 74 68 65 20 69 53 74 61 72 74 20 61 72 67  f the iStart arg
20040 75 6d 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31  ument had been 1
20050 20 69 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74   instead of 2, t
20060 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  hen the result.*
20070 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  * would have bee
20080 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  n:  A, nil, nil,
20090 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65   nil, B.  To pre
200a0 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f  pend the new slo
200b0 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72  ts,.** the iStar
200c0 74 20 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65  t value would be
200d0 20 30 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20   0.  The result 
200e0 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65  then would.** be
200f0 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  : nil, nil, nil,
20100 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   A, B..**.** If 
20110 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
20120 69 6f 6e 20 66 61 69 6c 73 20 6f 72 20 74 68 65  ion fails or the
20130 20 53 72 63 4c 69 73 74 20 62 65 63 6f 6d 65 73   SrcList becomes
20140 20 74 6f 6f 20 6c 61 72 67 65 2c 20 6c 65 61 76   too large, leav
20150 65 0a 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61  e.** the origina
20160 6c 20 53 72 63 4c 69 73 74 20 75 6e 63 68 61 6e  l SrcList unchan
20170 67 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ged, return NULL
20180 2c 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65  , and leave an e
20190 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
201a0 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 53 72  in pParse..*/.Sr
201b0 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
201c0 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20  cListEnlarge(.  
201d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
201e0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
201f0 6e 74 65 78 74 20 69 6e 74 6f 20 77 68 69 63 68  ntext into which
20200 20 65 72 72 6f 72 73 20 61 72 65 20 72 65 70 6f   errors are repo
20210 72 74 65 64 20 2a 2f 0a 20 20 53 72 63 4c 69 73  rted */.  SrcLis
20220 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20  t *pSrc,     /* 
20230 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62  The SrcList to b
20240 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20  e enlarged */.  
20250 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
20260 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20270 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64  new slots to add
20280 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f   to pSrc->a[] */
20290 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20 20 20  .  int iStart   
202a0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
202b0 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66  n pSrc->a[] of f
202c0 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f  irst new slot */
202d0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  .){.  int i;..  
202e0 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
202f0 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61  ng on calling pa
20300 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73  rameters */.  as
20310 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20  sert( iStart>=0 
20320 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78  );.  assert( nEx
20330 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  tra>=1 );.  asse
20340 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
20350 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c   assert( iStart<
20360 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a  =pSrc->nSrc );..
20370 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64    /* Allocate ad
20380 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65 20 69  ditional space i
20390 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66  f needed */.  if
203a0 28 20 28 75 33 32 29 70 53 72 63 2d 3e 6e 53 72  ( (u32)pSrc->nSr
203b0 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e  c+nExtra>pSrc->n
203c0 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63  Alloc ){.    Src
203d0 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
203e0 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72  int nAlloc = pSr
203f0 63 2d 3e 6e 53 72 63 2a 32 2b 6e 45 78 74 72 61  c->nSrc*2+nExtra
20400 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
20410 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
20420 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  .    if( pSrc->n
20430 53 72 63 2b 6e 45 78 74 72 61 3e 3d 53 51 4c 49  Src+nExtra>=SQLI
20440 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 20 29  TE_MAX_SRCLIST )
20450 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
20460 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
20470 22 74 6f 6f 20 6d 61 6e 79 20 46 52 4f 4d 20 63  "too many FROM c
20480 6c 61 75 73 65 20 74 65 72 6d 73 2c 20 6d 61 78  lause terms, max
20490 3a 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  : %d",.         
204a0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
204b0 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 29  ITE_MAX_SRCLIST)
204c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
204d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
204e0 6e 41 6c 6c 6f 63 3e 53 51 4c 49 54 45 5f 4d 41  nAlloc>SQLITE_MA
204f0 58 5f 53 52 43 4c 49 53 54 20 29 20 6e 41 6c 6c  X_SRCLIST ) nAll
20500 6f 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  oc = SQLITE_MAX_
20510 53 52 43 4c 49 53 54 3b 0a 20 20 20 20 70 4e 65  SRCLIST;.    pNe
20520 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
20530 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a 20  lloc(db, pSrc,. 
20540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
20550 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20 28 6e  zeof(*pSrc) + (n
20560 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28  Alloc-1)*sizeof(
20570 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  pSrc->a[0]) );. 
20580 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
20590 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
205a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
205b0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
205c0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53   0;.    }.    pS
205d0 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70  rc = pNew;.    p
205e0 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 41  Src->nAlloc = nA
205f0 6c 6c 6f 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  lloc;.  }..  /* 
20600 4d 6f 76 65 20 65 78 69 73 74 69 6e 67 20 73 6c  Move existing sl
20610 6f 74 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66  ots that come af
20620 74 65 72 20 74 68 65 20 6e 65 77 6c 79 20 69 6e  ter the newly in
20630 73 65 72 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a  serted slots.  *
20640 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79  * out of the way
20650 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72 63   */.  for(i=pSrc
20660 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74  ->nSrc-1; i>=iSt
20670 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70  art; i--){.    p
20680 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d  Src->a[i+nExtra]
20690 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20   = pSrc->a[i];. 
206a0 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63 20   }.  pSrc->nSrc 
206b0 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a  += nExtra;..  /*
206c0 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20   Zero the newly 
206d0 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20  allocated slots 
206e0 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72  */.  memset(&pSr
206f0 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c  c->a[iStart], 0,
20700 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b   sizeof(pSrc->a[
20710 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66  0])*nExtra);.  f
20720 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69  or(i=iStart; i<i
20730 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b  Start+nExtra; i+
20740 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b  +){.    pSrc->a[
20750 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  i].iCursor = -1;
20760 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72  .  }..  /* Retur
20770 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
20780 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c  he enlarged SrcL
20790 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ist */.  return 
207a0 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  pSrc;.}.../*.** 
207b0 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62  Append a new tab
207c0 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67  le name to the g
207d0 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43  iven SrcList.  C
207e0 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c  reate a new SrcL
207f0 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
20800 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  e.  A new entry 
20810 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  is created in th
20820 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69  e SrcList even i
20830 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c  f pTable is NULL
20840 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73  ..**.** A SrcLis
20850 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
20860 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  r NULL if there 
20870 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  is an OOM error 
20880 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20 53 72 63  or if the.** Src
20890 4c 69 73 74 20 67 72 6f 77 73 20 74 6f 20 6c 61  List grows to la
208a0 72 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  rge.  The return
208b0 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69  ed.** SrcList mi
208c0 67 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ght be the same 
208d0 61 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  as the SrcList t
208e0 68 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72  hat was input or
208f0 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20   it might be.** 
20900 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61  a new one.  If a
20910 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73  n OOM error does
20920 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68   occurs, then th
20930 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66  e prior value of
20940 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69   pList.** that i
20950 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20  s input to this 
20960 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d  routine is autom
20970 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a  atically freed..
20980 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61  **.** If pDataba
20990 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20  se is not null, 
209a0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
209b0 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f  e table has an o
209c0 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  ptional.** datab
209d0 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e  ase name prefix.
209e0 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64    Like this:  "d
209f0 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20  atabase.table". 
20a00 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a   The pDatabase.*
20a10 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
20a20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
20a30 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73  he pTable points
20a40 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
20a50 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72   name..** The Sr
20a60 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  cList.a[].zName 
20a70 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20  field is filled 
20a80 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e  with the table n
20a90 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a  ame which might.
20aa0 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61  ** come from pTa
20ab0 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73  ble (if pDatabas
20ac0 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72  e is NULL) or fr
20ad0 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a  om pDatabase.  .
20ae0 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  ** SrcList.a[].z
20af0 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c  Database is fill
20b00 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
20b10 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70  base name from p
20b20 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74  Table,.** or wit
20b30 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74  h NULL if no dat
20b40 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69  abase is specifi
20b50 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68  ed..**.** In oth
20b60 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c  er words, if cal
20b70 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  l like this:.**.
20b80 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
20b90 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
20ba0 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,B,0);.**.** 
20bb0 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c  Then B is a tabl
20bc0 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  e name and the d
20bd0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
20be0 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66  unspecified.  If
20bf0 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20   called.** like 
20c00 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
20c10 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
20c20 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43  stAppend(D,A,B,C
20c30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20  );.**.** Then C 
20c40 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  is the table nam
20c50 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64  e and B is the d
20c60 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49  atabase name.  I
20c70 66 20 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a  f C is defined.*
20c80 2a 20 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20  * then so is B. 
20c90 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
20ca0 20 77 65 20 6e 65 76 65 72 20 68 61 76 65 20 61   we never have a
20cb0 20 63 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a   case where:.**.
20cc0 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
20cd0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
20ce0 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,0,C);.**.** 
20cf0 42 6f 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20  Both pTable and 
20d00 70 44 61 74 61 62 61 73 65 20 61 72 65 20 61 73  pDatabase are as
20d10 73 75 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74  sumed to be quot
20d20 65 64 2e 20 20 54 68 65 79 20 61 72 65 20 64 65  ed.  They are de
20d30 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65  quoted.** before
20d40 20 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20   being added to 
20d50 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  the SrcList..*/.
20d60 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
20d70 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  SrcListAppend(. 
20d80 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
20d90 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
20da0 63 6f 6e 74 65 78 74 2c 20 69 6e 20 77 68 69 63  context, in whic
20db0 68 20 65 72 72 6f 72 73 20 61 72 65 20 72 65 70  h errors are rep
20dc0 6f 72 74 65 64 20 2a 2f 0a 20 20 53 72 63 4c 69  orted */.  SrcLi
20dd0 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
20de0 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73  * Append to this
20df0 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63   SrcList. NULL c
20e00 72 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63  reates a new Src
20e10 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  List */.  Token 
20e20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a  *pTable,      /*
20e30 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64   Table to append
20e40 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
20e50 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74  tabase    /* Dat
20e60 61 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62  abase of the tab
20e70 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  le */.){.  struc
20e80 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
20e90 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
20ea0 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20   *db;.  assert( 
20eb0 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20  pDatabase==0 || 
20ec0 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a  pTable!=0 );  /*
20ed0 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43 20 77   Cannot have C w
20ee0 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20 61 73  ithout B */.  as
20ef0 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
20f00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20f10 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  rse->db!=0 );.  
20f20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
20f30 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
20f40 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
20f50 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
20f60 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  wNN(pParse->db, 
20f70 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20  sizeof(SrcList) 
20f80 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
20f90 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
20fa0 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
20fb0 63 20 3d 20 31 3b 0a 20 20 20 20 70 4c 69 73 74  c = 1;.    pList
20fc0 2d 3e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20  ->nSrc = 1;.    
20fd0 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61  memset(&pList->a
20fe0 5b 30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [0], 0, sizeof(p
20ff0 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
21000 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43    pList->a[0].iC
21010 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 65  ursor = -1;.  }e
21020 6c 73 65 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  lse{.    SrcList
21030 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
21040 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 70  SrcListEnlarge(p
21050 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 31 2c  Parse, pList, 1,
21060 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20   pList->nSrc);. 
21070 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
21080 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
21090 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
210a0 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72   pList);.      r
210b0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
210c0 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  se{.      pList 
210d0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20  = pNew;.    }.  
210e0 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69  }.  pItem = &pLi
210f0 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
21100 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74  c-1];.  if( pDat
21110 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61  abase && pDataba
21120 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  se->z==0 ){.    
21130 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  pDatabase = 0;. 
21140 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
21150 73 65 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d  se ){.    pItem-
21160 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
21170 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
21180 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
21190 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61    pItem->zDataba
211a0 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  se = sqlite3Name
211b0 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
211c0 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  able);.  }else{.
211d0 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
211e0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
211f0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62  omToken(db, pTab
21200 6c 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  le);.    pItem->
21210 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  zDatabase = 0;. 
21220 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73   }.  return pLis
21230 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  t;.}../*.** Assi
21240 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e  gn VdbeCursor in
21250 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61  dex numbers to a
21260 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53  ll tables in a S
21270 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73  rcList.*/.void s
21280 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
21290 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65  ignCursors(Parse
212a0 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
212b0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
212c0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
212d0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
212e0 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73 74  ;.  assert(pList
212f0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
21300 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
21310 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
21320 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
21330 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c  m=pList->a; i<pL
21340 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
21350 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
21360 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  if( pItem->iCurs
21370 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  or>=0 ) break;. 
21380 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72       pItem->iCur
21390 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
213a0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ab++;.      if( 
213b0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
213c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
213d0 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
213e0 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49  rsors(pParse, pI
213f0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  tem->pSelect->pS
21400 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
21410 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
21420 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
21430 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69   SrcList includi
21440 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74  ng all its subst
21450 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ructure..*/.void
21460 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
21470 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
21480 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  b, SrcList *pLis
21490 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
214a0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
214b0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
214c0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
214d0 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  rn;.  for(pItem=
214e0 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
214f0 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
21500 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
21510 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
21520 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  b, pItem->zDatab
21530 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ase);.    sqlite
21540 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
21550 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
21560 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
21570 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
21580 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
21590 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29  fg.isIndexedBy )
215a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
215b0 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e  b, pItem->u1.zIn
215c0 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 69 66  dexedBy);.    if
215d0 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61  ( pItem->fg.isTa
215e0 62 46 75 6e 63 20 29 20 73 71 6c 69 74 65 33 45  bFunc ) sqlite3E
215f0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
21600 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e  , pItem->u1.pFun
21610 63 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  cArg);.    sqlit
21620 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
21630 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a  , pItem->pTab);.
21640 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
21650 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  tDelete(db, pIte
21660 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
21670 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
21680 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f  te(db, pItem->pO
21690 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49  n);.    sqlite3I
216a0 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
216b0 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a  pItem->pUsing);.
216c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
216d0 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29  reeNN(db, pList)
216e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
216f0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
21700 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
21710 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65 72  to add a new ter
21720 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20  m to the.** end 
21730 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f  of a growing FRO
21740 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22  M clause.  The "
21750 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
21760 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  the part of.** t
21770 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
21780 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  hat has already 
21790 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64  been constructed
217a0 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a  .  "p" is NULL.*
217b0 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  * if this is the
217c0 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74   first term of t
217d0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
217e0 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74   pTable and pDat
217f0 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  abase.** are the
21800 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
21810 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73 65 20  le and database 
21820 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f  named in the FRO
21830 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a  M clause term..*
21840 2a 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e  * pDatabase is N
21850 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61 62  ULL if the datab
21860 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69  ase name qualifi
21870 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20  er is missing - 
21880 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73  the.** usual cas
21890 65 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20  e.  If the term 
218a0 68 61 73 20 61 6e 20 61 6c 69 61 73 2c 20 74 68  has an alias, th
218b0 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73  en pAlias points
218c0 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73   to the.** alias
218d0 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20   token.  If the 
218e0 74 65 72 6d 20 69 73 20 61 20 73 75 62 71 75 65  term is a subque
218f0 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65  ry, then pSubque
21900 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c  ry is the.** SEL
21910 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
21920 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20  at the subquery 
21930 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54  encodes.  The pT
21940 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74  able and.** pDat
21950 61 62 61 73 65 20 70 61 72 61 6d 65 74 65 72 73  abase parameters
21960 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75   are NULL for su
21970 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 70  bqueries.  The p
21980 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a  On and pUsing.**
21990 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
219a0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
219b0 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
219c0 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52  clauses..**.** R
219d0 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c  eturn a new SrcL
219e0 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65  ist which encode
219f0 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69  s is the FROM wi
21a00 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65  th the new.** te
21a10 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63  rm added..*/.Src
21a20 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
21a30 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65  ListAppendFromTe
21a40 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
21a50 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
21a60 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
21a70 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
21a80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
21a90 20 54 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f   The left part o
21aa0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
21ab0 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a  e already seen *
21ac0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
21ad0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  e,          /* N
21ae0 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
21af0 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46   to add to the F
21b00 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
21b10 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65  Token *pDatabase
21b20 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ,       /* Name 
21b30 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21b40 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c  containing pTabl
21b50 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41  e */.  Token *pA
21b60 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f  lias,          /
21b70 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64  * The right-hand
21b80 20 73 69 64 65 20 6f 66 20 74 68 65 20 41 53 20   side of the AS 
21b90 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  subexpression */
21ba0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71  .  Select *pSubq
21bb0 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20  uery,      /* A 
21bc0 73 75 62 71 75 65 72 79 20 75 73 65 64 20 69 6e  subquery used in
21bd0 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c   place of a tabl
21be0 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72  e name */.  Expr
21bf0 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20   *pOn,          
21c00 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c      /* The ON cl
21c10 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a  ause of a join *
21c20 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69  /.  IdList *pUsi
21c30 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng          /* T
21c40 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
21c50 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a  of a join */.){.
21c60 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
21c70 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
21c80 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
21c90 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
21ca0 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55  !p && (pOn || pU
21cb0 73 69 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c  sing) ){.    sql
21cc0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
21cd0 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61  rse, "a JOIN cla
21ce0 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20  use is required 
21cf0 62 65 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20  before %s", .   
21d00 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a     (pOn ? "ON" :
21d10 20 22 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b   "USING").    );
21d20 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64  .    goto append
21d30 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d  _from_error;.  }
21d40 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72  .  p = sqlite3Sr
21d50 63 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  cListAppend(pPar
21d60 73 65 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20 70  se, p, pTable, p
21d70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
21d80 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74   p==0 ){.    got
21d90 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  o append_from_er
21da0 72 6f 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ror;.  }.  asser
21db0 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a  t( p->nSrc>0 );.
21dc0 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b    pItem = &p->a[
21dd0 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73  p->nSrc-1];.  as
21de0 73 65 72 74 28 20 28 70 54 61 62 6c 65 3d 3d 30  sert( (pTable==0
21df0 29 3d 3d 28 70 44 61 74 61 62 61 73 65 3d 3d 30  )==(pDatabase==0
21e00 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
21e10 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c  Item->zName==0 |
21e20 7c 20 70 44 61 74 61 62 61 73 65 21 3d 30 20 29  | pDatabase!=0 )
21e30 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d  ;.  if( IN_RENAM
21e40 45 5f 4f 42 4a 45 43 54 20 26 26 20 70 49 74 65  E_OBJECT && pIte
21e50 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  m->zName ){.    
21e60 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20  Token *pToken = 
21e70 28 41 4c 57 41 59 53 28 70 44 61 74 61 62 61 73  (ALWAYS(pDatabas
21e80 65 29 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  e) && pDatabase-
21e90 3e 7a 29 20 3f 20 70 44 61 74 61 62 61 73 65 20  >z) ? pDatabase 
21ea0 3a 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 73 71  : pTable;.    sq
21eb0 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
21ec0 4d 61 70 28 70 50 61 72 73 65 2c 20 70 49 74 65  Map(pParse, pIte
21ed0 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e  m->zName, pToken
21ee0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
21ef0 20 70 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20   pAlias!=0 );.  
21f00 69 66 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b  if( pAlias->n ){
21f10 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  .    pItem->zAli
21f20 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  as = sqlite3Name
21f30 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41  FromToken(db, pA
21f40 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74  lias);.  }.  pIt
21f50 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53  em->pSelect = pS
21f60 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d  ubquery;.  pItem
21f70 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70  ->pOn = pOn;.  p
21f80 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70  Item->pUsing = p
21f90 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20  Using;.  return 
21fa0 70 3b 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d  p;.. append_from
21fb0 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74  _error:.  assert
21fc0 28 20 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( p==0 );.  sqli
21fd0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
21fe0 2c 20 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65  , pOn);.  sqlite
21ff0 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
22000 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c  , pUsing);.  sql
22010 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
22020 28 64 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b  (db, pSubquery);
22030 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
22040 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44  /*.** Add an IND
22050 45 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49  EXED BY or NOT I
22060 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f  NDEXED clause to
22070 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
22080 6c 79 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65  ly added .** ele
22090 6d 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72  ment of the sour
220a0 63 65 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61  ce-list passed a
220b0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
220c0 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
220d0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64  qlite3SrcListInd
220e0 65 78 65 64 42 79 28 50 61 72 73 65 20 2a 70 50  exedBy(Parse *pP
220f0 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
22100 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65  , Token *pIndexe
22110 64 42 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20  dBy){.  assert( 
22120 70 49 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b  pIndexedBy!=0 );
22130 0a 20 20 69 66 28 20 70 20 26 26 20 70 49 6e 64  .  if( p && pInd
22140 65 78 65 64 42 79 2d 3e 6e 3e 30 20 29 7b 0a 20  exedBy->n>0 ){. 
22150 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
22160 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
22170 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53     assert( p->nS
22180 72 63 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65  rc>0 );.    pIte
22190 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72  m = &p->a[p->nSr
221a0 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  c-1];.    assert
221b0 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49  ( pItem->fg.notI
221c0 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20  ndexed==0 );.   
221d0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
221e0 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d  fg.isIndexedBy==
221f0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
22200 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62   pItem->fg.isTab
22210 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Func==0 );.    i
22220 66 28 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e  f( pIndexedBy->n
22230 3d 3d 31 20 26 26 20 21 70 49 6e 64 65 78 65 64  ==1 && !pIndexed
22240 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f  By->z ){.      /
22250 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44  * A "NOT INDEXED
22260 22 20 63 6c 61 75 73 65 20 77 61 73 20 73 75 70  " clause was sup
22270 70 6c 69 65 64 2e 20 53 65 65 20 70 61 72 73 65  plied. See parse
22280 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  .y .      ** con
22290 73 74 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f  struct "indexed_
222a0 6f 70 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73  opt" for details
222b0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d  . */.      pItem
222c0 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20  ->fg.notIndexed 
222d0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
222e0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e        pItem->u1.
222f0 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c  zIndexedBy = sql
22300 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
22310 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49  n(pParse->db, pI
22320 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 20  ndexedBy);.     
22330 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
22340 65 78 65 64 42 79 20 3d 20 31 3b 0a 20 20 20 20  exedBy = 1;.    
22350 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
22360 64 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66  dd the list of f
22370 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
22380 73 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74  s to the SrcList
22390 20 65 6e 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20   entry for a.** 
223a0 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e  table-valued-fun
223b0 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
223c0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 46 75 6e  qlite3SrcListFun
223d0 63 41 72 67 73 28 50 61 72 73 65 20 2a 70 50 61  cArgs(Parse *pPa
223e0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  rse, SrcList *p,
223f0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
22400 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
22410 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
22420 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
22430 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
22440 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
22450 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  em->fg.notIndexe
22460 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
22470 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
22480 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a  IndexedBy==0 );.
22490 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
224a0 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m->fg.isTabFunc=
224b0 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  =0 );.    pItem-
224c0 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 70  >u1.pFuncArg = p
224d0 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d  List;.    pItem-
224e0 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 3d 20  >fg.isTabFunc = 
224f0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
22500 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
22510 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
22520 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a  , pList);.  }.}.
22530 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c  ./*.** When buil
22540 64 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63  ding up a FROM c
22550 6c 61 75 73 65 20 69 6e 20 74 68 65 20 70 61 72  lause in the par
22560 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ser, the join op
22570 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69  erator.** is ini
22580 74 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20  tially attached 
22590 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  to the left oper
225a0 61 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f  and.  But the co
225b0 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
225c0 65 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e  expects the join
225d0 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
225e0 6f 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  on the right ope
225f0 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74  rand.  This rout
22600 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c  ine.** Shifts al
22610 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73  l join operators
22620 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
22630 67 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72  ght for an entir
22640 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65  e FROM.** clause
22650 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a  ..**.** Example:
22660 20 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69   Suppose the joi
22670 6e 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  n is like this:.
22680 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
22690 41 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20  A natural cross 
226a0 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65  join B.**.** The
226b0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61   operator is "na
226c0 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e  tural cross join
226d0 22 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42 20  ".  The A and B 
226e0 6f 70 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f  operands are sto
226f0 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30  red.** in p->a[0
22700 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72  ] and p->a[1], r
22710 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68  espectively.  Th
22720 65 20 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c  e parser initial
22730 6c 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a  ly stores the.**
22740 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 41   operator with A
22750 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
22760 73 68 69 66 74 73 20 74 68 61 74 20 6f 70 65 72  shifts that oper
22770 61 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a  ator over to B..
22780 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
22790 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54  rcListShiftJoinT
227a0 79 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b  ype(SrcList *p){
227b0 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
227c0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
227d0 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b  =p->nSrc-1; i>0;
227e0 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i--){.      p->
227f0 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  a[i].fg.jointype
22800 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e   = p->a[i-1].fg.
22810 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a  jointype;.    }.
22820 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a      p->a[0].fg.j
22830 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d  ointype = 0;.  }
22840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
22850 74 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72  te VDBE code for
22860 20 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65   a BEGIN stateme
22870 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
22880 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
22890 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
228a0 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20  e, int type){.  
228b0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
228c0 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b  dbe *v;.  int i;
228d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
228e0 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20  se!=0 );.  db = 
228f0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
22900 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
22910 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
22920 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
22930 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
22940 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29  , "BEGIN", 0, 0)
22950 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
22960 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65    }.  v = sqlite
22970 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
22980 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74  ;.  if( !v ) ret
22990 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21  urn;.  if( type!
229a0 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a  =TK_DEFERRED ){.
229b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
229c0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
229d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
229e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e  ddOp2(v, OP_Tran
229f0 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70  saction, i, (typ
22a00 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29  e==TK_EXCLUSIVE)
22a10 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
22a20 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
22a30 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  v, i);.    }.  }
22a40 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
22a50 64 4f 70 30 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp0(v, OP_AutoC
22a60 6f 6d 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ommit);.}../*.**
22a70 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
22a80 6f 64 65 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54  ode for a COMMIT
22a90 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 73 74 61   or ROLLBACK sta
22aa0 74 65 6d 65 6e 74 2e 0a 2a 2a 20 43 6f 64 65 20  tement..** Code 
22ab0 66 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 69 73 20  for ROLLBACK is 
22ac0 67 65 6e 65 72 61 74 65 64 20 69 66 20 65 54 79  generated if eTy
22ad0 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 2e  pe==TK_ROLLBACK.
22ae0 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 63    Otherwise.** c
22af0 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
22b00 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54 2e 0a 2a   for a COMMIT..*
22b10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e  /.void sqlite3En
22b20 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  dTransaction(Par
22b30 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
22b40 65 54 79 70 65 29 7b 0a 20 20 56 64 62 65 20 2a  eType){.  Vdbe *
22b50 76 3b 0a 20 20 69 6e 74 20 69 73 52 6f 6c 6c 62  v;.  int isRollb
22b60 61 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ack;..  assert( 
22b70 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61  pParse!=0 );.  a
22b80 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
22b90 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
22ba0 28 20 65 54 79 70 65 3d 3d 54 4b 5f 43 4f 4d 4d  ( eType==TK_COMM
22bb0 49 54 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f  IT || eType==TK_
22bc0 45 4e 44 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b  END || eType==TK
22bd0 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 69  _ROLLBACK );.  i
22be0 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 65 54 79 70  sRollback = eTyp
22bf0 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  e==TK_ROLLBACK;.
22c00 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
22c10 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
22c20 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
22c30 4e 2c 20 0a 20 20 20 20 20 20 20 69 73 52 6f 6c  N, .       isRol
22c40 6c 62 61 63 6b 20 3f 20 22 52 4f 4c 4c 42 41 43  lback ? "ROLLBAC
22c50 4b 22 20 3a 20 22 43 4f 4d 4d 49 54 22 2c 20 30  K" : "COMMIT", 0
22c60 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
22c70 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  rn;.  }.  v = sq
22c80 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
22c90 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
22ca0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
22cb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74  AddOp2(v, OP_Aut
22cc0 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 69 73 52 6f  oCommit, 1, isRo
22cd0 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a  llback);.  }.}..
22ce0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
22cf0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
22d00 20 74 68 65 20 70 61 72 73 65 72 20 77 68 65 6e   the parser when
22d10 20 69 74 20 70 61 72 73 65 73 20 61 20 63 6f 6d   it parses a com
22d20 6d 61 6e 64 20 74 6f 20 63 72 65 61 74 65 2c 0a  mand to create,.
22d30 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  ** release or ro
22d40 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c 20 73 61  llback an SQL sa
22d50 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69  vepoint. .*/.voi
22d60 64 20 73 71 6c 69 74 65 33 53 61 76 65 70 6f 69  d sqlite3Savepoi
22d70 6e 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nt(Parse *pParse
22d80 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20  , int op, Token 
22d90 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  *pName){.  char 
22da0 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  *zName = sqlite3
22db0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
22dc0 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29  arse->db, pName)
22dd0 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
22de0 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
22df0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
22e00 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53  arse);.#ifndef S
22e10 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
22e20 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74 61  RIZATION.    sta
22e30 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
22e40 20 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20   const az[] = { 
22e50 22 42 45 47 49 4e 22 2c 20 22 52 45 4c 45 41 53  "BEGIN", "RELEAS
22e60 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d  E", "ROLLBACK" }
22e70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 53  ;.    assert( !S
22e80 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26  AVEPOINT_BEGIN &
22e90 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  & SAVEPOINT_RELE
22ea0 41 53 45 3d 3d 31 20 26 26 20 53 41 56 45 50 4f  ASE==1 && SAVEPO
22eb0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20  INT_ROLLBACK==2 
22ec0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
22ed0 28 20 21 76 20 7c 7c 20 73 71 6c 69 74 65 33 41  ( !v || sqlite3A
22ee0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
22ef0 20 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e   SQLITE_SAVEPOIN
22f00 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65  T, az[op], zName
22f10 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  , 0) ){.      sq
22f20 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
22f30 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  se->db, zName);.
22f40 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
22f50 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
22f60 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
22f70 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30  Savepoint, op, 0
22f80 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44  , 0, zName, P4_D
22f90 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a  YNAMIC);.  }.}..
22fa0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
22fb0 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73  the TEMP databas
22fc0 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76  e is open and av
22fd0 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e  ailable for use.
22fe0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
22ff0 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
23000 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72  .  Leave any err
23010 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74  or messages in t
23020 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
23030 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ure..*/.int sqli
23040 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
23050 61 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ase(Parse *pPars
23060 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
23070 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
23080 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d    if( db->aDb[1]
23090 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72  .pBt==0 && !pPar
230a0 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
230b0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42     int rc;.    B
230c0 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 73  tree *pBt;.    s
230d0 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
230e0 66 6c 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20  flags = .       
230f0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
23100 45 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20  EADWRITE |.     
23110 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
23120 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20  _CREATE |.      
23130 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
23140 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20  EXCLUSIVE |.    
23150 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
23160 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
23170 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
23180 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b  TE_OPEN_TEMP_DB;
23190 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
231a0 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e  e3BtreeOpen(db->
231b0 70 56 66 73 2c 20 30 2c 20 64 62 2c 20 26 70 42  pVfs, 0, db, &pB
231c0 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20  t, 0, flags);.  
231d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
231e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
231f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
23200 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
23210 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
23220 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20 20   database ".    
23230 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74      "file for st
23240 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  oring temporary 
23250 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20  tables");.      
23260 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b  pParse->rc = rc;
23270 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
23280 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61  .    }.    db->a
23290 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b  Db[1].pBt = pBt;
232a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
232b0 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
232c0 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
232d0 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33  E_NOMEM==sqlite3
232e0 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
232f0 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61  (pBt, db->nextPa
23300 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29  gesize, -1, 0) )
23310 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
23320 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
23330 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
23340 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
23350 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  0;.}../*.** Reco
23360 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
23370 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
23380 69 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  ie will need to 
23390 62 65 20 76 65 72 69 66 69 65 64 0a 2a 2a 20 66  be verified.** f
233a0 6f 72 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  or database iDb.
233b0 20 20 54 68 65 20 63 6f 64 65 20 74 6f 20 61 63    The code to ac
233c0 74 75 61 6c 6c 79 20 76 65 72 69 66 79 20 74 68  tually verify th
233d0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a  e schema cookie.
233e0 2a 2a 20 77 69 6c 6c 20 6f 63 63 75 72 20 61 74  ** will occur at
233f0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
23400 74 6f 70 2d 6c 65 76 65 6c 20 56 44 42 45 20 61  top-level VDBE a
23410 6e 64 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  nd will be gener
23420 61 74 65 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62  ated.** later, b
23430 79 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  y sqlite3FinishC
23440 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64  oding()..*/.void
23450 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
23460 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a  fySchema(Parse *
23470 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29  pParse, int iDb)
23480 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
23490 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
234a0 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
234b0 73 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  se);..  assert( 
234c0 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50  iDb>=0 && iDb<pP
234d0 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b  arse->db->nDb );
234e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
234f0 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
23500 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31  pBt!=0 || iDb==1
23510 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44   );.  assert( iD
23520 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  b<SQLITE_MAX_ATT
23530 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 61 73 73  ACHED+2 );.  ass
23540 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
23550 6d 61 4d 75 74 65 78 48 65 6c 64 28 70 50 61 72  maMutexHeld(pPar
23560 73 65 2d 3e 64 62 2c 20 69 44 62 2c 20 30 29 20  se->db, iDb, 0) 
23570 29 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 54  );.  if( DbMaskT
23580 65 73 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63  est(pToplevel->c
23590 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d  ookieMask, iDb)=
235a0 3d 30 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b  =0 ){.    DbMask
235b0 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63  Set(pToplevel->c
235c0 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b  ookieMask, iDb);
235d0 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
235e0 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
235f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
23600 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
23610 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20  (pToplevel);.   
23620 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
23630 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 44 62 20  If argument zDb 
23640 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61  is NULL, then ca
23650 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  ll sqlite3CodeVe
23660 72 69 66 79 53 63 68 65 6d 61 28 29 20 66 6f 72  rifySchema() for
23670 20 65 61 63 68 20 0a 2a 2a 20 61 74 74 61 63 68   each .** attach
23680 65 64 20 64 61 74 61 62 61 73 65 2e 20 4f 74 68  ed database. Oth
23690 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69  erwise, invoke i
236a0 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  t for the databa
236b0 73 65 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c  se named zDb onl
236c0 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
236d0 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
236e0 64 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70  dSchema(Parse *p
236f0 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
23700 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74  r *zDb){.  sqlit
23710 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
23720 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  >db;.  int i;.  
23730 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
23740 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62  Db; i++){.    Db
23750 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
23760 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
23770 2d 3e 70 42 74 20 26 26 20 28 21 7a 44 62 20 7c  ->pBt && (!zDb |
23780 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  | 0==sqlite3StrI
23790 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 44  Cmp(zDb, pDb->zD
237a0 62 53 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20  bSName)) ){.    
237b0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
237c0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
237d0 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
237e0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
237f0 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
23800 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f   prepares for do
23810 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
23820 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
23830 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61  hange the databa
23840 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
23850 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20  outine starts a 
23860 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
23870 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c  if we are not al
23880 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20  ready within.** 
23890 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  a transaction.  
238a0 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  If we are alread
238b0 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  y within a trans
238c0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63  action, then a c
238d0 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20  heckpoint.** is 
238e0 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74  set if the setSt
238f0 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65  atement paramete
23900 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68  r is true.  A ch
23910 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a  eckpoint should.
23920 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70  ** be set for op
23930 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69  erations that mi
23940 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f  ght fail (due to
23950 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70   a constraint) p
23960 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61  art of.** the wa
23970 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68  y through and wh
23980 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  ich will need to
23990 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65   undo some write
239a0 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  s without having
239b0 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20   to.** rollback 
239c0 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61  the whole transa
239d0 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72  ction.  For oper
239e0 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c  ations where all
239f0 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
23a00 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62  can be checked b
23a10 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
23a20 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  s are made to th
23a30 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69  e database, it i
23a40 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73  s never.** neces
23a50 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77  sary to undo a w
23a60 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65  rite and the che
23a70 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e  ckpoint should n
23a80 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ot be set..*/.vo
23a90 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  id sqlite3BeginW
23aa0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61  riteOperation(Pa
23ab0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
23ac0 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69   setStatement, i
23ad0 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65  nt iDb){.  Parse
23ae0 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
23af0 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
23b00 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  el(pParse);.  sq
23b10 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
23b20 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
23b30 62 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28  b);.  DbMaskSet(
23b40 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65  pToplevel->write
23b50 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70 54  Mask, iDb);.  pT
23b60 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69  oplevel->isMulti
23b70 57 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74  Write |= setStat
23b80 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ement;.}../*.** 
23b90 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  Indicate that th
23ba0 65 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72  e statement curr
23bb0 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
23bc0 74 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77  truction might w
23bd0 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61  rite.** more tha
23be0 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61  n one entry (exa
23bf0 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f  mple: deleting o
23c00 6e 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65  ne row then inse
23c10 72 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a  rting another,.*
23c20 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74  * inserting mult
23c30 69 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74  iple rows in a t
23c40 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69  able, or inserti
23c50 6e 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64  ng a row and ind
23c60 65 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20  ex entries.).** 
23c70 49 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75  If an abort occu
23c80 72 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66  rs after some of
23c90 20 74 68 65 73 65 20 77 72 69 74 65 73 20 68 61   these writes ha
23ca0 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68  ve completed, th
23cb0 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65  en it will.** be
23cc0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e   necessary to un
23cd0 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64  do the completed
23ce0 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64   writes..*/.void
23cf0 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69   sqlite3MultiWri
23d00 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  te(Parse *pParse
23d10 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
23d20 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
23d30 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
23d40 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  rse);.  pTopleve
23d50 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  l->isMultiWrite 
23d60 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54  = 1;.}../* .** T
23d70 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
23d80 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
23d90 74 69 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f  tine if is disco
23da0 76 65 72 73 20 74 68 61 74 20 69 74 20 69 73 0a  vers that it is.
23db0 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  ** possible to a
23dc0 62 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74  bort a statement
23dd0 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65   prior to comple
23de0 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20  tion.  In order 
23df0 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74  to .** perform t
23e00 68 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75  his abort withou
23e10 74 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65  t corrupting the
23e20 20 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65   database, we ne
23e30 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75  ed to make.** su
23e40 72 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  re that the stat
23e50 65 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74  ement is protect
23e60 65 64 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e  ed by a statemen
23e70 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  t transaction..*
23e80 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79  *.** Technically
23e90 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74  , we only need t
23ea0 6f 20 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f  o set the mayAbo
23eb0 72 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a  rt flag if the.*
23ec0 2a 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66  * isMultiWrite f
23ed0 6c 61 67 20 77 61 73 20 70 72 65 76 69 6f 75 73  lag was previous
23ee0 6c 79 20 73 65 74 2e 20 20 54 68 65 72 65 20 69  ly set.  There i
23ef0 73 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65  s a time depende
23f00 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74  ncy.** such that
23f10 20 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20   the abort must 
23f20 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65 20  occur after the 
23f30 6d 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69  multiwrite.  Thi
23f40 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20  s makes.** some 
23f50 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c  statements invol
23f60 76 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45  ving the REPLACE
23f70 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
23f80 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a  tion algorithm.*
23f90 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61  * go a little fa
23fa0 73 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e  ster.  But takin
23fb0 67 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  g advantage of t
23fc0 68 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65  his time depende
23fd0 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20  ncy.** makes it 
23fe0 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20 74  more difficult t
23ff0 6f 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65  o prove that the
24000 20 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74   code is correct
24010 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75   (in .** particu
24020 6c 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73  lar, it prevents
24030 20 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67   us from writing
24040 20 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a   an effective.**
24050 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
24060 6f 66 20 73 71 6c 69 74 65 33 41 73 73 65 72 74  of sqlite3Assert
24070 4d 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20  MayAbort()) and 
24080 73 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73 65  so we have chose
24090 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65  n.** to take the
240a0 20 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20   safe route and 
240b0 73 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a  skip the optimiz
240c0 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
240d0 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50  qlite3MayAbort(P
240e0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
240f0 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
24100 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
24110 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
24120 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d  ;.  pToplevel->m
24130 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a  ayAbort = 1;.}..
24140 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
24150 5f 48 61 6c 74 20 74 68 61 74 20 63 61 75 73 65  _Halt that cause
24160 73 20 74 68 65 20 76 64 62 65 20 74 6f 20 72 65  s the vdbe to re
24170 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
24180 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72  ONSTRAINT.** err
24190 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20  or. The onError 
241a0 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d  parameter determ
241b0 69 6e 65 73 20 77 68 69 63 68 20 28 69 66 20 61  ines which (if a
241c0 6e 79 29 20 6f 66 20 74 68 65 20 73 74 61 74 65  ny) of the state
241d0 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63  ment.** and/or c
241e0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
241f0 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
24200 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
24210 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
24220 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
24230 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
24240 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
24250 74 20 65 72 72 43 6f 64 65 2c 20 20 20 20 20 20  t errCode,      
24260 2f 2a 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f  /* extended erro
24270 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  r code */.  int 
24280 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a  onError,      /*
24290 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65   Constraint type
242a0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c 20   */.  char *p4, 
242b0 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
242c0 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 38   message */.  i8
242d0 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20 20   p4type,        
242e0 2f 2a 20 50 34 5f 53 54 41 54 49 43 20 6f 72 20  /* P4_STATIC or 
242f0 50 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a  P4_TRANSIENT */.
24300 20 20 75 38 20 70 35 45 72 72 6d 73 67 20 20 20    u8 p5Errmsg   
24310 20 20 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67      /* P5_ErrMsg
24320 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64   type */.){.  Vd
24330 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
24340 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
24350 20 20 61 73 73 65 72 74 28 20 28 65 72 72 43 6f    assert( (errCo
24360 64 65 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  de&0xff)==SQLITE
24370 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20  _CONSTRAINT );. 
24380 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45   if( onError==OE
24390 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71  _Abort ){.    sq
243a0 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
243b0 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  arse);.  }.  sql
243c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
243d0 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f  , OP_Halt, errCo
243e0 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20  de, onError, 0, 
243f0 70 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 73  p4, p4type);.  s
24400 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
24410 50 35 28 76 2c 20 70 35 45 72 72 6d 73 67 29 3b  P5(v, p5Errmsg);
24420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  .}../*.** Code a
24430 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f  n OP_Halt due to
24440 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41   UNIQUE or PRIMA
24450 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
24460 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  t violation..*/.
24470 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69 71  void sqlite3Uniq
24480 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ueConstraint(.  
24490 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
244a0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
244b0 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  text */.  int on
244c0 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
244d0 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a  onstraint type *
244e0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
244f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
24500 65 78 20 74 68 61 74 20 74 72 69 67 67 65 72 73  ex that triggers
24510 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
24520 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  */.){.  char *zE
24530 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53  rr;.  int j;.  S
24540 74 72 41 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a  trAccum errMsg;.
24550 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
24560 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20  pIdx->pTable;.. 
24570 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
24580 49 6e 69 74 28 26 65 72 72 4d 73 67 2c 20 70 50  Init(&errMsg, pP
24590 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c 20  arse->db, 0, 0, 
245a0 32 30 30 29 3b 0a 20 20 69 66 28 20 70 49 64 78  200);.  if( pIdx
245b0 2d 3e 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20 20  ->aColExpr ){.  
245c0 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
245d0 70 65 6e 64 66 28 26 65 72 72 4d 73 67 2c 20 22  pendf(&errMsg, "
245e0 69 6e 64 65 78 20 27 25 71 27 22 2c 20 70 49 64  index '%q'", pId
245f0 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c  x->zName);.  }el
24600 73 65 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  se{.    for(j=0;
24610 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   j<pIdx->nKeyCol
24620 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68  ; j++){.      ch
24630 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
24640 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69  assert( pIdx->ai
24650 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a  Column[j]>=0 );.
24660 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61        zCol = pTa
24670 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69  b->aCol[pIdx->ai
24680 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65  Column[j]].zName
24690 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 20 29 20  ;.      if( j ) 
246a0 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
246b0 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2c 20 22  nd(&errMsg, ", "
246c0 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
246d0 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c  te3_str_appendal
246e0 6c 28 26 65 72 72 4d 73 67 2c 20 70 54 61 62 2d  l(&errMsg, pTab-
246f0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  >zName);.      s
24700 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
24710 64 28 26 65 72 72 4d 73 67 2c 20 22 2e 22 2c 20  d(&errMsg, ".", 
24720 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
24730 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28  3_str_appendall(
24740 26 65 72 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b 0a  &errMsg, zCol);.
24750 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72 72      }.  }.  zErr
24760 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   = sqlite3StrAcc
24770 75 6d 46 69 6e 69 73 68 28 26 65 72 72 4d 73 67  umFinish(&errMsg
24780 29 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74  );.  sqlite3Halt
24790 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
247a0 65 2c 20 0a 20 20 20 20 49 73 50 72 69 6d 61 72  e, .    IsPrimar
247b0 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20  yKeyIndex(pIdx) 
247c0 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ? SQLITE_CONSTRA
247d0 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 20 0a  INT_PRIMARYKEY .
247e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247f0 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 53 51              : SQ
24800 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
24810 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72  UNIQUE,.    onEr
24820 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59  ror, zErr, P4_DY
24830 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72  NAMIC, P5_Constr
24840 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a  aintUnique);.}..
24850 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
24860 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f  P_Halt due to no
24870 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a  n-unique rowid..
24880 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
24890 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a  owidConstraint(.
248a0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
248b0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
248c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
248d0 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a  onError,      /*
248e0 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
248f0 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a  tion algorithm *
24900 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  /.  Table *pTab 
24910 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
24920 6c 65 20 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d  le with the non-
24930 75 6e 69 71 75 65 20 72 6f 77 69 64 20 2a 2f 20  unique rowid */ 
24940 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67  .){.  char *zMsg
24950 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
24960 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30  ( pTab->iPKey>=0
24970 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73   ){.    zMsg = s
24980 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
24990 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73  arse->db, "%s.%s
249a0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a  ", pTab->zName,.
249b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249c0 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
249d0 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79  aCol[pTab->iPKey
249e0 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  ].zName);.    rc
249f0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
24a00 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3b  AINT_PRIMARYKEY;
24a10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d  .  }else{.    zM
24a20 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
24a30 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
24a40 22 25 73 2e 72 6f 77 69 64 22 2c 20 70 54 61 62  "%s.rowid", pTab
24a50 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  ->zName);.    rc
24a60 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
24a70 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a  AINT_ROWID;.  }.
24a80 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
24a90 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
24aa0 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73  rc, onError, zMs
24ab0 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20  g, P4_DYNAMIC,. 
24ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ad0 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73 74 72         P5_Constr
24ae0 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a  aintUnique);.}..
24af0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
24b00 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65  ee if pIndex use
24b10 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  s the collating 
24b20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20  sequence pColl. 
24b30 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   Return.** true 
24b40 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66  if it does and f
24b50 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20  alse if it does 
24b60 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  not..*/.#ifndef 
24b70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
24b80 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63  DEX.static int c
24b90 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f  ollationMatch(co
24ba0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c  nst char *zColl,
24bb0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b   Index *pIndex){
24bc0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
24bd0 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a  rt( zColl!=0 );.
24be0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e    for(i=0; i<pIn
24bf0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  dex->nColumn; i+
24c00 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
24c10 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e  ar *z = pIndex->
24c20 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61  azColl[i];.    a
24c30 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70  ssert( z!=0 || p
24c40 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
24c50 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i]<0 );.    if( 
24c60 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
24c70 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c  [i]>=0 && 0==sql
24c80 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a  ite3StrICmp(z, z
24c90 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72  Coll) ){.      r
24ca0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
24cb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
24cc0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
24cd0 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
24ce0 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61  ices of pTab tha
24cf0 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  t use the collat
24d00 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
24d10 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d  ll..** If pColl=
24d20 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
24d30 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
24d40 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65   pTab..*/.#ifnde
24d50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
24d60 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69  INDEX.static voi
24d70 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50  d reindexTable(P
24d80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
24d90 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20  ble *pTab, char 
24da0 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20  const *zColl){. 
24db0 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28   if( !IsVirtual(
24dc0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 49 6e 64  pTab) ){.    Ind
24dd0 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
24de0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
24df0 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
24e00 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20  with pTab */..  
24e10 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61    for(pIndex=pTa
24e20 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  b->pIndex; pInde
24e30 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78  x; pIndex=pIndex
24e40 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
24e50 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20  if( zColl==0 || 
24e60 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a  collationMatch(z
24e70 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b  Coll, pIndex) ){
24e80 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62  .        int iDb
24e90 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
24ea0 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
24eb0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
24ec0 61 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  a);.        sqli
24ed0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
24ee0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
24ef0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
24f00 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
24f10 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
24f20 78 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  x, -1);.      }.
24f30 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
24f40 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  if../*.** Recomp
24f50 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
24f60 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  of all tables in
24f70 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77   all databases w
24f80 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69  here the.** indi
24f90 63 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  ces use the coll
24fa0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
24fb0 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d  Coll.  If pColl=
24fc0 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
24fd0 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73  e.** all indices
24fe0 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a   everywhere..*/.
24ff0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25000 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
25010 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44  ic void reindexD
25020 61 74 61 62 61 73 65 73 28 50 61 72 73 65 20 2a  atabases(Parse *
25030 70 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e  pParse, char con
25040 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62  st *zColl){.  Db
25050 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
25060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
25070 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a  ingle database *
25080 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
25090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250a0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
250b0 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
250c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
250d0 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
250e0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
250f0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61  nnection */.  Ha
25100 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20  shElem *k;      
25110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
25120 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
25130 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20  bles in pDb */. 
25140 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
25150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25160 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
25170 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73  atabase */..  as
25180 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
25190 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65  eeHoldsAllMutexe
251a0 73 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65  s(db) );  /* Nee
251b0 64 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61  ded for schema a
251c0 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69  ccess */.  for(i
251d0 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44  Db=0, pDb=db->aD
251e0 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  b; iDb<db->nDb; 
251f0 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20  iDb++, pDb++){. 
25200 20 20 20 61 73 73 65 72 74 28 20 70 44 62 21 3d     assert( pDb!=
25210 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73  0 );.    for(k=s
25220 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
25230 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
25240 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71  lHash);  k; k=sq
25250 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29  liteHashNext(k))
25260 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28  {.      pTab = (
25270 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73  Table*)sqliteHas
25280 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20  hData(k);.      
25290 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61  reindexTable(pPa
252a0 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c  rse, pTab, zColl
252b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
252c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
252d0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
252e0 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61  he REINDEX comma
252f0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  nd..**.**       
25300 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20   REINDEX        
25310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25320 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20      -- 1.**     
25330 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c     REINDEX  <col
25340 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20  lation>         
25350 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20        -- 2.**   
25360 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c       REINDEX  ?<
25370 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c  database>.?<tabl
25380 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20  ename>  -- 3.** 
25390 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
253a0 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e  ?<database>.?<in
253b0 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a  dexname>  -- 4.*
253c0 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73  *.** Form 1 caus
253d0 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  es all indices i
253e0 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  n all attached d
253f0 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 72  atabases to be r
25400 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20  ebuilt..** Form 
25410 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69  2 rebuilds all i
25420 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61  ndices in all da
25430 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73 65  tabases that use
25440 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f   the named.** co
25450 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
25460 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34  .  Forms 3 and 4
25470 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d   rebuild the nam
25480 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a  ed index or all.
25490 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63  ** indices assoc
254a0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  iated with the n
254b0 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23  amed table..*/.#
254c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
254d0 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20  IT_REINDEX.void 
254e0 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50  sqlite3Reindex(P
254f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
25500 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b  ken *pName1, Tok
25510 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43  en *pName2){.  C
25520 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
25530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
25540 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
25550 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
25560 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
25570 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20  har *z;         
25580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
25590 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  me of a table or
255a0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73   index */.  cons
255b0 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20  t char *zDb;    
255c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
255d0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
255e0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
255f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25600 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
25610 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
25620 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
25630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25640 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
25650 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
25660 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
25670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25680 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69  * The database i
25690 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
256a0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
256b0 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
256c0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
256d0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b  nection */.  Tok
256e0 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20  en *pObjName;   
256f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
25700 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
25710 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69   index to be rei
25720 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  ndexed */..  /* 
25730 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  Read the databas
25740 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20  e schema. If an 
25750 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65  error occurs, le
25760 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
25770 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f  sage.  ** and co
25780 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  de in pParse and
25790 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f   return NULL. */
257a0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
257b0 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
257c0 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
257d0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
257e0 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20    if( pName1==0 
257f0 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61  ){.    reindexDa
25800 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20  tabases(pParse, 
25810 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  0);.    return;.
25820 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45 56 45    }else if( NEVE
25830 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20  R(pName2==0) || 
25840 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a  pName2->z==0 ){.
25850 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b      char *zColl;
25860 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
25870 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43  me1->z );.    zC
25880 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  oll = sqlite3Nam
25890 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
258a0 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  e->db, pName1);.
258b0 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
258c0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f   return;.    pCo
258d0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
258e0 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28  CollSeq(db, ENC(
258f0 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a  db), zColl, 0);.
25900 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
25910 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61  .      reindexDa
25920 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20  tabases(pParse, 
25930 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  zColl);.      sq
25940 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
25950 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65  zColl);.      re
25960 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
25970 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
25980 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20  , zColl);.  }.  
25990 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
259a0 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
259b0 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
259c0 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69   &pObjName);.  i
259d0 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
259e0 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  n;.  z = sqlite3
259f0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
25a00 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69  , pObjName);.  i
25a10 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
25a20 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  zDb = db->aD
25a30 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
25a40 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
25a50 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
25a60 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54  , zDb);.  if( pT
25a70 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  ab ){.    reinde
25a80 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
25a90 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Tab, 0);.    sql
25aa0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
25ab0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
25ac0 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
25ad0 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
25ae0 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71  b, z, zDb);.  sq
25af0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
25b00 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  z);.  if( pIndex
25b10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
25b20 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
25b30 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
25b40 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  b);.    sqlite3R
25b50 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
25b60 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
25b70 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
25b80 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
25b90 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
25ba0 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68  e to identify th
25bb0 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72  e object to be r
25bc0 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65  eindexed");.}.#e
25bd0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
25be0 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  rn a KeyInfo str
25bf0 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20 61  ucture that is a
25c00 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
25c10 68 65 20 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a  he given Index..
25c20 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
25c30 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73   should invoke s
25c40 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
25c50 65 66 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75  ef() on the retu
25c60 72 6e 65 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77  rned object.** w
25c70 68 65 6e 20 69 74 20 68 61 73 20 66 69 6e 69 73  hen it has finis
25c80 68 65 64 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f  hed using it..*/
25c90 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
25ca0 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
25cb0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
25cc0 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69  ndex *pIdx){.  i
25cd0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  nt i;.  int nCol
25ce0 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   = pIdx->nColumn
25cf0 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70  ;.  int nKey = p
25d00 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  Idx->nKeyCol;.  
25d10 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20  KeyInfo *pKey;. 
25d20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
25d30 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
25d40 69 66 28 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f  if( pIdx->uniqNo
25d50 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4b 65  tNull ){.    pKe
25d60 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  y = sqlite3KeyIn
25d70 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  foAlloc(pParse->
25d80 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e  db, nKey, nCol-n
25d90 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Key);.  }else{. 
25da0 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65     pKey = sqlite
25db0 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50  3KeyInfoAlloc(pP
25dc0 61 72 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20  arse->db, nCol, 
25dd0 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b  0);.  }.  if( pK
25de0 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ey ){.    assert
25df0 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
25e00 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
25e10 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ) );.    for(i=0
25e20 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
25e30 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
25e40 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
25e50 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  azColl[i];.     
25e60 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20   pKey->aColl[i] 
25e70 3d 20 7a 43 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33  = zColl==sqlite3
25e80 53 74 72 42 49 4e 41 52 59 20 3f 20 30 20 3a 0a  StrBINARY ? 0 :.
25e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ea0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
25eb0 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
25ec0 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  rse, zColl);.   
25ed0 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72     pKey->aSortOr
25ee0 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61  der[i] = pIdx->a
25ef0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
25f00 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72    }.    if( pPar
25f10 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
25f20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
25f30 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52  ->rc==SQLITE_ERR
25f40 4f 52 5f 4d 49 53 53 49 4e 47 5f 43 4f 4c 4c 53  OR_MISSING_COLLS
25f50 45 51 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  EQ );.      if( 
25f60 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72 79 3d 3d  pIdx->bNoQuery==
25f70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
25f80 44 65 61 63 74 69 76 61 74 65 20 74 68 65 20 69  Deactivate the i
25f90 6e 64 65 78 20 62 65 63 61 75 73 65 20 69 74 20  ndex because it 
25fa0 63 6f 6e 74 61 69 6e 73 20 61 6e 20 75 6e 6b 6e  contains an unkn
25fb0 6f 77 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20  own collating.  
25fc0 20 20 20 20 20 20 2a 2a 20 73 65 71 75 65 6e 63        ** sequenc
25fd0 65 2e 20 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  e.  The only way
25fe0 20 74 6f 20 72 65 61 63 74 69 76 65 20 74 68 65   to reactive the
25ff0 20 69 6e 64 65 78 20 69 73 20 74 6f 20 72 65 6c   index is to rel
26000 6f 61 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  oad the.        
26010 2a 2a 20 73 63 68 65 6d 61 2e 20 20 41 64 64 69  ** schema.  Addi
26020 6e 67 20 74 68 65 20 6d 69 73 73 69 6e 67 20 63  ng the missing c
26030 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
26040 65 20 6c 61 74 65 72 20 64 6f 65 73 20 6e 6f 74  e later does not
26050 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61 63  .        ** reac
26060 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 2e 20  tive the index. 
26070 20 54 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   The application
26080 20 68 61 64 20 74 68 65 20 63 68 61 6e 63 65 20   had the chance 
26090 74 6f 20 72 65 67 69 73 74 65 72 0a 20 20 20 20  to register.    
260a0 20 20 20 20 2a 2a 20 74 68 65 20 6d 69 73 73 69      ** the missi
260b0 6e 67 20 69 6e 64 65 78 20 75 73 69 6e 67 20 74  ng index using t
260c0 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65  he collation-nee
260d0 64 65 64 20 63 61 6c 6c 62 61 63 6b 2e 20 20 46  ded callback.  F
260e0 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69  or.        ** si
260f0 6d 70 6c 69 63 69 74 79 2c 20 53 51 4c 69 74 65  mplicity, SQLite
26100 20 77 69 6c 6c 20 6e 6f 74 20 67 69 76 65 20 74   will not give t
26110 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 61  he application a
26120 20 73 65 63 6f 6e 64 20 63 68 61 6e 63 65 2e 0a   second chance..
26130 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
26140 20 20 20 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72     pIdx->bNoQuer
26150 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  y = 1;.        p
26160 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
26170 54 45 5f 45 52 52 4f 52 5f 52 45 54 52 59 3b 0a  TE_ERROR_RETRY;.
26180 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
26190 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
261a0 66 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 70  f(pKey);.      p
261b0 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Key = 0;.    }. 
261c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79   }.  return pKey
261d0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
261e0 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20  ITE_OMIT_CTE./* 
261f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
26200 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65   is invoked once
26210 20 70 65 72 20 43 54 45 20 62 79 20 74 68 65 20   per CTE by the 
26220 70 61 72 73 65 72 20 77 68 69 6c 65 20 70 61 72  parser while par
26230 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48 20  sing a .** WITH 
26240 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68  clause. .*/.With
26250 20 2a 73 71 6c 69 74 65 33 57 69 74 68 41 64 64   *sqlite3WithAdd
26260 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
26270 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
26280 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
26290 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c  /.  With *pWith,
262a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
262b0 78 69 73 74 69 6e 67 20 57 49 54 48 20 63 6c 61  xisting WITH cla
262c0 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
262d0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
262e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
262f0 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d  e of the common-
26300 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
26310 69 73 74 20 2a 70 41 72 67 6c 69 73 74 2c 20 20  ist *pArglist,  
26320 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63     /* Optional c
26330 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20  olumn name list 
26340 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
26350 0a 20 20 53 65 6c 65 63 74 20 2a 70 51 75 65 72  .  Select *pQuer
26360 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75  y          /* Qu
26370 65 72 79 20 75 73 65 64 20 74 6f 20 69 6e 69 74  ery used to init
26380 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65  ialize the table
26390 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
263a0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
263b0 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65 77 3b  b;.  With *pNew;
263c0 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
263d0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
263e0 20 74 68 65 20 43 54 45 20 6e 61 6d 65 20 69 73   the CTE name is
263f0 20 75 6e 69 71 75 65 20 77 69 74 68 69 6e 20 74   unique within t
26400 68 69 73 20 57 49 54 48 20 63 6c 61 75 73 65 2e  his WITH clause.
26410 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74   If.  ** not, st
26420 6f 72 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ore an error in 
26430 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74  the Parse struct
26440 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20  ure. */.  zName 
26450 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
26460 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
26470 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
26480 20 7a 4e 61 6d 65 20 26 26 20 70 57 69 74 68 20   zName && pWith 
26490 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
264a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69    for(i=0; i<pWi
264b0 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  th->nCte; i++){.
264c0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
264d0 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  3StrICmp(zName, 
264e0 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pWith->a[i].zNam
264f0 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
26500 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
26510 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63  (pParse, "duplic
26520 61 74 65 20 57 49 54 48 20 74 61 62 6c 65 20 6e  ate WITH table n
26530 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29  ame: %s", zName)
26540 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
26550 20 20 7d 0a 0a 20 20 69 66 28 20 70 57 69 74 68    }..  if( pWith
26560 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   ){.    int nByt
26570 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 57 69 74  e = sizeof(*pWit
26580 68 29 20 2b 20 28 73 69 7a 65 6f 66 28 70 57 69  h) + (sizeof(pWi
26590 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74  th->a[1]) * pWit
265a0 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e  h->nCte);.    pN
265b0 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
265c0 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74 68 2c  alloc(db, pWith,
265d0 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
265e0 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  {.    pNew = sql
265f0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
26600 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69  (db, sizeof(*pWi
26610 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  th));.  }.  asse
26620 72 74 28 20 28 70 4e 65 77 21 3d 30 20 26 26 20  rt( (pNew!=0 && 
26630 7a 4e 61 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d  zName!=0) || db-
26640 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
26650 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
26660 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
26670 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
26680 65 6c 65 74 65 28 64 62 2c 20 70 41 72 67 6c 69  elete(db, pArgli
26690 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
266a0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
266b0 20 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71   pQuery);.    sq
266c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
266d0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
266e0 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73   = pWith;.  }els
266f0 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70  e{.    pNew->a[p
26700 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65  New->nCte].pSele
26710 63 74 20 3d 20 70 51 75 65 72 79 3b 0a 20 20 20  ct = pQuery;.   
26720 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
26730 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72  Cte].pCols = pAr
26740 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d  glist;.    pNew-
26750 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a  >a[pNew->nCte].z
26760 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
26770 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
26780 6e 43 74 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20  nCte].zCteErr = 
26790 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74  0;.    pNew->nCt
267a0 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  e++;.  }..  retu
267b0 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
267c0 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65  * Free the conte
267d0 6e 74 73 20 6f 66 20 74 68 65 20 57 69 74 68 20  nts of the With 
267e0 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
267f0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
26800 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
26810 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74 65 28  lite3WithDelete(
26820 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74  sqlite3 *db, Wit
26830 68 20 2a 70 57 69 74 68 29 7b 0a 20 20 69 66 28  h *pWith){.  if(
26840 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e   pWith ){.    in
26850 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
26860 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b  ; i<pWith->nCte;
26870 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
26880 75 63 74 20 43 74 65 20 2a 70 43 74 65 20 3d 20  uct Cte *pCte = 
26890 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20  &pWith->a[i];.  
268a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
268b0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  istDelete(db, pC
268c0 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20  te->pCols);.    
268d0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
268e0 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e  elete(db, pCte->
268f0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
26900 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
26910 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCte->zName);.
26920 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
26930 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 69 74  3DbFree(db, pWit
26940 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  h);.  }.}.#endif
26950 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
26960 49 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f  ITE_OMIT_CTE) */
26970 0a                                               .