/ Hex Artifact Content
Login

Artifact f0bc756bdb18bd5733b1b7cc35a3d4d637c307908a21c279d5a348d7b4b22085:


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 72    *pbUnload = (r
2750: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2760: 28 69 44 62 21 3d 31 29 29 3b 0a 20 20 7d 0a 20  (iDb!=1));.  }. 
2770: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2780: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
2790: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
27a0: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
27b0: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
27c0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
27d0: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
27e0: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
27f0: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
2800: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
2810: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
2820: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
2830: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
2840: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
2850: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
2860: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
2870: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
2880: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61   for the table a
2890: 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  nd the.** first 
28a0: 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69  matching table i
28b0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
28c0: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75   checking for du
28d0: 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a  plicate table.**
28e0: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
28f0: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
2900: 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73 74  er is TEMP first
2910: 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65  , then MAIN, the
2920: 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61  n any.** auxilia
2930: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
2940: 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54  ed using the ATT
2950: 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  ACH command..**.
2960: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
2970: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29  te3LocateTable()
2980: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
2990: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c  te3FindTable(sql
29a0: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
29b0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
29c0: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61  st char *zDataba
29d0: 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20  se){.  Table *p 
29e0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  = 0;.  int i;.. 
29f0: 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20   /* All mutexes 
2a00: 61 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  are required for
2a10: 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20   schema access. 
2a20: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f   Make sure we ho
2a30: 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73  ld them. */.  as
2a40: 73 65 72 74 28 20 7a 44 61 74 61 62 61 73 65 21  sert( zDatabase!
2a50: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72  =0 || sqlite3Btr
2a60: 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65  eeHoldsAllMutexe
2a70: 73 28 64 62 29 20 29 3b 0a 23 69 66 20 53 51 4c  s(db) );.#if SQL
2a80: 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
2a90: 49 43 41 54 49 4f 4e 0a 20 20 2f 2a 20 4f 6e 6c  ICATION.  /* Onl
2aa0: 79 20 74 68 65 20 61 64 6d 69 6e 20 75 73 65 72  y the admin user
2ab0: 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6b   is allowed to k
2ac0: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73 71 6c  now that the sql
2ad0: 69 74 65 5f 75 73 65 72 20 74 61 62 6c 65 0a 20  ite_user table. 
2ae0: 20 2a 2a 20 65 78 69 73 74 73 20 2a 2f 0a 20 20   ** exists */.  
2af0: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
2b00: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 41 64 6d  hLevel<UAUTH_Adm
2b10: 69 6e 20 26 26 20 73 71 6c 69 74 65 33 55 73 65  in && sqlite3Use
2b20: 72 41 75 74 68 54 61 62 6c 65 28 7a 4e 61 6d 65  rAuthTable(zName
2b30: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
2b40: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
2b50: 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20  .  while(1){.   
2b60: 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50   for(i=OMIT_TEMP
2b70: 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  DB; i<db->nDb; i
2b80: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
2b90: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
2ba0: 20 69 3b 20 20 20 2f 2a 20 53 65 61 72 63 68 20   i;   /* Search 
2bb0: 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e  TEMP before MAIN
2bc0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 44   */.      if( zD
2bd0: 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 73 71  atabase==0 || sq
2be0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 61  lite3StrICmp(zDa
2bf0: 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b  tabase, db->aDb[
2c00: 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29 3d 3d 30 20  j].zDbSName)==0 
2c10: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  ){.        int b
2c20: 55 6e 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20  Unload = 0;.    
2c30: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2c40: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
2c50: 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a  ld(db, j, 0) );.
2c60: 20 20 20 20 20 20 20 20 69 66 28 20 49 73 52 65          if( IsRe
2c70: 75 73 65 53 63 68 65 6d 61 28 64 62 29 20 29 7b  useSchema(db) ){
2c80: 0a 20 20 20 20 20 20 20 20 20 20 50 61 72 73 65  .          Parse
2c90: 20 2a 70 50 61 72 73 65 20 3d 20 64 62 2d 3e 70   *pParse = db->p
2ca0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
2cb0: 20 69 66 28 20 70 50 61 72 73 65 20 26 26 20 70   if( pParse && p
2cc0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
2cd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  {.            pP
2ce0: 61 72 73 65 2d 3e 72 63 20 3d 20 73 71 6c 69 74  arse->rc = sqlit
2cf0: 65 33 53 63 68 65 6d 61 4c 6f 61 64 28 64 62 2c  e3SchemaLoad(db,
2d00: 20 6a 2c 20 26 62 55 6e 6c 6f 61 64 2c 20 26 70   j, &bUnload, &p
2d10: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29 3b  Parse->zErrMsg);
2d20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2d30: 20 70 50 61 72 73 65 2d 3e 72 63 20 29 20 70 50   pParse->rc ) pP
2d40: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
2d50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d60: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 20 3d 20    }.        p = 
2d70: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2d80: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68  &db->aDb[j].pSch
2d90: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e  ema->tblHash, zN
2da0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
2db0: 28 20 70 20 29 20 72 65 74 75 72 6e 20 70 3b 0a  ( p ) return p;.
2dc0: 20 20 20 20 20 20 20 20 69 66 28 20 62 55 6e 6c          if( bUnl
2dd0: 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oad ){.         
2de0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 52 65   sqlite3SchemaRe
2df0: 6c 65 61 73 65 28 64 62 2c 20 6a 29 3b 0a 20 20  lease(db, j);.  
2e00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2e10: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4e 6f 74      }.    /* Not
2e20: 20 66 6f 75 6e 64 2e 20 20 49 66 20 74 68 65 20   found.  If the 
2e30: 6e 61 6d 65 20 77 65 20 77 65 72 65 20 6c 6f 6f  name we were loo
2e40: 6b 69 6e 67 20 66 6f 72 20 77 61 73 20 74 65 6d  king for was tem
2e50: 70 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a  p.sqlite_master.
2e60: 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e      ** then chan
2e70: 67 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 73  ge the name to s
2e80: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
2e90: 72 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e  r and try again.
2ea0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
2eb0: 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65  te3StrICmp(zName
2ec0: 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 29 21 3d  , MASTER_NAME)!=
2ed0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
2ee0: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
2ef0: 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62  mp(zDatabase, db
2f00: 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[1].zDbSNam
2f10: 65 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)!=0 ) break;. 
2f20: 20 20 20 7a 4e 61 6d 65 20 3d 20 54 45 4d 50 5f     zName = TEMP_
2f30: 4d 41 53 54 45 52 5f 4e 41 4d 45 3b 0a 20 20 7d  MASTER_NAME;.  }
2f40: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2f50: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
2f60: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
2f70: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
2f80: 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  bes a particular
2f90: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62   database.** tab
2fa0: 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  le given the nam
2fb0: 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  e of that table 
2fc0: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
2fd0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
2fe0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
2ff0: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
3000: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
3010: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41  if not found.  A
3020: 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20  lso leave an.** 
3030: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
3040: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
3050: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
3060: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
3070: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
3080: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
3090: 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
30a0: 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65  ** routine leave
30b0: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
30c0: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
30d0: 72 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73  rrMsg where.** s
30e0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
30f0: 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54  ) does not..*/.T
3100: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63  able *sqlite3Loc
3110: 61 74 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73  ateTable(.  Pars
3120: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3130: 20 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e     /* context in
3140: 20 77 68 69 63 68 20 74 6f 20 72 65 70 6f 72 74   which to report
3150: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 33 32   errors */.  u32
3160: 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
3170: 20 20 20 20 2f 2a 20 4c 4f 43 41 54 45 5f 56 49      /* LOCATE_VI
3180: 45 57 20 6f 72 20 4c 4f 43 41 54 45 5f 4e 4f 45  EW or LOCATE_NOE
3190: 52 52 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  RR */.  const ch
31a0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f  ar *zName,     /
31b0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
31c0: 62 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  ble we are looki
31d0: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  ng for */.  cons
31e0: 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20  t char *zDbase  
31f0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3200: 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67  e database.  Mig
3210: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
3220: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73  .  Table *p;.  s
3230: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
3240: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52  rse->db;..  /* R
3250: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
3260: 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
3270: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
3280: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
3290: 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
32a0: 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
32b0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
32c0: 20 20 69 66 28 20 28 64 62 2d 3e 6d 44 62 46 6c    if( (db->mDbFl
32d0: 61 67 73 20 26 20 44 42 46 4c 41 47 5f 53 63 68  ags & DBFLAG_Sch
32e0: 65 6d 61 4b 6e 6f 77 6e 4f 6b 29 3d 3d 30 20 0a  emaKnownOk)==0 .
32f0: 20 20 20 26 26 20 21 49 73 52 65 75 73 65 53 63     && !IsReuseSc
3300: 68 65 6d 61 28 64 62 29 0a 20 20 20 26 26 20 53  hema(db).   && S
3310: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
3320: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
3330: 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  se).  ){.    ret
3340: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20  urn 0;.  }..  p 
3350: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
3360: 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  le(db, zName, zD
3370: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
3380: 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
3390: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
33a0: 54 41 42 4c 45 0a 20 20 20 20 2f 2a 20 49 66 20  TABLE.    /* If 
33b0: 7a 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 6f 74  zName is the not
33c0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74   the name of a t
33d0: 61 62 6c 65 20 69 6e 20 74 68 65 20 73 63 68 65  able in the sche
33e0: 6d 61 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  ma created using
33f0: 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 2c 20  .    ** CREATE, 
3400: 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65  then check to se
3410: 65 20 69 66 20 69 74 20 69 73 20 74 68 65 20 6e  e if it is the n
3420: 61 6d 65 20 6f 66 20 61 6e 20 76 69 72 74 75 61  ame of an virtua
3430: 6c 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20  l table that.   
3440: 20 2a 2a 20 63 61 6e 20 62 65 20 61 6e 20 65 70   ** can be an ep
3450: 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20  onymous virtual 
3460: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66  table. */.    if
3470: 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
3480: 65 56 74 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  eVtab==0 ){.    
3490: 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d    Module *pMod =
34a0: 20 28 4d 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65   (Module*)sqlite
34b0: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
34c0: 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a  Module, zName);.
34d0: 20 20 20 20 20 20 69 66 28 20 70 4d 6f 64 3d 3d        if( pMod==
34e0: 30 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72  0 && sqlite3_str
34f0: 6e 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72  nicmp(zName, "pr
3500: 61 67 6d 61 5f 22 2c 20 37 29 3d 3d 30 20 29 7b  agma_", 7)==0 ){
3510: 0a 20 20 20 20 20 20 20 20 70 4d 6f 64 20 3d 20  .        pMod = 
3520: 73 71 6c 69 74 65 33 50 72 61 67 6d 61 56 74 61  sqlite3PragmaVta
3530: 62 52 65 67 69 73 74 65 72 28 64 62 2c 20 7a 4e  bRegister(db, zN
3540: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
3550: 20 20 20 20 69 66 28 20 70 4d 6f 64 20 29 7b 0a      if( pMod ){.
3560: 20 20 20 20 20 20 20 20 69 66 28 20 49 73 52 65          if( IsRe
3570: 75 73 65 53 63 68 65 6d 61 28 64 62 29 20 26 26  useSchema(db) &&
3580: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
3590: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
35a0: 74 20 62 44 75 6d 6d 79 20 3d 20 30 3b 0a 20 20  t bDummy = 0;.  
35b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
35c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  rc = sqlite3Sche
35d0: 6d 61 4c 6f 61 64 28 64 62 2c 20 30 2c 20 26 62  maLoad(db, 0, &b
35e0: 44 75 6d 6d 79 2c 20 26 70 50 61 72 73 65 2d 3e  Dummy, &pParse->
35f0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
3600: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
3610: 72 63 20 29 20 70 50 61 72 73 65 2d 3e 6e 45 72  rc ) pParse->nEr
3620: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  r++;.        }. 
3630: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
3640: 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54  e3VtabEponymousT
3650: 61 62 6c 65 49 6e 69 74 28 70 50 61 72 73 65 2c  ableInit(pParse,
3660: 20 70 4d 6f 64 29 20 29 7b 0a 20 20 20 20 20 20   pMod) ){.      
3670: 20 20 20 20 54 61 62 6c 65 20 2a 70 45 70 6f 54      Table *pEpoT
3680: 61 62 20 3d 20 70 4d 6f 64 2d 3e 70 45 70 6f 54  ab = pMod->pEpoT
3690: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ab;.          as
36a0: 73 65 72 74 28 20 49 73 52 65 75 73 65 53 63 68  sert( IsReuseSch
36b0: 65 6d 61 28 64 62 29 20 7c 7c 20 70 45 70 6f 54  ema(db) || pEpoT
36c0: 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  ab->pSchema==db-
36d0: 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20  >aDb[0].pSchema 
36e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 70  );.          pEp
36f0: 6f 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20  oTab->pSchema = 
3700: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65  db->aDb[0].pSche
3710: 6d 61 3b 20 20 2f 2a 20 46 6f 72 20 53 48 41 52  ma;  /* For SHAR
3720: 45 44 5f 53 43 48 45 4d 41 20 6d 6f 64 65 20 2a  ED_SCHEMA mode *
3730: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
3740: 72 6e 20 70 45 70 6f 54 61 62 3b 0a 20 20 20 20  rn pEpoTab;.    
3750: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3760: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
3770: 66 28 20 66 6c 61 67 73 20 26 20 4c 4f 43 41 54  f( flags & LOCAT
3780: 45 5f 4e 4f 45 52 52 20 29 20 72 65 74 75 72 6e  E_NOERR ) return
3790: 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   0;.    pParse->
37a0: 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
37b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56  .  }else if( IsV
37c0: 69 72 74 75 61 6c 28 70 29 20 26 26 20 70 50 61  irtual(p) && pPa
37d0: 72 73 65 2d 3e 64 69 73 61 62 6c 65 56 74 61 62  rse->disableVtab
37e0: 20 29 7b 0a 20 20 20 20 70 20 3d 20 30 3b 0a 20   ){.    p = 0;. 
37f0: 20 7d 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 26   }..  if( p==0 &
3800: 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  & pParse->nErr==
3810: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
3820: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 66 6c 61 67  har *zMsg = flag
3830: 73 20 26 20 4c 4f 43 41 54 45 5f 56 49 45 57 20  s & LOCATE_VIEW 
3840: 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22  ? "no such view"
3850: 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c   : "no such tabl
3860: 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 61  e";.    if( zDba
3870: 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  se ){.      sqli
3880: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3890: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c  se, "%s: %s.%s",
38a0: 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a   zMsg, zDbase, z
38b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
38c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
38d0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
38e0: 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20  "%s: %s", zMsg, 
38f0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
3900: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  }..  return p;.}
3910: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
3920: 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66  he table identif
3930: 69 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a  ied by *p..**.**
3940: 20 54 68 69 73 20 69 73 20 61 20 77 72 61 70 70   This is a wrapp
3950: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
3960: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20  3LocateTable(). 
3970: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
3980: 65 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65  etween.** sqlite
3990: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61  3LocateTable() a
39a0: 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
39b0: 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
39c0: 6e 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73  nction restricts
39d0: 0a 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 74  .** the search t
39e0: 6f 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63  o schema (p->pSc
39f0: 68 65 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e  hema) if it is n
3a00: 6f 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68  ot NULL. p->pSch
3a10: 65 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f  ema may be.** no
3a20: 6e 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20  n-NULL if it is 
3a30: 70 61 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f  part of a view o
3a40: 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  r trigger progra
3a50: 6d 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65  m definition. Se
3a60: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53  e.** sqlite3FixS
3a70: 72 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74  rcList() for det
3a80: 61 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  ails..*/.Table *
3a90: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
3aa0: 6c 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20  leItem(.  Parse 
3ab0: 2a 70 50 61 72 73 65 2c 20 0a 20 20 75 33 32 20  *pParse, .  u32 
3ac0: 66 6c 61 67 73 2c 0a 20 20 73 74 72 75 63 74 20  flags,.  struct 
3ad0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a  SrcList_item *p.
3ae0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
3af0: 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20  *zDb;.  assert( 
3b00: 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c  p->pSchema==0 ||
3b10: 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30   p->zDatabase==0
3b20: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 63   );.  if( p->pSc
3b30: 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74 20  hema ){.    int 
3b40: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
3b50: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
3b60: 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  e->db, p->pSchem
3b70: 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70 50  a);.    zDb = pP
3b80: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
3b90: 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 7d  b].zDbSName;.  }
3ba0: 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20  else{.    zDb = 
3bb0: 70 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20  p->zDatabase;.  
3bc0: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
3bd0: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
3be0: 61 72 73 65 2c 20 66 6c 61 67 73 2c 20 70 2d 3e  arse, flags, p->
3bf0: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a  zName, zDb);.}..
3c00: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
3c10: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
3c20: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
3c30: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
3c40: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
3c50: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
3c60: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
3c70: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
3c80: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
3c90: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
3ca0: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
3cb0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
3cc0: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
3cd0: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
3ce0: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
3cf0: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
3d00: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
3d10: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
3d20: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
3d30: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
3d40: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
3d50: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
3d60: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
3d70: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
3d80: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
3d90: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
3da0: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
3db0: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
3dc0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
3dd0: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
3de0: 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  e3FindIndex(sqli
3df0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
3e00: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
3e10: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
3e20: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
3e30: 69 6e 74 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20  int i;.  /* All 
3e40: 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71 75  mutexes are requ
3e50: 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20  ired for schema 
3e60: 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75  access.  Make su
3e70: 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e  re we hold them.
3e80: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44   */.  assert( zD
3e90: 62 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42  b!=0 || sqlite3B
3ea0: 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65  treeHoldsAllMute
3eb0: 78 65 73 28 64 62 29 20 29 3b 0a 20 20 66 6f 72  xes(db) );.  for
3ec0: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
3ed0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
3ee0: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
3ef0: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f  2) ? i^1 : i;  /
3f00: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
3f10: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
3f20: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
3f30: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53   = db->aDb[j].pS
3f40: 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72  chema;.    asser
3f50: 74 28 20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  t( pSchema );.  
3f60: 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c    if( zDb && sql
3f70: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
3f80: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53   db->aDb[j].zDbS
3f90: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
3fa0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
3fb0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
3fc0: 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29  Held(db, j, 0) )
3fd0: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
3fe0: 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68 65  3HashFind(&pSche
3ff0: 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61  ma->idxHash, zNa
4000: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
4010: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
4020: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
4030: 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d   Reclaim the mem
4040: 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20 69  ory used by an i
4050: 6e 64 65 78 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ndex.*/.void sql
4060: 69 74 65 33 46 72 65 65 49 6e 64 65 78 28 73 71  ite3FreeIndex(sq
4070: 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78  lite3 *db, Index
4080: 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53 51   *p){.#ifndef SQ
4090: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a  LITE_OMIT_ANALYZ
40a0: 45 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74  E.  sqlite3Delet
40b0: 65 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 64 62  eIndexSamples(db
40c0: 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  , p);.#endif.  s
40d0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
40e0: 28 64 62 2c 20 70 2d 3e 70 50 61 72 74 49 64 78  (db, p->pPartIdx
40f0: 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
4100: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
4110: 64 62 2c 20 70 2d 3e 61 43 6f 6c 45 78 70 72 29  db, p->aColExpr)
4120: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
4130: 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66  e(db, p->zColAff
4140: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65  );.  if( p->isRe
4150: 73 69 7a 65 64 20 29 20 73 71 6c 69 74 65 33 44  sized ) sqlite3D
4160: 62 46 72 65 65 28 64 62 2c 20 28 76 6f 69 64 20  bFree(db, (void 
4170: 2a 29 70 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 23 69  *)p->azColl);.#i
4180: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
4190: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
41a0: 34 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  4.  sqlite3_free
41b0: 28 70 2d 3e 61 69 52 6f 77 45 73 74 29 3b 0a 23  (p->aiRowEst);.#
41c0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44  endif.  sqlite3D
41d0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
41e0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69  ./*.** For the i
41f0: 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78  ndex called zIdx
4200: 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f  Name which is fo
4210: 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  und in the datab
4220: 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69  ase iDb,.** unli
4230: 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66 72  ke that index fr
4240: 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68 65  om its Table the
4250: 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  n remove the ind
4260: 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69  ex from.** the i
4270: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 20  ndex hash table 
4280: 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d  and free all mem
4290: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 61  ory structures a
42a0: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
42b0: 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a  h the index..*/.
42c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
42d0: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
42e0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
42f0: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
4300: 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20  r *zIdxName){.  
4310: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
4320: 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20   Hash *pHash;.. 
4330: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4340: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
4350: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
4360: 20 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44   pHash = &db->aD
4370: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
4380: 69 64 78 48 61 73 68 3b 0a 20 20 70 49 6e 64 65  idxHash;.  pInde
4390: 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  x = sqlite3HashI
43a0: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64  nsert(pHash, zId
43b0: 78 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28  xName, 0);.  if(
43c0: 20 41 4c 57 41 59 53 28 70 49 6e 64 65 78 29 20   ALWAYS(pIndex) 
43d0: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  ){.    if( pInde
43e0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
43f0: 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  x==pIndex ){.   
4400: 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c     pIndex->pTabl
4410: 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  e->pIndex = pInd
4420: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ex->pNext;.    }
4430: 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
4440: 78 20 2a 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a  x *p;.      /* J
4450: 75 73 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20  ustification of 
4460: 41 4c 57 41 59 53 28 29 3b 20 20 54 68 65 20 69  ALWAYS();  The i
4470: 6e 64 65 78 20 6d 75 73 74 20 62 65 20 6f 6e 20  ndex must be on 
4480: 74 68 65 20 6c 69 73 74 20 6f 66 0a 20 20 20 20  the list of.    
4490: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f    ** indices. */
44a0: 0a 20 20 20 20 20 20 70 20 3d 20 70 49 6e 64 65  .      p = pInde
44b0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
44c0: 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  x;.      while( 
44d0: 41 4c 57 41 59 53 28 70 29 20 26 26 20 70 2d 3e  ALWAYS(p) && p->
44e0: 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 20 29 7b  pNext!=pIndex ){
44f0: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d   p = p->pNext; }
4500: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
4510: 53 28 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d  S(p && p->pNext=
4520: 3d 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20  =pIndex) ){.    
4530: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
4540: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
4550: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
4560: 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65 78  sqlite3FreeIndex
4570: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
4580: 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73  }.  db->mDbFlags
4590: 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d   |= DBFLAG_Schem
45a0: 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  aChange;.}../*.*
45b0: 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20 74  * Look through t
45c0: 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20  he list of open 
45d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 69  database files i
45e0: 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64 20  n db->aDb[] and 
45f0: 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20 62  if.** any have b
4600: 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d 6f  een closed, remo
4610: 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
4620: 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63 61   list.  Realloca
4630: 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61 44  te the.** db->aD
4640: 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74 6f  b[] structure to
4650: 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65 2c   a smaller size,
4660: 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a   if possible..**
4670: 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68 65  .** Entry 0 (the
4680: 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73 65   "main" database
4690: 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28 74  ) and entry 1 (t
46a0: 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62 61  he "temp" databa
46b0: 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65 72  se).** are never
46c0: 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20   candidates for 
46d0: 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64 2e  being collapsed.
46e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
46f0: 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65  CollapseDatabase
4700: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64  Array(sqlite3 *d
4710: 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  b){.  int i, j;.
4720: 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64    for(i=j=2; i<d
4730: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
4740: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
4750: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
4760: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
4770: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
4780: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4790: 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a 20  Db->zDbSName);. 
47a0: 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61       pDb->zDbSNa
47b0: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f  me = 0;.      co
47c0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
47d0: 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20    if( j<i ){.   
47e0: 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20     db->aDb[j] = 
47f0: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
4800: 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  }.    j++;.  }. 
4810: 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20   db->nDb = j;.  
4820: 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26  if( db->nDb<=2 &
4830: 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61  & db->aDb!=db->a
4840: 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20  DbStatic ){.    
4850: 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74  memcpy(db->aDbSt
4860: 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32  atic, db->aDb, 2
4870: 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b  *sizeof(db->aDb[
4880: 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  0]));.    sqlite
4890: 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e  3DbFree(db, db->
48a0: 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44  aDb);.    db->aD
48b0: 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69  b = db->aDbStati
48c0: 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
48d0: 52 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61  Reset the schema
48e0: 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
48f0: 65 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e 20  e at index iDb. 
4900: 20 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65 0a   Also reset the.
4910: 2a 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 20  ** TEMP schema. 
4920: 20 54 68 65 20 72 65 73 65 74 20 69 73 20 64 65   The reset is de
4930: 66 65 72 72 65 64 20 69 66 20 64 62 2d 3e 6e 53  ferred if db->nS
4940: 63 68 65 6d 61 4c 6f 63 6b 20 69 73 20 6e 6f 74  chemaLock is not
4950: 20 7a 65 72 6f 2e 0a 2a 2a 20 44 65 66 65 72 72   zero..** Deferr
4960: 65 64 20 72 65 73 65 74 73 20 6d 61 79 20 62 65  ed resets may be
4970: 20 72 75 6e 20 62 79 20 63 61 6c 6c 69 6e 67 20   run by calling 
4980: 77 69 74 68 20 69 44 62 3c 30 2e 0a 2a 2f 0a 76  with iDb<0..*/.v
4990: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74  oid sqlite3Reset
49a0: 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74 65  OneSchema(sqlite
49b0: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b  3 *db, int iDb){
49c0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
49d0: 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20  rt( iDb<db->nDb 
49e0: 29 3b 0a 0a 20 20 69 66 28 20 69 44 62 3e 3d 30  );..  if( iDb>=0
49f0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4a00: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
4a10: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
4a20: 30 29 20 29 3b 0a 20 20 20 20 44 62 53 65 74 50  0) );.    DbSetP
4a30: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c  roperty(db, iDb,
4a40: 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29   DB_ResetWanted)
4a50: 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65  ;.    DbSetPrope
4a60: 72 74 79 28 64 62 2c 20 31 2c 20 44 42 5f 52 65  rty(db, 1, DB_Re
4a70: 73 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 20 20  setWanted);.    
4a80: 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20  db->mDbFlags &= 
4a90: 7e 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e  ~DBFLAG_SchemaKn
4aa0: 6f 77 6e 4f 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  ownOk;.  }.  if(
4ab0: 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b   db->nSchemaLock
4ac0: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ==0 ){.    for(i
4ad0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
4ae0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 44  ++){.      if( D
4af0: 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
4b00: 20 69 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74   i, DB_ResetWant
4b10: 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ed) ){.        s
4b20: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
4b30: 72 4f 72 44 69 73 63 6f 6e 6e 65 63 74 28 64 62  rOrDisconnect(db
4b40: 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
4b50: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
4b60: 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d   Erase all schem
4b70: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  a information fr
4b80: 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  om all attached 
4b90: 64 61 74 61 62 61 73 65 73 20 28 69 6e 63 6c 75  databases (inclu
4ba0: 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61  ding.** "main" a
4bb0: 6e 64 20 22 74 65 6d 70 22 29 20 66 6f 72 20 61  nd "temp") for a
4bc0: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
4bd0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
4be0: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
4bf0: 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
4c00: 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  nection(sqlite3 
4c10: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
4c20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
4c30: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72  erAll(db);.  for
4c40: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
4c50: 20 69 3d 28 69 3f 69 2b 31 3a 32 29 29 7b 0a 20   i=(i?i+1:2)){. 
4c60: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
4c70: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
4c80: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 29  ( pDb->pSchema )
4c90: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
4ca0: 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29  nSchemaLock==0 )
4cb0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4cc0: 33 53 63 68 65 6d 61 43 6c 65 61 72 4f 72 44 69  3SchemaClearOrDi
4cd0: 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 69 29 3b  sconnect(db, i);
4ce0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4cf0: 20 20 20 20 20 20 44 62 53 65 74 50 72 6f 70 65        DbSetPrope
4d00: 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 52 65  rty(db, i, DB_Re
4d10: 73 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 20 20  setWanted);.    
4d20: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
4d30: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65  sqlite3SchemaCle
4d40: 61 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  ar(db->aDb[1].pS
4d50: 63 68 65 6d 61 29 3b 0a 20 20 64 62 2d 3e 6d 44  chema);.  db->mD
4d60: 62 46 6c 61 67 73 20 26 3d 20 7e 28 44 42 46 4c  bFlags &= ~(DBFL
4d70: 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 7c  AG_SchemaChange|
4d80: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e 6f  DBFLAG_SchemaKno
4d90: 77 6e 4f 6b 29 3b 0a 20 20 73 71 6c 69 74 65 33  wnOk);.  sqlite3
4da0: 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64  VtabUnlockList(d
4db0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  b);.  sqlite3Btr
4dc0: 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
4dd0: 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68 65 6d    if( db->nSchem
4de0: 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  aLock==0 ){.    
4df0: 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44  sqlite3CollapseD
4e00: 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62 29  atabaseArray(db)
4e10: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
4e20: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
4e30: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d  alled when a com
4e40: 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76  mit occurs..*/.v
4e50: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
4e60: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
4e70: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
4e80: 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d   db->mDbFlags &=
4e90: 20 7e 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43   ~DBFLAG_SchemaC
4ea0: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
4eb0: 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20 61 6c  Delete memory al
4ec0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
4ed0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 20  column names of 
4ee0: 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  a table or view 
4ef0: 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e 61 43  (the.** Table.aC
4f00: 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a 2f 0a  ol[] array)..*/.
4f10: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
4f20: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73 71  teColumnNames(sq
4f30: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
4f40: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74   *pTable){.  int
4f50: 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43   i;.  Column *pC
4f60: 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  ol;.  assert( pT
4f70: 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  able!=0 );.  if(
4f80: 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d   (pCol = pTable-
4f90: 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20  >aCol)!=0 ){.   
4fa0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
4fb0: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  le->nCol; i++, p
4fc0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  Col++){.      sq
4fd0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4fe0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
4ff0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
5000: 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  elete(db, pCol->
5010: 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71  pDflt);.      sq
5020: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5030: 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20  pCol->zColl);.  
5040: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
5050: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
5060: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a  ->aCol);.  }.}..
5070: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
5080: 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72   memory data str
5090: 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
50a0: 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
50b0: 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20  n.** Table.  No 
50c0: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
50d0: 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73   to disk by this
50e0: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
50f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
5100: 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61  t deletes the da
5110: 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  ta structure.  I
5120: 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e  t does not unlin
5130: 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64  k.** the table d
5140: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72  ata structure fr
5150: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
5160: 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20  e.  But it does 
5170: 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72  destroy.** memor
5180: 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  y structures of 
5190: 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  the indices and 
51a0: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73  foreign keys ass
51b0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a  ociated with .**
51c0: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
51d0: 2a 20 54 68 65 20 64 62 20 70 61 72 61 6d 65 74  * The db paramet
51e0: 65 72 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20  er is optional. 
51f0: 20 49 74 20 69 73 20 6e 65 65 64 65 64 20 69 66   It is needed if
5200: 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
5210: 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6c  t .** contains l
5220: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e  ookaside memory.
5230: 20 20 28 54 61 62 6c 65 20 6f 62 6a 65 63 74 73    (Table objects
5240: 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 64   in the schema d
5250: 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f  o not use.** loo
5260: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2c 20 62  kaside memory, b
5270: 75 74 20 73 6f 6d 65 20 65 70 68 65 6d 65 72 61  ut some ephemera
5280: 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20  l Table objects 
5290: 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a 2a 2a 20  do.)  Or the.** 
52a0: 64 62 20 70 61 72 61 6d 65 74 65 72 20 63 61 6e  db parameter can
52b0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 64 62   be used with db
52c0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 74  ->pnBytesFreed t
52d0: 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20 6d 65  o measure the me
52e0: 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20 62 79 20  mory.** used by 
52f0: 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
5300: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5310: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
5320: 20 64 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c   deleteTable(sql
5330: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
5340: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65  *pTable){.  Inde
5350: 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78  x *pIndex, *pNex
5360: 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t;..#ifdef SQLIT
5370: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 52 65 63  E_DEBUG.  /* Rec
5380: 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ord the number o
5390: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
53a0: 6f 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61 74 69  okaside allocati
53b0: 6f 6e 73 20 69 6e 20 73 63 68 65 6d 61 20 54 61  ons in schema Ta
53c0: 62 6c 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20  bles.  ** prior 
53d0: 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 66 72 65  to doing any fre
53e0: 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  e() operations. 
53f0: 20 53 69 6e 63 65 20 73 63 68 65 6d 61 20 54 61   Since schema Ta
5400: 62 6c 65 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a  bles do not use.
5410: 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20    ** lookaside, 
5420: 74 68 69 73 20 6e 75 6d 62 65 72 20 73 68 6f 75  this number shou
5430: 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a  ld not change. *
5440: 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69  /.  int nLookasi
5450: 64 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 64 62  de = 0;.  if( db
5460: 20 26 26 20 28 70 54 61 62 6c 65 2d 3e 74 61 62   && (pTable->tab
5470: 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
5480: 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eral)==0 ){.    
5490: 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 73 71 6c  nLookaside = sql
54a0: 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65  ite3LookasideUse
54b0: 64 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  d(db, 0);.  }.#e
54c0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  ndif..  /* Delet
54d0: 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73  e all indices as
54e0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
54f0: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66  is table. */.  f
5500: 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62  or(pIndex = pTab
5510: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  le->pIndex; pInd
5520: 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74  ex; pIndex=pNext
5530: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
5540: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
5550: 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
5560: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c  ->pSchema==pTabl
5570: 65 2d 3e 70 53 63 68 65 6d 61 0a 20 20 20 20 20  e->pSchema.     
5580: 20 20 20 20 7c 7c 20 28 49 73 56 69 72 74 75 61      || (IsVirtua
5590: 6c 28 70 54 61 62 6c 65 29 20 26 26 20 70 49 6e  l(pTable) && pIn
55a0: 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51  dex->idxType!=SQ
55b0: 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50  LITE_IDXTYPE_APP
55c0: 44 45 46 29 20 29 3b 0a 20 20 20 20 69 66 28 20  DEF) );.    if( 
55d0: 28 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e  (db==0 || db->pn
55e0: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26  BytesFreed==0) &
55f0: 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  & !IsVirtual(pTa
5600: 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68  ble) ){.      ch
5610: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64  ar *zName = pInd
5620: 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20  ex->zName; .    
5630: 20 20 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64    TESTONLY ( Ind
5640: 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c  ex *pOld = ) sql
5650: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 0a  ite3HashInsert(.
5660: 20 20 20 20 20 20 20 20 20 26 70 49 6e 64 65 78           &pIndex
5670: 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
5680: 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20  sh, zName, 0.   
5690: 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
56a0: 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c  rt( db==0 || sql
56b0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
56c0: 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65  eld(db, 0, pInde
56d0: 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  x->pSchema) );. 
56e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c       assert( pOl
56f0: 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c  d==pIndex || pOl
5700: 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  d==0 );.    }.  
5710: 20 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64    sqlite3FreeInd
5720: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
5730: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
5740: 20 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79   any foreign key
5750: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  s attached to th
5760: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73  is table. */.  s
5770: 71 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28 64  qlite3FkDelete(d
5780: 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f  b, pTable);..  /
5790: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62  * Delete the Tab
57a0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73  le structure its
57b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  elf..  */.  sqli
57c0: 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  te3DeleteColumnN
57d0: 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29  ames(db, pTable)
57e0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
57f0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  e(db, pTable->zN
5800: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
5810: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
5820: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71  ->zColAff);.  sq
5830: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
5840: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53  e(db, pTable->pS
5850: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
5860: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
5870: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65  db, pTable->pChe
5880: 63 6b 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ck);.#ifndef SQL
5890: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
58a0: 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 56  TABLE.  sqlite3V
58b0: 74 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54 61  tabClear(db, pTa
58c0: 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  ble);.#endif.  s
58d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
58e0: 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20   pTable);..  /* 
58f0: 56 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20 6c  Verify that no l
5900: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20  ookaside memory 
5910: 77 61 73 20 75 73 65 64 20 62 79 20 73 63 68 65  was used by sche
5920: 6d 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61  ma tables */.  a
5930: 73 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64  ssert( nLookasid
5940: 65 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69  e==0 || nLookasi
5950: 64 65 3d 3d 73 71 6c 69 74 65 33 4c 6f 6f 6b 61  de==sqlite3Looka
5960: 73 69 64 65 55 73 65 64 28 64 62 2c 30 29 20 29  sideUsed(db,0) )
5970: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
5980: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
5990: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  te3 *db, Table *
59a0: 70 54 61 62 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f  pTable){.  /* Do
59b0: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
59c0: 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20  table until the 
59d0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
59e0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f  reaches zero. */
59f0: 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20 29  .  if( !pTable )
5a00: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
5a10: 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79  (!db || db->pnBy
5a20: 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20  tesFreed==0) && 
5a30: 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52  (--pTable->nTabR
5a40: 65 66 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b  ef)>0) ) return;
5a50: 0a 20 20 64 65 6c 65 74 65 54 61 62 6c 65 28 64  .  deleteTable(d
5a60: 62 2c 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a  b, pTable);.}...
5a70: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  /*.** Unlink the
5a80: 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f   given table fro
5a90: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
5aa0: 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65  s and the delete
5ab0: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74   the.** table st
5ac0: 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c  ructure with all
5ad0: 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64   its indices and
5ae0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a   foreign keys..*
5af0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
5b00: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62  linkAndDeleteTab
5b10: 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  le(sqlite3 *db, 
5b20: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
5b30: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a  har *zTabName){.
5b40: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62    Table *p;.  Db
5b50: 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74   *pDb;..  assert
5b60: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
5b70: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
5b80: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
5b90: 61 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65  assert( zTabName
5ba0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
5bb0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
5bc0: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
5bd0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
5be0: 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29  zTabName[0]==0 )
5bf0: 3b 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74  ;  /* Zero-lengt
5c00: 68 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61 72  h table names ar
5c10: 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70  e allowed */.  p
5c20: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
5c30: 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  b];.  p = sqlite
5c40: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
5c50: 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
5c60: 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 30 29  sh, zTabName, 0)
5c70: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74  ;.  sqlite3Delet
5c80: 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20  eTable(db, p);. 
5c90: 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d   db->mDbFlags |=
5ca0: 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68   DBFLAG_SchemaCh
5cb0: 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ange;.}../*.** G
5cc0: 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65  iven a token, re
5cd0: 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68  turn a string th
5ce0: 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  at consists of t
5cf0: 68 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a  he text of that.
5d00: 2a 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65  ** token.  Space
5d10: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
5d20: 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20  urned string.** 
5d30: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
5d40: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
5d50: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
5d60: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
5d70: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  .** function..**
5d80: 0a 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74 69 6f  .** Any quotatio
5d90: 6e 20 6d 61 72 6b 73 20 28 65 78 3a 20 20 22 6e  n marks (ex:  "n
5da0: 61 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e  ame", 'name', [n
5db0: 61 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29  ame], or `name`)
5dc0: 20 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e   that.** surroun
5dd0: 64 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  d the body of th
5de0: 65 20 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f  e token are remo
5df0: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e  ved..**.** Token
5e00: 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74  s are often just
5e10: 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74   pointers into t
5e20: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
5e30: 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61  text and so.** a
5e40: 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d  re not \000 term
5e50: 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e  inated and are n
5e60: 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20  ot persistent.  
5e70: 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  The returned str
5e80: 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74  ing.** is \000 t
5e90: 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73  erminated and is
5ea0: 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a   persistent..*/.
5eb0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d  char *sqlite3Nam
5ec0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74  eFromToken(sqlit
5ed0: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
5ee0: 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
5ef0: 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d  Name;.  if( pNam
5f00: 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  e ){.    zName =
5f10: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
5f20: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61  p(db, (char*)pNa
5f30: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
5f40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71  ;.    sqlite3Deq
5f50: 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d  uote(zName);.  }
5f60: 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  else{.    zName 
5f70: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
5f80: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zName;.}../*.*
5f90: 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74  * Open the sqlit
5fa0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73  e_master table s
5fb0: 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73  tored in databas
5fc0: 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72  e number iDb for
5fd0: 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65  .** writing. The
5fe0: 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64   table is opened
5ff0: 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e   using cursor 0.
6000: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6010: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
6020: 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44  Parse *p, int iD
6030: 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
6040: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
6050: 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  );.  sqlite3Tabl
6060: 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41  eLock(p, iDb, MA
6070: 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41  STER_ROOT, 1, MA
6080: 53 54 45 52 5f 4e 41 4d 45 29 3b 0a 20 20 73 71  STER_NAME);.  sq
6090: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
60a0: 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  nt(v, OP_OpenWri
60b0: 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f  te, 0, MASTER_RO
60c0: 4f 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69  OT, iDb, 5);.  i
60d0: 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b  f( p->nTab==0 ){
60e0: 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31  .    p->nTab = 1
60f0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
6100: 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70  arameter zName p
6110: 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74  oints to a nul-t
6120: 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72  erminated buffer
6130: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6140: 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74  name.** of a dat
6150: 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22  abase ("main", "
6160: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
6170: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
6180: 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75   db). This.** fu
6190: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
61a0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
61b0: 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69  named database i
61c0: 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a  n db->aDb[], or.
61d0: 2a 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d  ** -1 if the nam
61e0: 65 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20  ed db cannot be 
61f0: 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  found..*/.int sq
6200: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
6210: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
6220: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
6230: 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20  .  int i = -1;  
6240: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
6250: 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  se number */.  i
6260: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
6270: 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f 72  Db *pDb;.    for
6280: 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20  (i=(db->nDb-1), 
6290: 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  pDb=&db->aDb[i];
62a0: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d   i>=0; i--, pDb-
62b0: 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  -){.      if( 0=
62c0: 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70  =sqlite3_stricmp
62d0: 28 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20  (pDb->zDbSName, 
62e0: 7a 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a  zName) ) break;.
62f0: 20 20 20 20 20 20 2f 2a 20 22 6d 61 69 6e 22 20        /* "main" 
6300: 69 73 20 61 6c 77 61 79 73 20 61 6e 20 61 63 63  is always an acc
6310: 65 70 74 61 62 6c 65 20 61 6c 69 61 73 20 66 6f  eptable alias fo
6320: 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 64 61  r the primary da
6330: 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
6340: 65 76 65 6e 20 69 66 20 69 74 20 68 61 73 20 62  even if it has b
6350: 65 65 6e 20 72 65 6e 61 6d 65 64 20 75 73 69 6e  een renamed usin
6360: 67 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  g SQLITE_DBCONFI
6370: 47 5f 4d 41 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f  G_MAINDBNAME. */
6380: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20  .      if( i==0 
6390: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  && 0==sqlite3_st
63a0: 72 69 63 6d 70 28 22 6d 61 69 6e 22 2c 20 7a 4e  ricmp("main", zN
63b0: 61 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ame) ) break;.  
63c0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
63d0: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   i;.}../*.** The
63e0: 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f   token *pName co
63f0: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20  ntains the name 
6400: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65  of a database (e
6410: 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a  ither "main" or.
6420: 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65  ** "temp" or the
6430: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61   name of an atta
6440: 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72  ched db). This r
6450: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
6460: 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74  he.** index of t
6470: 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  he named databas
6480: 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20  e in db->aDb[], 
6490: 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d  or -1 if the nam
64a0: 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e  ed db .** does n
64b0: 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74  ot exist..*/.int
64c0: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73   sqlite3FindDb(s
64d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65  qlite3 *db, Toke
64e0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  n *pName){.  int
64f0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
6500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6510: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
6520: 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mber */.  char *
6530: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6550: 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65  * Name we are se
6560: 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20  arching for */. 
6570: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
6580: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
6590: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20  , pName);.  i = 
65a0: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
65b0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
65c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
65d0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  , zName);.  retu
65e0: 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn i;.}../* The 
65f0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72  table or view or
6600: 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73   trigger name is
6610: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
6620: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
6630: 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64  ns.** pName1 and
6640: 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20   pName2. If the 
6650: 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66  table name was f
6660: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
6670: 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  for example:.**.
6680: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
6690: 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a  xxx.yyy (...);.*
66a0: 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  * .** Then pName
66b0: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
66c0: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
66d0: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
66e0: 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20   hand if.** the 
66f0: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f  table name is no
6700: 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  t fully qualifie
6710: 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43  d, i.e.:.**.** C
6720: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
6730: 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  ...);.**.** Then
6740: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
6750: 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d  o "yyy" and pNam
6760: 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20  e2 is ""..**.** 
6770: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
6780: 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20  s the *ppUnqual 
6790: 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
67a0: 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70   at the token (p
67b0: 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d  Name1 or.** pNam
67c0: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
67d0: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
67e0: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
67f0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
6800: 20 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20   database "xxx" 
6810: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
6820: 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61  int sqlite3TwoPa
6830: 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  rtName(.  Parse 
6840: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
6850: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
6860: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
6870: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
6880: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a  *pName1,      /*
6890: 20 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68   The "xxx" in th
68a0: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
68b0: 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54   or "xxx" */.  T
68c0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
68d0: 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20     /* The "yyy" 
68e0: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
68f0: 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  .yyy" */.  Token
6900: 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f   **pUnqual     /
6910: 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75  * Write the unqu
6920: 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e  alified object n
6930: 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ame here */.){. 
6940: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
6950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6960: 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
6970: 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   the object */. 
6980: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
6990: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73  Parse->db;..  as
69a0: 73 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20  sert( pName2!=0 
69b0: 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 2d  );.  if( pName2-
69c0: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  >n>0 ){.    if( 
69d0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20  db->init.busy ) 
69e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
69f0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6a00: 22 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73  "corrupt databas
6a10: 65 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  e");.      retur
6a20: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
6a30: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
6a40: 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  2;.    iDb = sql
6a50: 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70  ite3FindDb(db, p
6a60: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20  Name1);.    if( 
6a70: 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73  iDb<0 ){.      s
6a80: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6a90: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
6aa0: 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e  database %T", pN
6ab0: 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 72 65 74  ame1);.      ret
6ac0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
6ad0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
6ae0: 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  t( db->init.iDb=
6af0: 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62  =0 || db->init.b
6b00: 75 73 79 20 7c 7c 20 49 4e 5f 52 45 4e 41 4d 45  usy || IN_RENAME
6b10: 5f 4f 42 4a 45 43 54 0a 20 20 20 20 20 20 20 20  _OBJECT.        
6b20: 20 20 20 20 20 7c 7c 20 28 64 62 2d 3e 6d 44 62       || (db->mDb
6b30: 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f 56  Flags & DBFLAG_V
6b40: 61 63 75 75 6d 29 21 3d 30 29 3b 0a 20 20 20 20  acuum)!=0);.    
6b50: 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69  iDb = db->init.i
6b60: 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c  Db;.    *pUnqual
6b70: 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20   = pName1;.  }. 
6b80: 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a   return iDb;.}..
6b90: 2f 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 50 52  /*.** True if PR
6ba0: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
6bb0: 68 65 6d 61 20 69 73 20 4f 4e 0a 2a 2f 0a 69 6e  hema is ON.*/.in
6bc0: 74 20 73 71 6c 69 74 65 33 57 72 69 74 61 62 6c  t sqlite3Writabl
6bd0: 65 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20  eSchema(sqlite3 
6be0: 2a 64 62 29 7b 0a 20 20 74 65 73 74 63 61 73 65  *db){.  testcase
6bf0: 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51  ( (db->flags&(SQ
6c00: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
6c10: 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76  |SQLITE_Defensiv
6c20: 65 29 29 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  e))==0 );.  test
6c30: 63 61 73 65 28 20 28 64 62 2d 3e 66 6c 61 67 73  case( (db->flags
6c40: 26 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63  &(SQLITE_WriteSc
6c50: 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65  hema|SQLITE_Defe
6c60: 6e 73 69 76 65 29 29 3d 3d 0a 20 20 20 20 20 20  nsive))==.      
6c70: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
6c80: 57 72 69 74 65 53 63 68 65 6d 61 20 29 3b 0a 20  WriteSchema );. 
6c90: 20 74 65 73 74 63 61 73 65 28 20 28 64 62 2d 3e   testcase( (db->
6ca0: 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72  flags&(SQLITE_Wr
6cb0: 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45  iteSchema|SQLITE
6cc0: 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20  _Defensive))==. 
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
6ce0: 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 20 29  LITE_Defensive )
6cf0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 64  ;.  testcase( (d
6d00: 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45  b->flags&(SQLITE
6d10: 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c  _WriteSchema|SQL
6d20: 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d  ITE_Defensive))=
6d30: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
6d40: 20 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63   (SQLITE_WriteSc
6d50: 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65  hema|SQLITE_Defe
6d60: 6e 73 69 76 65 29 20 29 3b 0a 20 20 72 65 74 75  nsive) );.  retu
6d70: 72 6e 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53  rn (db->flags&(S
6d80: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
6d90: 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69  a|SQLITE_Defensi
6da0: 76 65 29 29 3d 3d 53 51 4c 49 54 45 5f 57 72 69  ve))==SQLITE_Wri
6db0: 74 65 53 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a  teSchema;.}../*.
6dc0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6dd0: 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  is used to check
6de0: 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74   if the UTF-8 st
6df0: 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20  ring zName is a 
6e00: 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69  legal.** unquali
6e10: 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20  fied name for a 
6e20: 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63  new schema objec
6e30: 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c  t (table, index,
6e40: 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67   view or.** trig
6e50: 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20  ger). All names 
6e60: 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74  are legal except
6e70: 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69   those that begi
6e80: 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e  n with the strin
6e90: 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28  g.** "sqlite_" (
6ea0: 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20  in upper, lower 
6eb0: 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20  or mixed case). 
6ec0: 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20  This portion of 
6ed0: 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a  the namespace.**
6ee0: 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72   is reserved for
6ef0: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a   internal use..*
6f00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
6f10: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72  ckObjectName(Par
6f20: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
6f30: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
6f40: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64    if( !pParse->d
6f50: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
6f60: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
6f70: 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  0 .          && 
6f80: 73 71 6c 69 74 65 33 57 72 69 74 61 62 6c 65 53  sqlite3WritableS
6f90: 63 68 65 6d 61 28 70 50 61 72 73 65 2d 3e 64 62  chema(pParse->db
6fa0: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26  )==0.          &
6fb0: 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e  & 0==sqlite3StrN
6fc0: 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  ICmp(zName, "sql
6fd0: 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20  ite_", 7) ){.   
6fe0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6ff0: 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65 63 74  (pParse, "object
7000: 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20 66   name reserved f
7010: 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a  or internal use:
7020: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
7030: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7040: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
7050: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7060: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7070: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
7080: 6e 64 65 78 20 6f 66 20 61 20 74 61 62 6c 65 0a  ndex of a table.
7090: 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65  */.Index *sqlite
70a0: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
70b0: 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20  (Table *pTab){. 
70c0: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 66 6f 72   Index *p;.  for
70d0: 28 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  (p=pTab->pIndex;
70e0: 20 70 20 26 26 20 21 49 73 50 72 69 6d 61 72 79   p && !IsPrimary
70f0: 4b 65 79 49 6e 64 65 78 28 70 29 3b 20 70 3d 70  KeyIndex(p); p=p
7100: 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 72 65 74  ->pNext){}.  ret
7110: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
7120: 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6c 75 6d  Return the colum
7130: 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 20  n of index pIdx 
7140: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
7150: 20 74 6f 20 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c   to table.** col
7160: 75 6d 6e 20 69 43 6f 6c 2e 20 20 52 65 74 75 72  umn iCol.  Retur
7170: 6e 20 2d 31 20 69 66 20 6e 6f 74 20 66 6f 75 6e  n -1 if not foun
7180: 64 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c 69 74 65  d..*/.i16 sqlite
7190: 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 49  3ColumnOfIndex(I
71a0: 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 31 36 20  ndex *pIdx, i16 
71b0: 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iCol){.  int i;.
71c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
71d0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
71e0: 7b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d  {.    if( iCol==
71f0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
7200: 5d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  ] ) return i;.  
7210: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
7220: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f  ../*.** Begin co
7230: 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77  nstructing a new
7240: 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74   table represent
7250: 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e  ation in memory.
7260: 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65    This is.** the
7270: 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72 61   first of severa
7280: 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  l action routine
7290: 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65  s that get calle
72a0: 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a  d in response.**
72b0: 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41 42   to a CREATE TAB
72c0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49  LE statement.  I
72d0: 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68  n particular, th
72e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
72f0: 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65  lled.** after se
7300: 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45  eing tokens "CRE
7310: 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22  ATE" and "TABLE"
7320: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e   and the table n
7330: 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d 70 0a  ame. The isTemp.
7340: 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 20  ** flag is true 
7350: 69 66 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f  if the table sho
7360: 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e  uld be stored in
7370: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
7380: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
7390: 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68  instead of in th
73a0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
73b0: 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e  file.  This is n
73c0: 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65  ormally the case
73d0: 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45  .** when the "TE
73e0: 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52  MP" or "TEMPORAR
73f0: 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72  Y" keyword occur
7400: 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20  s in between.** 
7410: 43 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45  CREATE and TABLE
7420: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
7430: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20  table record is 
7440: 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20  initialized and 
7450: 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70  put in pParse->p
7460: 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20  NewTable..** As 
7470: 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45 41  more of the CREA
7480: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
7490: 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20 61 64  nt is parsed, ad
74a0: 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a  ditional action.
74b0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c  ** routines will
74c0: 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64   be called to ad
74d0: 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69  d more informati
74e0: 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72  on to this recor
74f0: 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  d..** At the end
7500: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
7510: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  ABLE statement, 
7520: 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61  the sqlite3EndTa
7530: 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  ble() routine.**
7540: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f   is called to co
7550: 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74  mplete the const
7560: 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  ruction of the n
7570: 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e  ew table record.
7580: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7590: 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61  StartTable(.  Pa
75a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
75b0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
75c0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
75d0: 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20  me1,   /* First 
75e0: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
75f0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
7600: 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
7610: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53   *pName2,   /* S
7620: 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68  econd part of th
7630: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
7640: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
7650: 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20   int isTemp,    
7660: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
7670: 73 20 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c  s is a TEMP tabl
7680: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65  e */.  int isVie
7690: 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  w,      /* True 
76a0: 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49 45  if this is a VIE
76b0: 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 72  W */.  int isVir
76c0: 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20  tual,   /* True 
76d0: 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49 52  if this is a VIR
76e0: 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TUAL table */.  
76f0: 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20  int noErr       
7700: 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69   /* Do nothing i
7710: 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  f table already 
7720: 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  exists */.){.  T
7730: 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20  able *pTable;.  
7740: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
7750: 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20   /* The name of 
7760: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f  the new table */
7770: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
7780: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
7790: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44  dbe *v;.  int iD
77a0: 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  b;         /* Da
77b0: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f  tabase number to
77c0: 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c   create the tabl
77d0: 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  e in */.  Token 
77e0: 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e  *pName;    /* Un
77f0: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f  qualified name o
7800: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63  f the table to c
7810: 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20  reate */..  if( 
7820: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
7830: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
7840: 6d 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 53  m==1 ){.    /* S
7850: 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 50 61  pecial case:  Pa
7860: 72 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  rsing the sqlite
7870: 5f 6d 61 73 74 65 72 20 6f 72 20 73 71 6c 69 74  _master or sqlit
7880: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 73 63  e_temp_master sc
7890: 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69 44 62 20  hema */.    iDb 
78a0: 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  = db->init.iDb;.
78b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
78c0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
78d0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
78e0: 29 29 3b 0a 20 20 20 20 70 4e 61 6d 65 20 3d 20  ));.    pName = 
78f0: 70 4e 61 6d 65 31 3b 0a 20 20 7d 65 6c 73 65 7b  pName1;.  }else{
7900: 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  .    /* The comm
7910: 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 69  on case */.    i
7920: 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
7930: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
7940: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
7950: 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  &pName);.    if(
7960: 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
7970: 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
7980: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
7990: 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26  && pName2->n>0 &
79a0: 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20  & iDb!=1 ){.    
79b0: 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
79c0: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74   a temp table, t
79d0: 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20  he name may not 
79e0: 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20 55 6e  be qualified. Un
79f0: 6c 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 74  less .      ** t
7a00: 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
7a10: 20 69 73 20 22 74 65 6d 70 22 20 61 6e 79 77 61   is "temp" anywa
7a20: 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  y.  */.      sql
7a30: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7a40: 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20  rse, "temporary 
7a50: 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20  table name must 
7a60: 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29  be unqualified")
7a70: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
7a80: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f      }.    if( !O
7a90: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
7aa0: 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a  Temp ) iDb = 1;.
7ab0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
7ac0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
7ad0: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  (db, pName);.   
7ae0: 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
7af0: 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 73  BJECT ){.      s
7b00: 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
7b10: 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f  nMap(pParse, (vo
7b20: 69 64 2a 29 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  id*)zName, pName
7b30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
7b40: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
7b50: 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 66  n = *pName;.  if
7b60: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
7b70: 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  urn;.  if( SQLIT
7b80: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65  E_OK!=sqlite3Che
7b90: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61  ckObjectName(pPa
7ba0: 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  rse, zName) ){. 
7bb0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
7bc0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
7bd0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44   if( db->init.iD
7be0: 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20  b==1 ) isTemp = 
7bf0: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
7c00: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
7c10: 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 69  TION.  assert( i
7c20: 73 54 65 6d 70 3d 3d 30 20 7c 7c 20 69 73 54 65  sTemp==0 || isTe
7c30: 6d 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  mp==1 );.  asser
7c40: 74 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20  t( isView==0 || 
7c50: 69 73 56 69 65 77 3d 3d 31 20 29 3b 0a 20 20 7b  isView==1 );.  {
7c60: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
7c70: 74 20 75 38 20 61 43 6f 64 65 5b 5d 20 3d 20 7b  t u8 aCode[] = {
7c80: 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43  .       SQLITE_C
7c90: 52 45 41 54 45 5f 54 41 42 4c 45 2c 0a 20 20 20  REATE_TABLE,.   
7ca0: 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54      SQLITE_CREAT
7cb0: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 2c 0a 20 20  E_TEMP_TABLE,.  
7cc0: 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41       SQLITE_CREA
7cd0: 54 45 5f 56 49 45 57 2c 0a 20 20 20 20 20 20 20  TE_VIEW,.       
7ce0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
7cf0: 4d 50 5f 56 49 45 57 0a 20 20 20 20 7d 3b 0a 20  MP_VIEW.    };. 
7d00: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64     char *zDb = d
7d10: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
7d20: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
7d30: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
7d40: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
7d50: 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
7d60: 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a  LE(isTemp), 0, z
7d70: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
7d80: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
7d90: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
7da0: 66 28 20 21 69 73 56 69 72 74 75 61 6c 20 26 26  f( !isVirtual &&
7db0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
7dc0: 6b 28 70 50 61 72 73 65 2c 20 28 69 6e 74 29 61  k(pParse, (int)a
7dd0: 43 6f 64 65 5b 69 73 54 65 6d 70 2b 32 2a 69 73  Code[isTemp+2*is
7de0: 56 69 65 77 5d 2c 0a 20 20 20 20 20 20 20 20 20  View],.         
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
7e10: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
7e20: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
7e30: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
7e40: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
7e50: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
7e60: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d  he new table nam
7e70: 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69  e does not colli
7e80: 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74  de with an exist
7e90: 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  ing.  ** index o
7ea0: 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20  r table name in 
7eb0: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
7ec0: 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72  e.  Issue an err
7ed0: 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20  or message if.  
7ee0: 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54 68 65 20  ** it does. The 
7ef0: 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20  exception is if 
7f00: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 62 65  the statement be
7f10: 69 6e 67 20 70 61 72 73 65 64 20 77 61 73 20 70  ing parsed was p
7f20: 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e  assed.  ** to an
7f30: 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
7f40: 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e  _vtab() call. In
7f50: 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20   that case only 
7f60: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
7f70: 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70 65 73 20  .  ** and types 
7f80: 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 73 6f  will be used, so
7f90: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
7fa0: 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6e 61  d to test for na
7fb0: 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c  mespace.  ** col
7fc0: 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  lisions..  */.  
7fd0: 69 66 28 20 21 49 4e 5f 53 50 45 43 49 41 4c 5f  if( !IN_SPECIAL_
7fe0: 50 41 52 53 45 20 29 7b 0a 20 20 20 20 63 68 61  PARSE ){.    cha
7ff0: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
8000: 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
8010: 20 20 20 20 69 66 28 20 21 49 73 52 65 75 73 65      if( !IsReuse
8020: 53 63 68 65 6d 61 28 64 62 29 20 26 26 20 53 51  Schema(db) && SQ
8030: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
8040: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
8050: 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
8060: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
8070: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  or;.    }.    pT
8080: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69  able = sqlite3Fi
8090: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
80a0: 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  e, zDb);.    if(
80b0: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20   pTable ){.     
80c0: 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20   if( !noErr ){. 
80d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
80e0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
80f0: 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79  table %T already
8100: 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29   exists", pName)
8110: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8120: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
8130: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
8140: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
8150: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
8160: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
8170: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
8180: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
8190: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
81a0: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
81b0: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
81c0: 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  x(db, zName, zDb
81d0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
81e0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
81f0: 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
8200: 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78  already an index
8210: 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d   named %s", zNam
8220: 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62  e);.      goto b
8230: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
8240: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
8250: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44  Table = sqlite3D
8260: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
8270: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
8280: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
8290: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
82a0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
82b0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  );.    pParse->r
82c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
82d0: 5f 42 4b 50 54 3b 0a 20 20 20 20 70 50 61 72 73  _BKPT;.    pPars
82e0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
82f0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
8300: 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61  error;.  }.  pTa
8310: 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  ble->zName = zNa
8320: 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50  me;.  pTable->iP
8330: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62  Key = -1;.  pTab
8340: 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62  le->pSchema = db
8350: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
8360: 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 54  ma;.  pTable->nT
8370: 61 62 52 65 66 20 3d 20 31 3b 0a 23 69 66 64 65  abRef = 1;.#ifde
8380: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
8390: 5f 52 4f 57 45 53 54 0a 20 20 70 54 61 62 6c 65  _ROWEST.  pTable
83a0: 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73  ->nRowLogEst = s
83b0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 53 51 4c  qlite3LogEst(SQL
83c0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45  ITE_DEFAULT_ROWE
83d0: 53 54 29 3b 0a 23 65 6c 73 65 0a 20 20 70 54 61  ST);.#else.  pTa
83e0: 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  ble->nRowLogEst 
83f0: 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32  = 200; assert( 2
8400: 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  00==sqlite3LogEs
8410: 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 23 65  t(1048576) );.#e
8420: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
8430: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
8440: 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  ==0 );.  pParse-
8450: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61  >pNewTable = pTa
8460: 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ble;..  /* If th
8470: 69 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20  is is the magic 
8480: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
8490: 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75  table used by au
84a0: 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a  toincrement,.  *
84b0: 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20  * then record a 
84c0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
84d0: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69  table in the mai
84e0: 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
84f0: 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61  ture.  ** so tha
8500: 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e  t INSERT can fin
8510: 64 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69  d the table easi
8520: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
8530: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
8540: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28  OINCREMENT.  if(
8550: 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64   !pParse->nested
8560: 20 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65   && strcmp(zName
8570: 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  , "sqlite_sequen
8580: 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ce")==0 ){.    a
8590: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
85a0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
85b0: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
85c0: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
85d0: 2d 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62  ->pSeqTab = pTab
85e0: 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
85f0: 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
8600: 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74  ating the code t
8610: 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20  hat will insert 
8620: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
8630: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53   into.  ** the S
8640: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
8650: 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72  le.  Note in par
8660: 74 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20  ticular that we 
8670: 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20  must go ahead.  
8680: 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  ** and allocate 
8690: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
86a0: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
86b0: 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f  entry now.  Befo
86c0: 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d  re any.  ** PRIM
86d0: 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
86e0: 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70  E keywords are p
86f0: 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65  arsed.  Those ke
8700: 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73  ywords will caus
8710: 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74  e.  ** indices t
8720: 6f 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64  o be created and
8730: 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72   the table recor
8740: 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f  d must come befo
8750: 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64  re the .  ** ind
8760: 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ices.  Hence, th
8770: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
8780: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75  for the table mu
8790: 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a  st be allocated.
87a0: 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20    ** now..  */. 
87b0: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
87c0: 75 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69  usy && (v = sqli
87d0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
87e0: 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  e))!=0 ){.    in
87f0: 74 20 61 64 64 72 31 3b 0a 20 20 20 20 69 6e 74  t addr1;.    int
8800: 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20   fileFormat;.   
8810: 20 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c   int reg1, reg2,
8820: 20 72 65 67 33 3b 0a 20 20 20 20 2f 2a 20 6e 75   reg3;.    /* nu
8830: 6c 6c 52 6f 77 5b 5d 20 69 73 20 61 6e 20 4f 50  llRow[] is an OP
8840: 5f 52 65 63 6f 72 64 20 65 6e 63 6f 64 69 6e 67  _Record encoding
8850: 20 6f 66 20 61 20 72 6f 77 20 63 6f 6e 74 61 69   of a row contai
8860: 6e 69 6e 67 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a  ning 5 NULLs */.
8870: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
8880: 20 63 68 61 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20   char nullRow[] 
8890: 3d 20 7b 20 36 2c 20 30 2c 20 30 2c 20 30 2c 20  = { 6, 0, 0, 0, 
88a0: 30 2c 20 30 20 7d 3b 0a 20 20 20 20 73 71 6c 69  0, 0 };.    sqli
88b0: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
88c0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
88d0: 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
88e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
88f0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
8900: 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20  ( isVirtual ){. 
8910: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8920: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65  AddOp0(v, OP_VBe
8930: 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  gin);.    }.#end
8940: 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  if..    /* If th
8950: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e  e file format an
8960: 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68  d encoding in th
8970: 65 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20  e database have 
8980: 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20  not been set, . 
8990: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e     ** set them n
89a0: 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ow..    */.    r
89b0: 65 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65  eg1 = pParse->re
89c0: 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73  gRowid = ++pPars
89d0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
89e0: 32 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52  2 = pParse->regR
89f0: 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  oot = ++pParse->
8a00: 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d  nMem;.    reg3 =
8a10: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
8a20: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8a30: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61  AddOp3(v, OP_Rea
8a40: 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65  dCookie, iDb, re
8a50: 67 33 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46  g3, BTREE_FILE_F
8a60: 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c 69  ORMAT);.    sqli
8a70: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
8a80: 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 61 64  (v, iDb);.    ad
8a90: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
8aa0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
8ab0: 2c 20 72 65 67 33 29 3b 20 56 64 62 65 43 6f 76  , reg3); VdbeCov
8ac0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 66 69  erage(v);.    fi
8ad0: 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e  leFormat = (db->
8ae0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c  flags & SQLITE_L
8af0: 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30  egacyFileFmt)!=0
8b00: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
8b10: 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f       1 : SQLITE_
8b20: 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b  MAX_FILE_FORMAT;
8b30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8b40: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
8b50: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52  Cookie, iDb, BTR
8b60: 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20  EE_FILE_FORMAT, 
8b70: 66 69 6c 65 46 6f 72 6d 61 74 29 3b 0a 20 20 20  fileFormat);.   
8b80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8b90: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
8ba0: 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 54  ie, iDb, BTREE_T
8bb0: 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 45 4e  EXT_ENCODING, EN
8bc0: 43 28 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69  C(db));.    sqli
8bd0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
8be0: 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 20 20  v, addr1);..    
8bf0: 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65  /* This just cre
8c00: 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c  ates a place-hol
8c10: 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68  der record in th
8c20: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
8c30: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68  table..    ** Th
8c40: 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64  e record created
8c50: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
8c60: 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20  n anything yet. 
8c70: 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c   It will be repl
8c80: 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  aced.    ** by t
8c90: 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e  he real entry in
8ca0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
8cb0: 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  at sqlite3EndTab
8cc0: 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  le()..    **.   
8cd0: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
8ce0: 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  r the new entry 
8cf0: 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73  is left in regis
8d00: 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52  ter pParse->regR
8d10: 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65  owid..    ** The
8d20: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
8d30: 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  r of the new tab
8d40: 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  le is left in re
8d50: 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  g pParse->regRoo
8d60: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  t..    ** The ro
8d70: 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67  wid and root pag
8d80: 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20  e number values 
8d90: 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68  are needed by th
8da0: 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20  e code that.    
8db0: 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  ** sqlite3EndTab
8dc0: 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  le will generate
8dd0: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65  ..    */.#if !de
8de0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8df0: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
8e00: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8e10: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
8e20: 20 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20    if( isView || 
8e30: 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  isVirtual ){.   
8e40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8e50: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
8e60: 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20  er, 0, reg2);.  
8e70: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
8e80: 20 20 20 7b 0a 20 20 20 20 20 20 70 50 61 72 73     {.      pPars
8e90: 65 2d 3e 61 64 64 72 43 72 54 61 62 20 3d 0a 20  e->addrCrTab =. 
8ea0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8eb0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8ec0: 43 72 65 61 74 65 42 74 72 65 65 2c 20 69 44 62  CreateBtree, iDb
8ed0: 2c 20 72 65 67 32 2c 20 42 54 52 45 45 5f 49 4e  , reg2, BTREE_IN
8ee0: 54 4b 45 59 29 3b 0a 20 20 20 20 7d 0a 20 20 20  TKEY);.    }.   
8ef0: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
8f00: 65 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  erTable(pParse, 
8f10: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
8f20: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8f30: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 72  P_NewRowid, 0, r
8f40: 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg1);.    sqlite
8f50: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
8f60: 50 5f 42 6c 6f 62 2c 20 36 2c 20 72 65 67 33 2c  P_Blob, 6, reg3,
8f70: 20 30 2c 20 6e 75 6c 6c 52 6f 77 2c 20 50 34 5f   0, nullRow, P4_
8f80: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
8f90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8fa0: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20  , OP_Insert, 0, 
8fb0: 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20  reg3, reg1);.   
8fc0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8fd0: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
8fe0: 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69  PPEND);.    sqli
8ff0: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
9000: 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a   OP_Close);.  }.
9010: 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f  .  /* Normal (no
9020: 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e  n-error) return.
9030: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20   */.  return;.. 
9040: 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
9050: 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20  occurs, we jump 
9060: 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61  here */.begin_ta
9070: 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c  ble_error:.  sql
9080: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
9090: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Name);.  return;
90a0: 0a 7d 0a 0a 2f 2a 20 53 65 74 20 70 72 6f 70 65  .}../* Set prope
90b0: 72 74 69 65 73 20 6f 66 20 61 20 74 61 62 6c 65  rties of a table
90c0: 20 63 6f 6c 75 6d 6e 20 62 61 73 65 64 20 6f 6e   column based on
90d0: 20 74 68 65 20 28 6d 61 67 69 63 61 6c 29 0a 2a   the (magical).*
90e0: 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * name of the co
90f0: 6c 75 6d 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  lumn..*/.#if SQL
9100: 49 54 45 5f 45 4e 41 42 4c 45 5f 48 49 44 44 45  ITE_ENABLE_HIDDE
9110: 4e 5f 43 4f 4c 55 4d 4e 53 0a 76 6f 69 64 20 73  N_COLUMNS.void s
9120: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70  qlite3ColumnProp
9130: 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 54  ertiesFromName(T
9140: 61 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f 6c 75  able *pTab, Colu
9150: 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20 69 66 28  mn *pCol){.  if(
9160: 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
9170: 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 22  p(pCol->zName, "
9180: 5f 5f 68 69 64 64 65 6e 5f 5f 22 2c 20 31 30 29  __hidden__", 10)
9190: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 2d  ==0 ){.    pCol-
91a0: 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  >colFlags |= COL
91b0: 46 4c 41 47 5f 48 49 44 44 45 4e 3b 0a 20 20 7d  FLAG_HIDDEN;.  }
91c0: 65 6c 73 65 20 69 66 28 20 70 54 61 62 20 26 26  else if( pTab &&
91d0: 20 70 43 6f 6c 21 3d 70 54 61 62 2d 3e 61 43 6f   pCol!=pTab->aCo
91e0: 6c 20 26 26 20 28 70 43 6f 6c 5b 2d 31 5d 2e 63  l && (pCol[-1].c
91f0: 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41  olFlags & COLFLA
9200: 47 5f 48 49 44 44 45 4e 29 20 29 7b 0a 20 20 20  G_HIDDEN) ){.   
9210: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
9220: 7c 3d 20 54 46 5f 4f 4f 4f 48 69 64 64 65 6e 3b  |= TF_OOOHidden;
9230: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
9240: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
9250: 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61  column to the ta
9260: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65  ble currently be
9270: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  ing constructed.
9280: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  .**.** The parse
9290: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
92a0: 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61  tine once for ea
92b0: 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72  ch column declar
92c0: 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52  ation.** in a CR
92d0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
92e0: 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74  ment.  sqlite3St
92f0: 61 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20  artTable() gets 
9300: 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20  called.** first 
9310: 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f  to get things go
9320: 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20  ing.  Then this 
9330: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
9340: 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f  d for each.** co
9350: 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lumn..*/.void sq
9360: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50  lite3AddColumn(P
9370: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
9380: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 54 6f 6b 65  ken *pName, Toke
9390: 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62  n *pType){.  Tab
93a0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
93b0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61    char *z;.  cha
93c0: 72 20 2a 7a 54 79 70 65 3b 0a 20 20 43 6f 6c 75  r *zType;.  Colu
93d0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69  mn *pCol;.  sqli
93e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
93f0: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d  ->db;.  if( (p =
9400: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9410: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
9420: 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31  .  if( p->nCol+1
9430: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
9440: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
9450: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
9460: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
9470: 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
9480: 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61  s on %s", p->zNa
9490: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  me);.    return;
94a0: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
94b0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
94c0: 2c 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 70 54 79  , pName->n + pTy
94d0: 70 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20 20 69 66  pe->n + 2);.  if
94e0: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
94f0: 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45  .  if( IN_RENAME
9500: 5f 4f 42 4a 45 43 54 20 29 20 73 71 6c 69 74 65  _OBJECT ) sqlite
9510: 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28  3RenameTokenMap(
9520: 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a  pParse, (void*)z
9530: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 6d 65 6d 63  , pName);.  memc
9540: 70 79 28 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  py(z, pName->z, 
9550: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 7a 5b 70  pName->n);.  z[p
9560: 4e 61 6d 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  Name->n] = 0;.  
9570: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
9580: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
9590: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
95a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
95b0: 74 72 69 63 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f  tricmp(z, p->aCo
95c0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
95d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
95e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
95f0: 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d  "duplicate colum
9600: 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b  n name: %s", z);
9610: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
9620: 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
9630: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
9640: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e  .  }.  if( (p->n
9650: 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Col & 0x7)==0 ){
9660: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65  .    Column *aNe
9670: 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  w;.    aNew = sq
9680: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
9690: 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43  b,p->aCol,(p->nC
96a0: 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  ol+8)*sizeof(p->
96b0: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aCol[0]));.    i
96c0: 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
96d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
96e0: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
96f0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
9700: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77    p->aCol = aNew
9710: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26  ;.  }.  pCol = &
9720: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d  p->aCol[p->nCol]
9730: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c  ;.  memset(pCol,
9740: 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43   0, sizeof(p->aC
9750: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d  ol[0]));.  pCol-
9760: 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 20 73 71  >zName = z;.  sq
9770: 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65  lite3ColumnPrope
9780: 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 70 2c  rtiesFromName(p,
9790: 20 70 43 6f 6c 29 3b 0a 20 0a 20 20 69 66 28 20   pCol);. .  if( 
97a0: 70 54 79 70 65 2d 3e 6e 3d 3d 30 20 29 7b 0a 20  pType->n==0 ){. 
97b0: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
97c0: 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66  s no type specif
97d0: 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76  ied, columns hav
97e0: 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66  e the default af
97f0: 66 69 6e 69 74 79 0a 20 20 20 20 2a 2a 20 27 42  finity.    ** 'B
9800: 4c 4f 42 27 20 77 69 74 68 20 61 20 64 65 66 61  LOB' with a defa
9810: 75 6c 74 20 73 69 7a 65 20 6f 66 20 34 20 62 79  ult size of 4 by
9820: 74 65 73 2e 20 2a 2f 0a 20 20 20 20 70 43 6f 6c  tes. */.    pCol
9830: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
9840: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
9850: 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20    pCol->szEst = 
9860: 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  1;.#ifdef SQLITE
9870: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
9880: 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66  EFERENCES.    if
9890: 28 20 34 3e 3d 73 71 6c 69 74 65 33 47 6c 6f 62  ( 4>=sqlite3Glob
98a0: 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 6f 72 74 65  alConfig.szSorte
98b0: 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20 70 43  rRef ){.      pC
98c0: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
98d0: 43 4f 4c 46 4c 41 47 5f 53 4f 52 54 45 52 52 45  COLFLAG_SORTERRE
98e0: 46 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  F;.    }.#endif.
98f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54 79    }else{.    zTy
9900: 70 65 20 3d 20 7a 20 2b 20 73 71 6c 69 74 65 33  pe = z + sqlite3
9910: 53 74 72 6c 65 6e 33 30 28 7a 29 20 2b 20 31 3b  Strlen30(z) + 1;
9920: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70  .    memcpy(zTyp
9930: 65 2c 20 70 54 79 70 65 2d 3e 7a 2c 20 70 54 79  e, pType->z, pTy
9940: 70 65 2d 3e 6e 29 3b 0a 20 20 20 20 7a 54 79 70  pe->n);.    zTyp
9950: 65 5b 70 54 79 70 65 2d 3e 6e 5d 20 3d 20 30 3b  e[pType->n] = 0;
9960: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
9970: 6f 74 65 28 7a 54 79 70 65 29 3b 0a 20 20 20 20  ote(zType);.    
9980: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
9990: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
99a0: 54 79 70 65 28 7a 54 79 70 65 2c 20 70 43 6f 6c  Type(zType, pCol
99b0: 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c  );.    pCol->col
99c0: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
99d0: 5f 48 41 53 54 59 50 45 3b 0a 20 20 7d 0a 20 20  _HASTYPE;.  }.  
99e0: 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 20 20 70 50 61  p->nCol++;.  pPa
99f0: 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e  rse->constraintN
9a00: 61 6d 65 2e 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ame.n = 0;.}../*
9a10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9a20: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
9a30: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
9a40: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
9a50: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
9a60: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
9a70: 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c  ent.  A "NOT NUL
9a80: 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  L" constraint ha
9a90: 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f  s.** been seen o
9aa0: 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69  n a column.  Thi
9ab0: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
9ac0: 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20  he notNull flag 
9ad0: 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  on.** the column
9ae0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
9af0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
9b00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
9b10: 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a  dNotNull(Parse *
9b20: 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72  pParse, int onEr
9b30: 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ror){.  Table *p
9b40: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
9b50: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
9b60: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
9b70: 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70   p==0 || NEVER(p
9b80: 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75  ->nCol<1) ) retu
9b90: 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d  rn;.  pCol = &p-
9ba0: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
9bb0: 3b 0a 20 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c  ;.  pCol->notNul
9bc0: 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b  l = (u8)onError;
9bd0: 0a 20 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c  .  p->tabFlags |
9be0: 3d 20 54 46 5f 48 61 73 4e 6f 74 4e 75 6c 6c 3b  = TF_HasNotNull;
9bf0: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 75  ..  /* Set the u
9c00: 6e 69 71 4e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20  niqNotNull flag 
9c10: 6f 6e 20 61 6e 79 20 55 4e 49 51 55 45 20 6f 72  on any UNIQUE or
9c20: 20 50 4b 20 69 6e 64 65 78 65 73 20 61 6c 72 65   PK indexes alre
9c30: 61 64 79 20 63 72 65 61 74 65 64 0a 20 20 2a 2a  ady created.  **
9c40: 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 2e   on this column.
9c50: 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c 2d    */.  if( pCol-
9c60: 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46  >colFlags & COLF
9c70: 4c 41 47 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20  LAG_UNIQUE ){.  
9c80: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
9c90: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70     for(pIdx=p->p
9ca0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
9cb0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
9cc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
9cd0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26  dx->nKeyCol==1 &
9ce0: 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  & pIdx->onError!
9cf0: 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20  =OE_None );.    
9d00: 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
9d10: 6c 75 6d 6e 5b 30 5d 3d 3d 70 2d 3e 6e 43 6f 6c  lumn[0]==p->nCol
9d20: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  -1 ){.        pI
9d30: 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  dx->uniqNotNull 
9d40: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
9d50: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9d60: 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Scan the column 
9d70: 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20  type name zType 
9d80: 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61  (length nType) a
9d90: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a  nd return the.**
9da0: 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66 69   associated affi
9db0: 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a  nity type..**.**
9dc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
9dd0: 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65  es a case-indepe
9de0: 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20  ndent search of 
9df0: 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a  zType for the .*
9e00: 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20  * substrings in 
9e10: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  the following ta
9e20: 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74  ble. If one of t
9e30: 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 73  he substrings is
9e40: 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63  .** found, the c
9e50: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66  orresponding aff
9e60: 69 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e 65  inity is returne
9e70: 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74  d. If zType cont
9e80: 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61  ains.** more tha
9e90: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62  n one of the sub
9ea0: 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73  strings, entries
9eb0: 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20   toward the top 
9ec0: 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  of .** the table
9ed0: 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20   take priority. 
9ee0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
9ef0: 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e  zType is 'BLOBIN
9f00: 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  T', .** SQLITE_A
9f10: 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65  FF_INTEGER is re
9f20: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75  turned..**.** Su
9f30: 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66  bstring     | Af
9f40: 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  finity.** ------
9f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49  ----------.** 'I
9f70: 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20 53 51  NT'         | SQ
9f80: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
9f90: 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20 20  .** 'CHAR'      
9fa0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
9fb0: 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20  EXT.** 'CLOB'   
9fc0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
9fd0: 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27  F_TEXT.** 'TEXT'
9fe0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
9ff0: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c  _AFF_TEXT.** 'BL
a000: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
a010: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 0a 2a 2a 20  ITE_AFF_BLOB.** 
a020: 27 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20  'REAL'        | 
a030: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
a040: 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20  ** 'FLOA'       
a050: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
a060: 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20  AL.** 'DOUB'    
a070: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
a080: 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  _REAL.**.** If n
a090: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
a0a0: 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f  rings in the abo
a0b0: 76 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75  ve table are fou
a0c0: 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  nd,.** SQLITE_AF
a0d0: 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74  F_NUMERIC is ret
a0e0: 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73  urned..*/.char s
a0f0: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
a100: 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pe(const char *z
a110: 49 6e 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  In, Column *pCol
a120: 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a  ){.  u32 h = 0;.
a130: 20 20 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c    char aff = SQL
a140: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
a150: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
a160: 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Char = 0;..  ass
a170: 65 72 74 28 20 7a 49 6e 21 3d 30 20 29 3b 0a 20  ert( zIn!=0 );. 
a180: 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30 5d 20 29   while( zIn[0] )
a190: 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29  {.    h = (h<<8)
a1a0: 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72 54   + sqlite3UpperT
a1b0: 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 26 30 78  oLower[(*zIn)&0x
a1c0: 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a  ff];.    zIn++;.
a1d0: 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27      if( h==(('c'
a1e0: 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b  <<24)+('h'<<16)+
a1f0: 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b  ('a'<<8)+'r') ){
a200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a210: 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66  CHAR */.      af
a220: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
a230: 45 58 54 3b 0a 20 20 20 20 20 20 7a 43 68 61 72  EXT;.      zChar
a240: 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c 73   = zIn;.    }els
a250: 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c  e if( h==(('c'<<
a260: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
a270: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20  o'<<8)+'b') ){  
a280: 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a       /* CLOB */.
a290: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
a2a0: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
a2b0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
a2c0: 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  't'<<24)+('e'<<1
a2d0: 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29  6)+('x'<<8)+'t')
a2e0: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58   ){       /* TEX
a2f0: 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  T */.      aff =
a300: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
a310: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a320: 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27  h==(('b'<<24)+('
a330: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
a340: 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'b')          /
a350: 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * BLOB */.      
a360: 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54    && (aff==SQLIT
a370: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c  E_AFF_NUMERIC ||
a380: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
a390: 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  _REAL) ){.      
a3a0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
a3b0: 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 69 66 28  _BLOB;.      if(
a3c0: 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20 29 20 7a   zIn[0]=='(' ) z
a3d0: 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23 69 66 6e  Char = zIn;.#ifn
a3e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a3f0: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
a400: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
a410: 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c  (('r'<<24)+('e'<
a420: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c  <16)+('a'<<8)+'l
a430: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ')          /* R
a440: 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  EAL */.        &
a450: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
a460: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
a470: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
a480: 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65  AFF_REAL;.    }e
a490: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27  lse if( h==(('f'
a4a0: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
a4b0: 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20  ('o'<<8)+'a')   
a4c0: 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a         /* FLOA *
a4d0: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
a4e0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
a4f0: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
a500: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
a510: 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EAL;.    }else i
a520: 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29  f( h==(('d'<<24)
a530: 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c  +('o'<<16)+('u'<
a540: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
a550: 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20    /* DOUB */.   
a560: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
a570: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
a580: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
a590: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
a5a0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
a5b0: 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46 46   if( (h&0x00FFFF
a5c0: 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b  FF)==(('i'<<16)+
a5d0: 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('n'<<8)+'t') ){
a5e0: 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20      /* INT */.  
a5f0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
a600: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
a610: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a620: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 43  .  }..  /* If pC
a630: 6f 6c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ol is not NULL, 
a640: 73 74 6f 72 65 20 61 6e 20 65 73 74 69 6d 61 74  store an estimat
a650: 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20 73  e of the field s
a660: 69 7a 65 2e 20 20 54 68 65 0a 20 20 2a 2a 20 65  ize.  The.  ** e
a670: 73 74 69 6d 61 74 65 20 69 73 20 73 63 61 6c 65  stimate is scale
a680: 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 69  d so that the si
a690: 7a 65 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72  ze of an integer
a6a0: 20 69 73 20 31 2e 20 20 2a 2f 0a 20 20 69 66 28   is 1.  */.  if(
a6b0: 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 69 6e 74   pCol ){.    int
a6c0: 20 76 20 3d 20 30 3b 20 20 20 2f 2a 20 64 65 66   v = 0;   /* def
a6d0: 61 75 6c 74 20 73 69 7a 65 20 69 73 20 61 70 70  ault size is app
a6e0: 72 6f 78 20 34 20 62 79 74 65 73 20 2a 2f 0a 20  rox 4 bytes */. 
a6f0: 20 20 20 69 66 28 20 61 66 66 3c 53 51 4c 49 54     if( aff<SQLIT
a700: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
a710: 0a 20 20 20 20 20 20 69 66 28 20 7a 43 68 61 72  .      if( zChar
a720: 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
a730: 65 28 20 7a 43 68 61 72 5b 30 5d 20 29 7b 0a 20  e( zChar[0] ){. 
a740: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
a750: 69 74 65 33 49 73 64 69 67 69 74 28 7a 43 68 61  ite3Isdigit(zCha
a760: 72 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  r[0]) ){.       
a770: 20 20 20 20 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c       /* BLOB(k),
a780: 20 56 41 52 43 48 41 52 28 6b 29 2c 20 43 48 41   VARCHAR(k), CHA
a790: 52 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31  R(k) -> r=(k/4+1
a7a0: 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
a7b0: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
a7c0: 28 7a 43 68 61 72 2c 20 26 76 29 3b 0a 20 20 20  (zChar, &v);.   
a7d0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a7e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a7f0: 20 20 20 20 20 20 7a 43 68 61 72 2b 2b 3b 0a 20        zChar++;. 
a800: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
a810: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 76 20  else{.        v 
a820: 3d 20 31 36 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c  = 16;   /* BLOB,
a830: 20 54 45 58 54 2c 20 43 4c 4f 42 20 2d 3e 20 72   TEXT, CLOB -> r
a840: 3d 35 20 20 28 61 70 70 72 6f 78 20 32 30 20 62  =5  (approx 20 b
a850: 79 74 65 73 29 2a 2f 0a 20 20 20 20 20 20 7d 0a  ytes)*/.      }.
a860: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
a870: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45  ITE_ENABLE_SORTE
a880: 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20  R_REFERENCES.   
a890: 20 69 66 28 20 76 3e 3d 73 71 6c 69 74 65 33 47   if( v>=sqlite3G
a8a0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 6f  lobalConfig.szSo
a8b0: 72 74 65 72 52 65 66 20 29 7b 0a 20 20 20 20 20  rterRef ){.     
a8c0: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
a8d0: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53 4f 52 54 45  |= COLFLAG_SORTE
a8e0: 52 52 45 46 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  RREF;.    }.#end
a8f0: 69 66 0a 20 20 20 20 76 20 3d 20 76 2f 34 20 2b  if.    v = v/4 +
a900: 20 31 3b 0a 20 20 20 20 69 66 28 20 76 3e 32 35   1;.    if( v>25
a910: 35 20 29 20 76 20 3d 20 32 35 35 3b 0a 20 20 20  5 ) v = 255;.   
a920: 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 76   pCol->szEst = v
a930: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
a940: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ff;.}../*.** The
a950: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
a960: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
a970: 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
a980: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
a990: 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61  umn.** of the ta
a9a0: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
a9b0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
a9c0: 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20  ..**.** Default 
a9d0: 76 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e  value expression
a9e0: 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61  s must be consta
a9f0: 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78  nt.  Raise an ex
aa00: 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a  ception if this.
aa10: 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  ** is not the ca
aa20: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
aa30: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
aa40: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
aa50: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
aa60: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
aa70: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
aa80: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
aa90: 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66  id sqlite3AddDef
aaa0: 61 75 6c 74 56 61 6c 75 65 28 0a 20 20 50 61 72  aultValue(.  Par
aab0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
aac0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
aad0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
aae0: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
aaf0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
ab00: 72 73 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20  rsed expression 
ab10: 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  of the default v
ab20: 61 6c 75 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  alue */.  const 
ab30: 63 68 61 72 20 2a 7a 53 74 61 72 74 2c 20 20 20  char *zStart,   
ab40: 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 74     /* Start of t
ab50: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
ab60: 20 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74   text */.  const
ab70: 20 63 68 61 72 20 2a 7a 45 6e 64 20 20 20 20 20   char *zEnd     
ab80: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63 68 61      /* First cha
ab90: 72 61 63 74 65 72 20 70 61 73 74 20 65 6e 64 20  racter past end 
aba0: 6f 66 20 64 65 66 61 75 74 20 76 61 6c 75 65 20  of defaut value 
abb0: 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  text */.){.  Tab
abc0: 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20  le *p;.  Column 
abd0: 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33  *pCol;.  sqlite3
abe0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
abf0: 62 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  b;.  p = pParse-
ac00: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
ac10: 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 70 43  ( p!=0 ){.    pC
ac20: 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70  ol = &(p->aCol[p
ac30: 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20  ->nCol-1]);.    
ac40: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
ac50: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
ac60: 74 69 6f 6e 28 70 45 78 70 72 2c 20 64 62 2d 3e  tion(pExpr, db->
ac70: 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20  init.busy) ){.  
ac80: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ac90: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66  Msg(pParse, "def
aca0: 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f  ault value of co
acb0: 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74  lumn [%s] is not
acc0: 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20   constant",.    
acd0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d        pCol->zNam
ace0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
acf0: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
ad00: 66 20 70 45 78 70 72 20 69 73 20 75 73 65 64 20  f pExpr is used 
ad10: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 6f  instead of the o
ad20: 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78 70  riginal, as pExp
ad30: 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  r contains.     
ad40: 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74 20   ** tokens that 
ad50: 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c  point to volatil
ad60: 65 20 6d 65 6d 6f 72 79 2e 0a 20 20 20 20 20 20  e memory..      
ad70: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 78 3b  */.      Expr x;
ad80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
ad90: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  prDelete(db, pCo
ada0: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->pDflt);.     
adb0: 20 6d 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73   memset(&x, 0, s
adc0: 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20  izeof(x));.     
add0: 20 78 2e 6f 70 20 3d 20 54 4b 5f 53 50 41 4e 3b   x.op = TK_SPAN;
ade0: 0a 20 20 20 20 20 20 78 2e 75 2e 7a 54 6f 6b 65  .      x.u.zToke
adf0: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 70 61  n = sqlite3DbSpa
ae00: 6e 44 75 70 28 64 62 2c 20 7a 53 74 61 72 74 2c  nDup(db, zStart,
ae10: 20 7a 45 6e 64 29 3b 0a 20 20 20 20 20 20 78 2e   zEnd);.      x.
ae20: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 3b 0a 20  pLeft = pExpr;. 
ae30: 20 20 20 20 20 78 2e 66 6c 61 67 73 20 3d 20 45       x.flags = E
ae40: 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 43  P_Skip;.      pC
ae50: 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69  ol->pDflt = sqli
ae60: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 26  te3ExprDup(db, &
ae70: 78 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  x, EXPRDUP_REDUC
ae80: 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  E);.      sqlite
ae90: 33 44 62 46 72 65 65 28 64 62 2c 20 78 2e 75 2e  3DbFree(db, x.u.
aea0: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20  zToken);.    }. 
aeb0: 20 7d 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41   }.  if( IN_RENA
aec0: 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
aed0: 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 45 78   sqlite3RenameEx
aee0: 70 72 55 6e 6d 61 70 28 70 50 61 72 73 65 2c 20  prUnmap(pParse, 
aef0: 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 73 71  pExpr);.  }.  sq
af00: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
af10: 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  db, pExpr);.}../
af20: 2a 0a 2a 2a 20 42 61 63 6b 77 61 72 64 73 20 43  *.** Backwards C
af30: 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 48 61 63  ompatibility Hac
af40: 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48 69 73 74 6f 72  k:.** .** Histor
af50: 69 63 61 6c 20 76 65 72 73 69 6f 6e 73 20 6f 66  ical versions of
af60: 20 53 51 4c 69 74 65 20 61 63 63 65 70 74 65 64   SQLite accepted
af70: 20 73 74 72 69 6e 67 73 20 61 73 20 63 6f 6c 75   strings as colu
af80: 6d 6e 20 6e 61 6d 65 73 20 69 6e 0a 2a 2a 20 69  mn names in.** i
af90: 6e 64 65 78 65 73 20 61 6e 64 20 50 52 49 4d 41  ndexes and PRIMA
afa0: 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
afb0: 74 73 20 61 6e 64 20 69 6e 20 55 4e 49 51 55 45  ts and in UNIQUE
afc0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 45   constraints.  E
afd0: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
afe0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78    CREATE TABLE x
aff0: 79 7a 28 61 2c 62 2c 63 2c 64 2c 65 2c 50 52 49  yz(a,b,c,d,e,PRI
b000: 4d 41 52 59 20 4b 45 59 28 27 61 27 29 2c 55 4e  MARY KEY('a'),UN
b010: 49 51 55 45 28 27 62 27 2c 27 63 27 20 43 4f 4c  IQUE('b','c' COL
b020: 4c 41 54 45 20 74 72 69 6d 29 0a 2a 2a 20 20 20  LATE trim).**   
b030: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 61    CREATE INDEX a
b040: 62 63 20 4f 4e 20 78 79 7a 28 27 63 27 2c 27 64  bc ON xyz('c','d
b050: 27 20 44 45 53 43 2c 27 65 27 20 43 4f 4c 4c 41  ' DESC,'e' COLLA
b060: 54 45 20 6e 6f 63 61 73 65 20 44 45 53 43 29 3b  TE nocase DESC);
b070: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 67  .**.** This is g
b080: 6f 6f 66 79 2e 20 20 42 75 74 20 74 6f 20 70 72  oofy.  But to pr
b090: 65 73 65 72 76 65 20 62 61 63 6b 77 61 72 64 73  eserve backwards
b0a0: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
b0b0: 65 20 63 6f 6e 74 69 6e 75 65 20 74 6f 0a 2a 2a  e continue to.**
b0c0: 20 61 63 63 65 70 74 20 69 74 2e 20 20 54 68 69   accept it.  Thi
b0d0: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
b0e0: 68 65 20 6e 65 63 65 73 73 61 72 79 20 63 6f 6e  he necessary con
b0f0: 76 65 72 73 69 6f 6e 2e 20 20 49 74 20 63 6f 6e  version.  It con
b100: 76 65 72 74 73 0a 2a 2a 20 74 68 65 20 65 78 70  verts.** the exp
b110: 72 65 73 73 69 6f 6e 20 67 69 76 65 6e 20 69 6e  ression given in
b120: 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20 66 72   its argument fr
b130: 6f 6d 20 61 20 54 4b 5f 53 54 52 49 4e 47 20 69  om a TK_STRING i
b140: 6e 74 6f 20 61 20 54 4b 5f 49 44 0a 2a 2a 20 69  nto a TK_ID.** i
b150: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
b160: 20 69 73 20 6a 75 73 74 20 61 20 54 4b 5f 53 54   is just a TK_ST
b170: 52 49 4e 47 20 77 69 74 68 20 61 6e 20 6f 70 74  RING with an opt
b180: 69 6f 6e 61 6c 20 43 4f 4c 4c 41 54 45 20 63 6c  ional COLLATE cl
b190: 61 75 73 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ause..** If the 
b1a0: 65 70 78 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  epxression is an
b1b0: 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ything other tha
b1c0: 6e 20 54 4b 5f 53 54 52 49 4e 47 2c 20 74 68 65  n TK_STRING, the
b1d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a   expression is.*
b1e0: 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  * unchanged..*/.
b1f0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
b200: 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 45 78  te3StringToId(Ex
b210: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  pr *p){.  if( p-
b220: 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29  >op==TK_STRING )
b230: 7b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  {.    p->op = TK
b240: 5f 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _ID;.  }else if(
b250: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41   p->op==TK_COLLA
b260: 54 45 20 26 26 20 70 2d 3e 70 4c 65 66 74 2d 3e  TE && p->pLeft->
b270: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op==TK_STRING ){
b280: 0a 20 20 20 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f  .    p->pLeft->o
b290: 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 0a 7d  p = TK_ID;.  }.}
b2a0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74  ../*.** Designat
b2b0: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
b2c0: 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  Y for the table.
b2d0: 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73    pList is a lis
b2e0: 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f  t of names .** o
b2f0: 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66  f columns that f
b300: 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20  orm the primary 
b310: 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69  key.  If pList i
b320: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
b330: 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  .** most recentl
b340: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f  y added column o
b350: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74  f the table is t
b360: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a  he primary key..
b370: 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61  **.** A table ca
b380: 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f  n have at most o
b390: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  ne primary key. 
b3a0: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   If the table al
b3b0: 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70  ready has.** a p
b3c0: 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20  rimary key (and 
b3d0: 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f  this is the seco
b3e0: 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20  nd primary key) 
b3f0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a  then create an.*
b400: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  * error..**.** I
b410: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
b420: 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  Y is on a single
b430: 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61   column whose da
b440: 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45  tatype is INTEGE
b450: 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69  R,.** then we wi
b460: 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  ll try to use th
b470: 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  at column as the
b480: 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65   rowid.  Set the
b490: 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20   Table.iPKey.** 
b4a0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62  field of the tab
b4b0: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
b4c0: 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20  ction to be the 
b4d0: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
b4e0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
b4f0: 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62  KEY column.  Tab
b500: 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20  le.iPKey is set 
b510: 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69  to -1 if there i
b520: 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20  s.** no INTEGER 
b530: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a  PRIMARY KEY..**.
b540: 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73  ** If the key is
b550: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
b560: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
b570: 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  n create a uniqu
b580: 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74  e.** index for t
b590: 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65  he key.  No inde
b5a0: 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72  x is created for
b5b0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
b5c0: 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   KEYs..*/.void s
b5d0: 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
b5e0: 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
b5f0: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
b600: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
b610: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
b620: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69  ,  /* List of fi
b630: 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20  eld names to be 
b640: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
b650: 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
b660: 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
b670: 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63  h a uniqueness c
b680: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74  onflict */.  int
b690: 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f   autoInc,      /
b6a0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55  * True if the AU
b6b0: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77  TOINCREMENT keyw
b6c0: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
b6d0: 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
b6e0: 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  r     /* SQLITE_
b6f0: 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45  SO_ASC or SQLITE
b700: 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20  _SO_DESC */.){. 
b710: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
b720: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
b730: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
b740: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
b750: 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 6e 74 20   = -1, i;.  int 
b760: 6e 54 65 72 6d 3b 0a 20 20 69 66 28 20 70 54 61  nTerm;.  if( pTa
b770: 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 69 6d  b==0 ) goto prim
b780: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20  ary_key_exit;.  
b790: 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61  if( pTab->tabFla
b7a0: 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61  gs & TF_HasPrima
b7b0: 72 79 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  ryKey ){.    sql
b7c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
b7d0: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62  rse, .      "tab
b7e0: 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f  le \"%s\" has mo
b7f0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d  re than one prim
b800: 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e  ary key", pTab->
b810: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
b820: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
b830: 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74  t;.  }.  pTab->t
b840: 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61  abFlags |= TF_Ha
b850: 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69  sPrimaryKey;.  i
b860: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
b870: 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     iCol = pTab->
b880: 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 43  nCol - 1;.    pC
b890: 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c  ol = &pTab->aCol
b8a0: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 70 43 6f 6c  [iCol];.    pCol
b8b0: 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f  ->colFlags |= CO
b8c0: 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20  LFLAG_PRIMKEY;. 
b8d0: 20 20 20 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20     nTerm = 1;.  
b8e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 54 65 72 6d  }else{.    nTerm
b8f0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
b900: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
b910: 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTerm; i++){.   
b920: 20 20 20 45 78 70 72 20 2a 70 43 45 78 70 72 20     Expr *pCExpr 
b930: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
b940: 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e  pCollate(pList->
b950: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
b960: 20 20 20 61 73 73 65 72 74 28 20 70 43 45 78 70     assert( pCExp
b970: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  r!=0 );.      sq
b980: 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28  lite3StringToId(
b990: 70 43 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  pCExpr);.      i
b9a0: 66 28 20 70 43 45 78 70 72 2d 3e 6f 70 3d 3d 54  f( pCExpr->op==T
b9b0: 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  K_ID ){.        
b9c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 4e 61  const char *zCNa
b9d0: 6d 65 20 3d 20 70 43 45 78 70 72 2d 3e 75 2e 7a  me = pCExpr->u.z
b9e0: 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 66  Token;.        f
b9f0: 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
ba00: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
ba10: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
ba20: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
ba30: 70 28 7a 43 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  p(zCName, pTab->
ba40: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
ba50: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
ba60: 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62      pCol = &pTab
ba70: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  ->aCol[iCol];.  
ba80: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
ba90: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
baa0: 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20  LAG_PRIMKEY;.   
bab0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bac0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
bad0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
bae0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54    }.  }.  if( nT
baf0: 65 72 6d 3d 3d 31 0a 20 20 20 26 26 20 70 43 6f  erm==1.   && pCo
bb00: 6c 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 53  l.   && sqlite3S
bb10: 74 72 49 43 6d 70 28 73 71 6c 69 74 65 33 43 6f  trICmp(sqlite3Co
bb20: 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22  lumnType(pCol,""
bb30: 29 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30  ), "INTEGER")==0
bb40: 0a 20 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72  .   && sortOrder
bb50: 21 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  !=SQLITE_SO_DESC
bb60: 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 49 4e  .  ){.    if( IN
bb70: 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26  _RENAME_OBJECT &
bb80: 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  & pList ){.     
bb90: 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f   sqlite3RenameTo
bba0: 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c  kenRemap(pParse,
bbb0: 20 26 70 54 61 62 2d 3e 69 50 4b 65 79 2c 20 70   &pTab->iPKey, p
bbc0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
bbd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  );.    }.    pTa
bbe0: 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b  b->iPKey = iCol;
bbf0: 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f  .    pTab->keyCo
bc00: 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72  nf = (u8)onError
bc10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 75  ;.    assert( au
bc20: 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f  toInc==0 || auto
bc30: 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54  Inc==1 );.    pT
bc40: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
bc50: 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69  autoInc*TF_Autoi
bc60: 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 20 20 69 66  ncrement;.    if
bc70: 28 20 70 4c 69 73 74 20 29 20 70 50 61 72 73 65  ( pList ) pParse
bc80: 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 20 3d  ->iPkSortOrder =
bc90: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72   pList->a[0].sor
bca0: 74 4f 72 64 65 72 3b 0a 20 20 7d 65 6c 73 65 20  tOrder;.  }else 
bcb0: 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23  if( autoInc ){.#
bcc0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
bcd0: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
bce0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
bcf0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55  rMsg(pParse, "AU
bd00: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f  TOINCREMENT is o
bd10: 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61  nly allowed on a
bd20: 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45  n ".       "INTE
bd30: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
bd40: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
bd50: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72  e{.    sqlite3Cr
bd60: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
bd70: 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74  , 0, 0, 0, pList
bd80: 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20  , onError, 0,.  
bd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bda0: 20 20 20 20 20 20 20 20 20 30 2c 20 73 6f 72 74           0, sort
bdb0: 4f 72 64 65 72 2c 20 30 2c 20 53 51 4c 49 54 45  Order, 0, SQLITE
bdc0: 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59  _IDXTYPE_PRIMARY
bdd0: 4b 45 59 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  KEY);.    pList 
bde0: 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72  = 0;.  }..primar
bdf0: 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71  y_key_exit:.  sq
be00: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
be10: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
be20: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
be30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
be40: 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74   new CHECK const
be50: 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62  raint to the tab
be60: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
be70: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
be80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
be90: 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69  AddCheckConstrai
bea0: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
beb0: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
bec0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
bed0: 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72  Expr *pCheckExpr
bee0: 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65    /* The check e
bef0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a  xpression */.){.
bf00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
bf10: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c  MIT_CHECK.  Tabl
bf20: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
bf30: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 73  ->pNewTable;.  s
bf40: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
bf50: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
bf60: 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41  Tab && !IN_DECLA
bf70: 52 45 5f 56 54 41 42 0a 20 20 20 26 26 20 21 73  RE_VTAB.   && !s
bf80: 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 65 61  qlite3BtreeIsRea
bf90: 64 6f 6e 6c 79 28 64 62 2d 3e 61 44 62 5b 64 62  donly(db->aDb[db
bfa0: 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e 70 42 74 29  ->init.iDb].pBt)
bfb0: 0a 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  .  ){.    pTab->
bfc0: 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33  pCheck = sqlite3
bfd0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
bfe0: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68  Parse, pTab->pCh
bff0: 65 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72 29  eck, pCheckExpr)
c000: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
c010: 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65  ->constraintName
c020: 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  .n ){.      sqli
c030: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
c040: 6d 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  me(pParse, pTab-
c050: 3e 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73 65  >pCheck, &pParse
c060: 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65  ->constraintName
c070: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 1);.    }.  }e
c080: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
c090: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
c0a0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
c0b0: 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20   pCheckExpr);.  
c0c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
c0d0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  he collation fun
c0e0: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ction of the mos
c0f0: 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65  t recently parse
c100: 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a  d table column.*
c110: 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71  * to the CollSeq
c120: 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20   given..*/.void 
c130: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74  sqlite3AddCollat
c140: 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  eType(Parse *pPa
c150: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  rse, Token *pTok
c160: 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  en){.  Table *p;
c170: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
c180: 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *zColl;        
c190: 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65        /* Dequote
c1a0: 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74  d name of collat
c1b0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ion sequence */.
c1c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
c1d0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
c1e0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
c1f0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
c200: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62   p->nCol-1;.  db
c210: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c220: 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
c230: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
c240: 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28  , pToken);.  if(
c250: 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e   !zColl ) return
c260: 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
c270: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
c280: 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  arse, zColl) ){.
c290: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
c2a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
c2b0: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69  ee(db, p->aCol[i
c2c0: 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d  ].zColl);.    p-
c2d0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d  >aCol[i].zColl =
c2e0: 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f   zColl;.  .    /
c2f0: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
c300: 69 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 22  is declared as "
c310: 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b  <name> PRIMARY K
c320: 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65  EY COLLATE <type
c330: 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  >",.    ** then 
c340: 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76  an index may hav
c350: 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f  e been created o
c360: 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65  n this column be
c370: 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  fore the.    ** 
c380: 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77  collation type w
c390: 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63  as added. Correc
c3a0: 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20  t this if it is 
c3b0: 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  the case..    */
c3c0: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d  .    for(pIdx=p-
c3d0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
c3e0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
c3f0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
c400: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31  pIdx->nKeyCol==1
c410: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
c420: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
c430: 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =i ){.        pI
c440: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20  dx->azColl[0] = 
c450: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
c460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c470: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
c480: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
c490: 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Coll);.  }.}../*
c4a0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
c4b0: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f  n returns the co
c4c0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
c4d0: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61   for database na
c4e0: 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63  tive text.** enc
c4f0: 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64  oding identified
c500: 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a   by the string z
c510: 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61  Name, length nNa
c520: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  me..**.** If the
c530: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
c540: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73  tion sequence is
c550: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20   not available, 
c560: 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  or not available
c570: 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62  .** in the datab
c580: 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64  ase native encod
c590: 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69  ing, the collati
c5a0: 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e  on factory is in
c5b0: 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75  voked to.** requ
c5c0: 65 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63  est it. If the c
c5d0: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
c5e0: 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79   does not supply
c5f0: 20 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65   such a sequence
c600: 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71  ,.** and the seq
c610: 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62  uence is availab
c620: 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65  le in another te
c630: 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65  xt encoding, the
c640: 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74  n that is.** ret
c650: 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  urned instead..*
c660: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69  *.** If no versi
c670: 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65  ons of the reque
c680: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20  sted collations 
c690: 73 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61  sequence are ava
c6a0: 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e  ilable, or.** an
c6b0: 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75  other error occu
c6c0: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
c6d0: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
c6e0: 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65  r message writte
c6f0: 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65  n into.** pParse
c700: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
c710: 74 69 6e 65 20 69 73 20 61 20 77 72 61 70 70 65  tine is a wrappe
c720: 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33  r around sqlite3
c730: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20  FindCollSeq().  
c740: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
c750: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c  invokes the coll
c760: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 66  ation factory if
c770: 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61   the named colla
c780: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66  tion cannot be f
c790: 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  ound.** and gene
c7a0: 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  rates an error m
c7b0: 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65  essage..**.** Se
c7c0: 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46  e also: sqlite3F
c7d0: 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71  indCollSeq(), sq
c7e0: 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28  lite3GetCollSeq(
c7f0: 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ).*/.CollSeq *sq
c800: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
c810: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
c820: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
c830: 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ame){.  sqlite3 
c840: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c850: 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43  ;.  u8 enc = ENC
c860: 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62  (db);.  u8 initb
c870: 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62  usy = db->init.b
c880: 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  usy;.  CollSeq *
c890: 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20  pColl;..  pColl 
c8a0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
c8b0: 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e  lSeq(db, enc, zN
c8c0: 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a  ame, initbusy);.
c8d0: 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20    if( !initbusy 
c8e0: 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70  && (!pColl || !p
c8f0: 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20  Coll->xCmp) ){. 
c900: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
c910: 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61  e3GetCollSeq(pPa
c920: 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c  rse, enc, pColl,
c930: 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20   zName);.  }..  
c940: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
c950: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
c960: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
c970: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63  increment the sc
c980: 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a  hema cookie..**.
c990: 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f  ** The schema co
c9a0: 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20  okie is used to 
c9b0: 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74  determine when t
c9c0: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
c9d0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
c9e0: 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61  anges.  After ea
c9f0: 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ch schema change
ca00: 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c  , the cookie val
ca10: 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  ue.** changes.  
ca20: 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66  When a process f
ca30: 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73  irst reads the s
ca40: 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73  chema it records
ca50: 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20   the.** cookie. 
ca60: 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65   Thereafter, whe
ca70: 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f  never it goes to
ca80: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
ca90: 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63  base,.** it chec
caa0: 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  ks the cookie to
cab0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
cac0: 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68  chema has not ch
cad0: 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69  anged.** since i
cae0: 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e  t was last read.
caf0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e  .**.** This plan
cb00: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   is not complete
cb10: 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e  ly bullet-proof.
cb20: 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
cb30: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65   for.** the sche
cb40: 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c  ma to change mul
cb50: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20  tiple times and 
cb60: 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  for the cookie t
cb70: 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b  o be.** set back
cb80: 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e   to prior value.
cb90: 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61    But schema cha
cba0: 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75  nges are infrequ
cbb0: 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70  ent.** and the p
cbc0: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69  robability of hi
cbd0: 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  tting the same c
cbe0: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f  ookie value is o
cbf0: 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20  nly.** 1 chance 
cc00: 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27  in 2^32.  So we'
cc10: 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a  re safe enough..
cc20: 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  **.** IMPLEMENTA
cc30: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 33 34 32 33 30  TION-OF: R-34230
cc40: 2d 35 36 30 34 39 20 53 51 4c 69 74 65 20 61 75  -56049 SQLite au
cc50: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69 6e 63 72  tomatically incr
cc60: 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20 73 63  ements.** the sc
cc70: 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 77 68 65  hema-version whe
cc80: 6e 65 76 65 72 20 74 68 65 20 73 63 68 65 6d 61  never the schema
cc90: 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 76 6f 69   changes..*/.voi
cca0: 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43  d sqlite3ChangeC
ccb0: 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61  ookie(Parse *pPa
ccc0: 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  rse, int iDb){. 
ccd0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
cce0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
ccf0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
cd00: 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
cd10: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
cd20: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
cd30: 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  0) );.  sqlite3V
cd40: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
cd50: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
cd60: 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52  BTREE_SCHEMA_VER
cd70: 53 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20 20 20  SION, .         
cd80: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
cd90: 31 2b 28 75 6e 73 69 67 6e 65 64 29 64 62 2d 3e  1+(unsigned)db->
cda0: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
cdb0: 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 29  ->schema_cookie)
cdc0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73  );.}../*.** Meas
cdd0: 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ure the number o
cde0: 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65  f characters nee
cdf0: 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68  ded to output th
ce00: 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74  e given.** ident
ce10: 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62  ifier.  The numb
ce20: 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  er returned incl
ce30: 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20  udes any quotes 
ce40: 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73  used.** but does
ce50: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65   not include the
ce60: 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72   null terminator
ce70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69  ..**.** The esti
ce80: 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61  mate is conserva
ce90: 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20  tive.  It might 
cea0: 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77  be larger that w
ceb0: 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79  hat is.** really
cec0: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
ced0: 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67  ic int identLeng
cee0: 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  th(const char *z
cef0: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f  ){.  int n;.  fo
cf00: 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20  r(n=0; *z; n++, 
cf10: 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a  z++){.    if( *z
cf20: 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a  =='"' ){ n++; }.
cf30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b    }.  return n +
cf40: 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   2;.}../*.** The
cf50: 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72   first parameter
cf60: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
cf70: 20 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65   an output buffe
cf80: 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a  r. The second .*
cf90: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  * parameter is a
cfa0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
cfb0: 6e 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74  nteger that cont
cfc0: 61 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20  ains the offset 
cfd0: 61 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77  at.** which to w
cfe0: 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  rite into the ou
cff0: 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 69  tput buffer. Thi
d000: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65  s function copie
d010: 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72  s the.** nul-ter
d020: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70  minated string p
d030: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
d040: 20 74 68 69 72 64 20 70 61 72 61 6d 65 74 65 72   third parameter
d050: 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a  , zSignedIdent,.
d060: 2a 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  ** to the specif
d070: 69 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68  ied offset in th
d080: 65 20 62 75 66 66 65 72 20 61 6e 64 20 75 70 64  e buffer and upd
d090: 61 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65  ates *pIdx to re
d0a0: 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69  fer.** to the fi
d0b0: 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20 74  rst byte after t
d0c0: 68 65 20 6c 61 73 74 20 62 79 74 65 20 77 72 69  he last byte wri
d0d0: 74 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75  tten before retu
d0e0: 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  rning..** .** If
d0f0: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67   the string zSig
d100: 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74  nedIdent consist
d110: 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c  s entirely of al
d120: 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63  pha-numeric.** c
d130: 68 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20  haracters, does 
d140: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  not begin with a
d150: 20 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f   digit and is no
d160: 74 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64  t an SQL keyword
d170: 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20  ,.** then it is 
d180: 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75  copied to the ou
d190: 74 70 75 74 20 62 75 66 66 65 72 20 65 78 61 63  tput buffer exac
d1a0: 74 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74  tly as it is. Ot
d1b0: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69  herwise,.** it i
d1c0: 73 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64  s quoted using d
d1d0: 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f  ouble-quotes..*/
d1e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65  .static void ide
d1f0: 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69  ntPut(char *z, i
d200: 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a  nt *pIdx, char *
d210: 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20  zSignedIdent){. 
d220: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
d230: 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e  zIdent = (unsign
d240: 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64  ed char*)zSigned
d250: 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20  Ident;.  int i, 
d260: 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20  j, needQuote;.  
d270: 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f  i = *pIdx;..  fo
d280: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
d290: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; j++){.    if( 
d2a0: 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28  !sqlite3Isalnum(
d2b0: 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49  zIdent[j]) && zI
d2c0: 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62  dent[j]!='_' ) b
d2d0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64  reak;.  }.  need
d2e0: 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49  Quote = sqlite3I
d2f0: 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d  sdigit(zIdent[0]
d300: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ).            ||
d310: 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43   sqlite3KeywordC
d320: 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d  ode(zIdent, j)!=
d330: 54 4b 5f 49 44 0a 20 20 20 20 20 20 20 20 20 20  TK_ID.          
d340: 20 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d    || zIdent[j]!=
d350: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0.            ||
d360: 20 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28 20 6e 65   j==0;..  if( ne
d370: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
d380: 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d   = '"';.  for(j=
d390: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
d3a0: 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d  +){.    z[i++] =
d3b0: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20   zIdent[j];.    
d3c0: 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27  if( zIdent[j]=='
d3d0: 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  "' ) z[i++] = '"
d3e0: 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65  ';.  }.  if( nee
d3f0: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
d400: 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20  = '"';.  z[i] = 
d410: 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a  0;.  *pIdx = i;.
d420: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
d430: 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  e a CREATE TABLE
d440: 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f   statement appro
d450: 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67  priate for the g
d460: 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20  iven.** table.  
d470: 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74  Memory to hold t
d480: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73  he text of the s
d490: 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61  tatement is obta
d4a0: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
d4b0: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
d4c0: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
d4d0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
d4e0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
d4f0: 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62   char *createTab
d500: 6c 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a  leStmt(sqlite3 *
d510: 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20  db, Table *p){. 
d520: 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20   int i, k, n;.  
d530: 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63  char *zStmt;.  c
d540: 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70  har *zSep, *zSep
d550: 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75  2, *zEnd;.  Colu
d560: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20  mn *pCol;.  n = 
d570: 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20  0;.  for(pCol = 
d580: 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c  p->aCol, i=0; i<
d590: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  p->nCol; i++, pC
d5a0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ol++){.    n += 
d5b0: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c  identLength(pCol
d5c0: 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20  ->zName) + 5;.  
d5d0: 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65  }.  n += identLe
d5e0: 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  ngth(p->zName);.
d5f0: 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20    if( n<50 ){ . 
d600: 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20     zSep = "";.  
d610: 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20    zSep2 = ",";. 
d620: 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20     zEnd = ")";. 
d630: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70   }else{.    zSep
d640: 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a   = "\n  ";.    z
d650: 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a  Sep2 = ",\n  ";.
d660: 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22      zEnd = "\n)"
d670: 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20  ;.  }.  n += 35 
d680: 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a  + 6*p->nCol;.  z
d690: 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 44 62  Stmt = sqlite3Db
d6a0: 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29 3b  MallocRaw(0, n);
d6b0: 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20  .  if( zStmt==0 
d6c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  ){.    sqlite3Oo
d6d0: 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
d6e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
d6f0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
d700: 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45 41  (n, zStmt, "CREA
d710: 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b  TE TABLE ");.  k
d720: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
d730: 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65  30(zStmt);.  ide
d740: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
d750: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53   p->zName);.  zS
d760: 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a  tmt[k++] = '(';.
d770: 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43    for(pCol=p->aC
d780: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
d790: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
d7a0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
d7b0: 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  st char * const 
d7c0: 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20  azType[] = {.   
d7d0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
d7e0: 46 46 5f 42 4c 4f 42 20 20 20 20 2a 2f 20 22 22  FF_BLOB    */ ""
d7f0: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
d800: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20  ITE_AFF_TEXT    
d810: 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20 20  */ " TEXT",.    
d820: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
d830: 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e  F_NUMERIC */ " N
d840: 55 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  UM",.        /* 
d850: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
d860: 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20  ER */ " INT",.  
d870: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
d880: 41 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22  AFF_REAL    */ "
d890: 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20   REAL".    };.  
d8a0: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63    int len;.    c
d8b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
d8c0: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ;..    sqlite3_s
d8d0: 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53  nprintf(n-k, &zS
d8e0: 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20  tmt[k], zSep);. 
d8f0: 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53     k += sqlite3S
d900: 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b  trlen30(&zStmt[k
d910: 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a  ]);.    zSep = z
d920: 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50  Sep2;.    identP
d930: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43  ut(zStmt, &k, pC
d940: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
d950: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66  assert( pCol->af
d960: 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46  finity-SQLITE_AF
d970: 46 5f 42 4c 4f 42 20 3e 3d 20 30 20 29 3b 0a 20  F_BLOB >= 0 );. 
d980: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
d990: 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45  >affinity-SQLITE
d9a0: 5f 41 46 46 5f 42 4c 4f 42 20 3c 20 41 72 72 61  _AFF_BLOB < Arra
d9b0: 79 53 69 7a 65 28 61 7a 54 79 70 65 29 20 29 3b  ySize(azType) );
d9c0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
d9d0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
d9e0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29  QLITE_AFF_BLOB )
d9f0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
da00: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
da10: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
da20: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
da30: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
da40: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
da50: 52 49 43 20 29 3b 0a 20 20 20 20 74 65 73 74 63  RIC );.    testc
da60: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
da70: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
da80: 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 74  INTEGER );.    t
da90: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
daa0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
dab0: 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20  AFF_REAL );.    
dac0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 61 7a 54  .    zType = azT
dad0: 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  ype[pCol->affini
dae0: 74 79 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty - SQLITE_AFF_
daf0: 42 4c 4f 42 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d  BLOB];.    len =
db00: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
db10: 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 61 73 73  (zType);.    ass
db20: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
db30: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
db40: 42 4c 4f 42 20 0a 20 20 20 20 20 20 20 20 20 20  BLOB .          
db50: 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e    || pCol->affin
db60: 69 74 79 3d 3d 73 71 6c 69 74 65 33 41 66 66 69  ity==sqlite3Affi
db70: 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20  nityType(zType, 
db80: 30 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  0) );.    memcpy
db90: 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70  (&zStmt[k], zTyp
dba0: 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b  e, len);.    k +
dbb0: 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65 72  = len;.    asser
dbc0: 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20  t( k<=n );.  }. 
dbd0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
dbe0: 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d  f(n-k, &zStmt[k]
dbf0: 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20  , "%s", zEnd);. 
dc00: 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d   return zStmt;.}
dc10: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61  ../*.** Resize a
dc20: 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74  n Index object t
dc30: 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73  o hold N columns
dc40: 20 74 6f 74 61 6c 2e 20 20 52 65 74 75 72 6e 20   total.  Return 
dc50: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
dc60: 73 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c 49  success and SQLI
dc70: 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f  TE_NOMEM on an O
dc80: 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  OM error..*/.sta
dc90: 74 69 63 20 69 6e 74 20 72 65 73 69 7a 65 49 6e  tic int resizeIn
dca0: 64 65 78 4f 62 6a 65 63 74 28 73 71 6c 69 74 65  dexObject(sqlite
dcb0: 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49  3 *db, Index *pI
dcc0: 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68  dx, int N){.  ch
dcd0: 61 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20 69 6e  ar *zExtra;.  in
dce0: 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70  t nByte;.  if( p
dcf0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20  Idx->nColumn>=N 
dd00: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
dd10: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  OK;.  assert( pI
dd20: 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d 3d 30  dx->isResized==0
dd30: 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 73   );.  nByte = (s
dd40: 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b 20 73  izeof(char*) + s
dd50: 69 7a 65 6f 66 28 69 31 36 29 20 2b 20 31 29 2a  izeof(i16) + 1)*
dd60: 4e 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 73 71  N;.  zExtra = sq
dd70: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
dd80: 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  o(db, nByte);.  
dd90: 69 66 28 20 7a 45 78 74 72 61 3d 3d 30 20 29 20  if( zExtra==0 ) 
dda0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
ddb0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63  MEM_BKPT;.  memc
ddc0: 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d  py(zExtra, pIdx-
ddd0: 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28  >azColl, sizeof(
dde0: 63 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f  char*)*pIdx->nCo
ddf0: 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn);.  pIdx->a
de00: 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63  zColl = (const c
de10: 68 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20  har**)zExtra;.  
de20: 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66  zExtra += sizeof
de30: 28 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d  (char*)*N;.  mem
de40: 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78  cpy(zExtra, pIdx
de50: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65  ->aiColumn, size
de60: 6f 66 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43  of(i16)*pIdx->nC
de70: 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e  olumn);.  pIdx->
de80: 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a  aiColumn = (i16*
de90: 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72  )zExtra;.  zExtr
dea0: 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29  a += sizeof(i16)
deb0: 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  *N;.  memcpy(zEx
dec0: 74 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74  tra, pIdx->aSort
ded0: 4f 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f  Order, pIdx->nCo
dee0: 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn);.  pIdx->a
def0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
df00: 29 7a 45 78 74 72 61 3b 0a 20 20 70 49 64 78 2d  )zExtra;.  pIdx-
df10: 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20  >nColumn = N;.  
df20: 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 20  pIdx->isResized 
df30: 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
df40: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
df50: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 74  * Estimate the t
df60: 6f 74 61 6c 20 72 6f 77 20 77 69 64 74 68 20 66  otal row width f
df70: 6f 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  or a table..*/.s
df80: 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d  tatic void estim
df90: 61 74 65 54 61 62 6c 65 57 69 64 74 68 28 54 61  ateTableWidth(Ta
dfa0: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e  ble *pTab){.  un
dfb0: 73 69 67 6e 65 64 20 77 54 61 62 6c 65 20 3d 20  signed wTable = 
dfc0: 30 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d  0;.  const Colum
dfd0: 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e  n *pTabCol;.  in
dfe0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61  t i;.  for(i=pTa
dff0: 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c  b->nCol, pTabCol
e000: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30  =pTab->aCol; i>0
e010: 3b 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b  ; i--, pTabCol++
e020: 29 7b 0a 20 20 20 20 77 54 61 62 6c 65 20 2b 3d  ){.    wTable +=
e030: 20 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b   pTabCol->szEst;
e040: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d  .  }.  if( pTab-
e050: 3e 69 50 4b 65 79 3c 30 20 29 20 77 54 61 62 6c  >iPKey<0 ) wTabl
e060: 65 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54  e++;.  pTab->szT
e070: 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  abRow = sqlite3L
e080: 6f 67 45 73 74 28 77 54 61 62 6c 65 2a 34 29 3b  ogEst(wTable*4);
e090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  .}../*.** Estima
e0a0: 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20 73  te the average s
e0b0: 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 66 6f 72  ize of a row for
e0c0: 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74   an index..*/.st
e0d0: 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61  atic void estima
e0e0: 74 65 49 6e 64 65 78 57 69 64 74 68 28 49 6e 64  teIndexWidth(Ind
e0f0: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73  ex *pIdx){.  uns
e100: 69 67 6e 65 64 20 77 49 6e 64 65 78 20 3d 20 30  igned wIndex = 0
e110: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  ;.  int i;.  con
e120: 73 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20  st Column *aCol 
e130: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
e140: 61 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aCol;.  for(i=0;
e150: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
e160: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20  ; i++){.    i16 
e170: 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  x = pIdx->aiColu
e180: 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  mn[i];.    asser
e190: 74 28 20 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c  t( x<pIdx->pTabl
e1a0: 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77  e->nCol );.    w
e1b0: 49 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31  Index += x<0 ? 1
e1c0: 20 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69   : aCol[pIdx->ai
e1d0: 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74  Column[i]].szEst
e1e0: 3b 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a  ;.  }.  pIdx->sz
e1f0: 49 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  IdxRow = sqlite3
e200: 4c 6f 67 45 73 74 28 77 49 6e 64 65 78 2a 34 29  LogEst(wIndex*4)
e210: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  ;.}../* Return t
e220: 72 75 65 20 69 66 20 76 61 6c 75 65 20 78 20 69  rue if value x i
e230: 73 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66 20 74  s found any of t
e240: 68 65 20 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e  he first nCol en
e250: 74 72 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d  tries of aiCol[]
e260: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
e270: 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69  asColumn(const i
e280: 31 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e  16 *aiCol, int n
e290: 43 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77  Col, int x){.  w
e2a0: 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30  hile( nCol-- > 0
e2b0: 20 29 20 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f   ) if( x==*(aiCo
e2c0: 6c 2b 2b 29 20 29 20 72 65 74 75 72 6e 20 31 3b  l++) ) return 1;
e2d0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
e2e0: 2f 2a 20 52 65 63 6f 6d 70 75 74 65 20 74 68 65  /* Recompute the
e2f0: 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 66 69 65   colNotIdxed fie
e300: 6c 64 20 6f 66 20 74 68 65 20 49 6e 64 65 78 2e  ld of the Index.
e310: 0a 2a 2a 0a 2a 2a 20 63 6f 6c 4e 6f 74 49 64 78  .**.** colNotIdx
e320: 65 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  ed is a bitmask 
e330: 74 68 61 74 20 68 61 73 20 61 20 30 20 62 69 74  that has a 0 bit
e340: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 65 61   representing ea
e350: 63 68 20 69 6e 64 65 78 65 64 0a 2a 2a 20 63 6f  ch indexed.** co
e360: 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 77  lumns that are w
e370: 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20  ithin the first 
e380: 36 33 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  63 columns of th
e390: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 2a 2a  e table.  The.**
e3a0: 20 68 69 67 68 2d 6f 72 64 65 72 20 62 69 74 20   high-order bit 
e3b0: 6f 66 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 69  of colNotIdxed i
e3c0: 73 20 61 6c 77 61 79 73 20 31 2e 20 20 41 6c 6c  s always 1.  All
e3d0: 20 75 6e 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d   unindexed colum
e3e0: 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  ns.** of the tab
e3f0: 6c 65 20 68 61 76 65 20 61 20 31 2e 0a 2a 2a 0a  le have a 1..**.
e400: 2a 2a 20 54 68 65 20 63 6f 6c 4e 6f 74 49 64 78  ** The colNotIdx
e410: 65 64 20 6d 61 73 6b 20 69 73 20 41 4e 44 2d 65  ed mask is AND-e
e420: 64 20 77 69 74 68 20 74 68 65 20 53 72 63 4c 69  d with the SrcLi
e430: 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 6d  st.a[].colUsed m
e440: 61 73 6b 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ask.** to determ
e450: 69 6e 65 20 69 66 20 74 68 65 20 69 6e 64 65 78  ine if the index
e460: 20 69 73 20 63 6f 76 65 72 69 6e 67 20 69 6e 64   is covering ind
e470: 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
e480: 69 64 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75  id recomputeColu
e490: 6d 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28 49 6e  mnsNotIndexed(In
e4a0: 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69  dex *pIdx){.  Bi
e4b0: 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69  tmask m = 0;.  i
e4c0: 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49  nt j;.  for(j=pI
e4d0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a  dx->nColumn-1; j
e4e0: 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69  >=0; j--){.    i
e4f0: 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43  nt x = pIdx->aiC
e500: 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66  olumn[j];.    if
e510: 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( x>=0 ){.      
e520: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
e530: 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
e540: 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29  case( x==BMS-2 )
e550: 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d  ;.      if( x<BM
e560: 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42  S-1 ) m |= MASKB
e570: 49 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  IT(x);.    }.  }
e580: 0a 20 20 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49  .  pIdx->colNotI
e590: 64 78 65 64 20 3d 20 7e 6d 3b 0a 20 20 61 73 73  dxed = ~m;.  ass
e5a0: 65 72 74 28 20 28 70 49 64 78 2d 3e 63 6f 6c 4e  ert( (pIdx->colN
e5b0: 6f 74 49 64 78 65 64 3e 3e 36 33 29 3d 3d 31 20  otIdxed>>63)==1 
e5c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
e5d0: 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 61 74   routine runs at
e5e0: 20 74 68 65 20 65 6e 64 20 6f 66 20 70 61 72 73   the end of pars
e5f0: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
e600: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  LE statement tha
e610: 74 0a 2a 2a 20 68 61 73 20 61 20 57 49 54 48 4f  t.** has a WITHO
e620: 55 54 20 52 4f 57 49 44 20 63 6c 61 75 73 65 2e  UT ROWID clause.
e630: 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69    The job of thi
e640: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20  s routine is to 
e650: 63 6f 6e 76 65 72 74 20 62 6f 74 68 0a 2a 2a 20  convert both.** 
e660: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
e670: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
e680: 61 6e 64 20 74 68 65 20 67 65 6e 65 72 61 74 65  and the generate
e690: 64 20 56 44 42 45 20 63 6f 64 65 20 73 6f 20 74  d VDBE code so t
e6a0: 68 61 74 20 74 68 65 79 0a 2a 2a 20 61 72 65 20  hat they.** are 
e6b0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
e6c0: 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
e6d0: 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66  table instead of
e6e0: 20 61 20 72 6f 77 69 64 20 74 61 62 6c 65 2e 0a   a rowid table..
e6f0: 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 63 6c 75  ** Changes inclu
e700: 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  de:.**.**     (1
e710: 29 20 20 53 65 74 20 61 6c 6c 20 63 6f 6c 75 6d  )  Set all colum
e720: 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  ns of the PRIMAR
e730: 59 20 4b 45 59 20 73 63 68 65 6d 61 20 6f 62 6a  Y KEY schema obj
e740: 65 63 74 20 74 6f 20 62 65 20 4e 4f 54 20 4e 55  ect to be NOT NU
e750: 4c 4c 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 20  LL..**     (2)  
e760: 43 6f 6e 76 65 72 74 20 50 33 20 70 61 72 61 6d  Convert P3 param
e770: 65 74 65 72 20 6f 66 20 74 68 65 20 4f 50 5f 43  eter of the OP_C
e780: 72 65 61 74 65 42 74 72 65 65 20 66 72 6f 6d 20  reateBtree from 
e790: 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 0a 2a 2a  BTREE_INTKEY .**
e7a0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 6f 20 42            into B
e7b0: 54 52 45 45 5f 42 4c 4f 42 4b 45 59 2e 0a 2a 2a  TREE_BLOBKEY..**
e7c0: 20 20 20 20 20 28 33 29 20 20 42 79 70 61 73 73       (3)  Bypass
e7d0: 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66   the creation of
e7e0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
e7f0: 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79 0a 2a  er table entry.*
e800: 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74  *          for t
e810: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61  he PRIMARY KEY a
e820: 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  s the primary ke
e830: 79 20 69 6e 64 65 78 20 69 73 20 6e 6f 77 0a 2a  y index is now.*
e840: 2a 20 20 20 20 20 20 20 20 20 20 69 64 65 6e 74  *          ident
e850: 69 66 69 65 64 20 62 79 20 74 68 65 20 73 71 6c  ified by the sql
e860: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
e870: 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
e880: 62 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 20  ble itself..**  
e890: 20 20 20 28 34 29 20 20 53 65 74 20 74 68 65 20     (4)  Set the 
e8a0: 49 6e 64 65 78 2e 74 6e 75 6d 20 6f 66 20 74 68  Index.tnum of th
e8b0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e  e PRIMARY KEY In
e8c0: 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  dex object in th
e8d0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63  e.**          sc
e8e0: 68 65 6d 61 20 74 6f 20 74 68 65 20 72 6f 6f 74  hema to the root
e8f0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  page from the ma
e900: 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  in table..**    
e910: 20 28 35 29 20 20 41 64 64 20 61 6c 6c 20 74 61   (5)  Add all ta
e920: 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  ble columns to t
e930: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49  he PRIMARY KEY I
e940: 6e 64 65 78 20 6f 62 6a 65 63 74 0a 2a 2a 20 20  ndex object.**  
e950: 20 20 20 20 20 20 20 20 73 6f 20 74 68 61 74 20          so that 
e960: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
e970: 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  is a covering in
e980: 64 65 78 2e 20 20 54 68 65 20 73 75 72 70 6c 75  dex.  The surplu
e990: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f  s.**          co
e9a0: 6c 75 6d 6e 73 20 61 72 65 20 70 61 72 74 20 6f  lumns are part o
e9b0: 66 20 4b 65 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69  f KeyInfo.nAllFi
e9c0: 65 6c 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20  eld and are not 
e9d0: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20  used for.**     
e9e0: 20 20 20 20 20 73 6f 72 74 69 6e 67 20 6f 72 20       sorting or 
e9f0: 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e 69 71 75 65  lookup or unique
ea00: 6e 65 73 73 20 63 68 65 63 6b 73 2e 0a 2a 2a 20  ness checks..** 
ea10: 20 20 20 20 28 36 29 20 20 52 65 70 6c 61 63 65      (6)  Replace
ea20: 20 74 68 65 20 72 6f 77 69 64 20 74 61 69 6c 20   the rowid tail 
ea30: 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d 61 74 69 63  on all automatic
ea40: 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 20 55  ally generated U
ea50: 4e 49 51 55 45 0a 2a 2a 20 20 20 20 20 20 20 20  NIQUE.**        
ea60: 20 20 69 6e 64 69 63 65 73 20 77 69 74 68 20 74    indices with t
ea70: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  he PRIMARY KEY c
ea80: 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  olumns..**.** Fo
ea90: 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  r virtual tables
eaa0: 2c 20 6f 6e 6c 79 20 28 31 29 20 69 73 20 70 65  , only (1) is pe
eab0: 72 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74  rformed..*/.stat
eac0: 69 63 20 76 6f 69 64 20 63 6f 6e 76 65 72 74 54  ic void convertT
ead0: 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62  oWithoutRowidTab
eae0: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
eaf0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  , Table *pTab){.
eb00: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
eb10: 20 49 6e 64 65 78 20 2a 70 50 6b 3b 0a 20 20 69   Index *pPk;.  i
eb20: 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e 74 20 69 2c  nt nPk;.  int i,
eb30: 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   j;.  sqlite3 *d
eb40: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
eb50: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
eb60: 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 2f 2a  se->pVdbe;..  /*
eb70: 20 4d 61 72 6b 20 65 76 65 72 79 20 50 52 49 4d   Mark every PRIM
eb80: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 61  ARY KEY column a
eb90: 73 20 4e 4f 54 20 4e 55 4c 4c 20 28 65 78 63 65  s NOT NULL (exce
eba0: 70 74 20 66 6f 72 20 69 6d 70 6f 73 74 65 72 20  pt for imposter 
ebb0: 74 61 62 6c 65 73 29 0a 20 20 2a 2f 0a 20 20 69  tables).  */.  i
ebc0: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70  f( !db->init.imp
ebd0: 6f 73 74 65 72 54 61 62 6c 65 20 29 7b 0a 20 20  osterTable ){.  
ebe0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
ebf0: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
ec00: 20 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e       if( (pTab->
ec10: 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73  aCol[i].colFlags
ec20: 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b   & COLFLAG_PRIMK
ec30: 45 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  EY)!=0 ){.      
ec40: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e    pTab->aCol[i].
ec50: 6e 6f 74 4e 75 6c 6c 20 3d 20 4f 45 5f 41 62 6f  notNull = OE_Abo
ec60: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
ec70: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76  }.  }..  /* Conv
ec80: 65 72 74 20 74 68 65 20 50 33 20 6f 70 65 72 61  ert the P3 opera
ec90: 6e 64 20 6f 66 20 74 68 65 20 4f 50 5f 43 72 65  nd of the OP_Cre
eca0: 61 74 65 42 74 72 65 65 20 6f 70 63 6f 64 65 20  ateBtree opcode 
ecb0: 66 72 6f 6d 20 42 54 52 45 45 5f 49 4e 54 4b 45  from BTREE_INTKE
ecc0: 59 0a 20 20 2a 2a 20 69 6e 74 6f 20 42 54 52 45  Y.  ** into BTRE
ecd0: 45 5f 42 4c 4f 42 4b 45 59 2e 0a 20 20 2a 2f 0a  E_BLOBKEY..  */.
ece0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 64    if( pParse->ad
ecf0: 64 72 43 72 54 61 62 20 29 7b 0a 20 20 20 20 61  drCrTab ){.    a
ed00: 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 20 20  ssert( v );.    
ed10: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
ed20: 65 50 33 28 76 2c 20 70 50 61 72 73 65 2d 3e 61  eP3(v, pParse->a
ed30: 64 64 72 43 72 54 61 62 2c 20 42 54 52 45 45 5f  ddrCrTab, BTREE_
ed40: 42 4c 4f 42 4b 45 59 29 3b 0a 20 20 7d 0a 0a 20  BLOBKEY);.  }.. 
ed50: 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 50   /* Locate the P
ed60: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
ed70: 2e 20 20 4f 72 2c 20 69 66 20 74 68 69 73 20 74  .  Or, if this t
ed80: 61 62 6c 65 20 77 61 73 20 6f 72 69 67 69 6e 61  able was origina
ed90: 6c 6c 79 0a 20 20 2a 2a 20 61 6e 20 49 4e 54 45  lly.  ** an INTE
eda0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
edb0: 74 61 62 6c 65 2c 20 63 72 65 61 74 65 20 61 20  table, create a 
edc0: 6e 65 77 20 50 52 49 4d 41 52 59 20 4b 45 59 20  new PRIMARY KEY 
edd0: 69 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a 20 20 69  index. .  */.  i
ede0: 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d  f( pTab->iPKey>=
edf0: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  0 ){.    ExprLis
ee00: 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 54 6f  t *pList;.    To
ee10: 6b 65 6e 20 69 70 6b 54 6f 6b 65 6e 3b 0a 20 20  ken ipkToken;.  
ee20: 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e    sqlite3TokenIn
ee30: 69 74 28 26 69 70 6b 54 6f 6b 65 6e 2c 20 70 54  it(&ipkToken, pT
ee40: 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69  ab->aCol[pTab->i
ee50: 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  PKey].zName);.  
ee60: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
ee70: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
ee80: 70 50 61 72 73 65 2c 20 30 2c 20 0a 20 20 20 20  pParse, 0, .    
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
eea0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
eeb0: 62 2c 20 54 4b 5f 49 44 2c 20 26 69 70 6b 54 6f  b, TK_ID, &ipkTo
eec0: 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 69 66  ken, 0));.    if
eed0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
eee0: 75 72 6e 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  urn;.    pList->
eef0: 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
ef00: 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74   pParse->iPkSort
ef10: 4f 72 64 65 72 3b 0a 20 20 20 20 61 73 73 65 72  Order;.    asser
ef20: 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  t( pParse->pNewT
ef30: 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20  able==pTab );.  
ef40: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49    sqlite3CreateI
ef50: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20  ndex(pParse, 0, 
ef60: 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 70 54 61  0, 0, pList, pTa
ef70: 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c 20 30  b->keyConf, 0, 0
ef80: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
efa0: 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52  QLITE_IDXTYPE_PR
efb0: 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20 20 69  IMARYKEY);.    i
efc0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
efd0: 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
efe0: 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Err ) return;.  
eff0: 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50    pPk = sqlite3P
f000: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
f010: 54 61 62 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  Tab);.    pTab->
f020: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 7d 65  iPKey = -1;.  }e
f030: 6c 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73  lse{.    pPk = s
f040: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
f050: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
f060: 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20   assert( pPk!=0 
f070: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  );..    /*.    *
f080: 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 64  * Remove all red
f090: 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 20 66  undant columns f
f0a0: 72 6f 6d 20 74 68 65 20 50 52 49 4d 41 52 59 20  rom the PRIMARY 
f0b0: 4b 45 59 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  KEY.  For exampl
f0c0: 65 2c 20 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a  e, change.    **
f0d0: 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c   "PRIMARY KEY(a,
f0e0: 62 2c 61 2c 62 2c 63 2c 62 2c 63 2c 64 29 22 20  b,a,b,c,b,c,d)" 
f0f0: 69 6e 74 6f 20 6a 75 73 74 20 22 50 52 49 4d 41  into just "PRIMA
f100: 52 59 20 4b 45 59 28 61 2c 62 2c 63 2c 64 29 22  RY KEY(a,b,c,d)"
f110: 2e 20 20 4c 61 74 65 72 0a 20 20 20 20 2a 2a 20  .  Later.    ** 
f120: 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 65  code assumes the
f130: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
f140: 74 61 69 6e 73 20 6e 6f 20 72 65 70 65 61 74 65  tains no repeate
f150: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a  d columns..    *
f160: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 31 3b  /.    for(i=j=1;
f170: 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   i<pPk->nKeyCol;
f180: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
f190: 20 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e   hasColumn(pPk->
f1a0: 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b  aiColumn, j, pPk
f1b0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29  ->aiColumn[i]) )
f1c0: 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e  {.        pPk->n
f1d0: 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20  Column--;.      
f1e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
f1f0: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b  Pk->aiColumn[j++
f200: 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ] = pPk->aiColum
f210: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n[i];.      }.  
f220: 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65    }.    pPk->nKe
f230: 79 43 6f 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20  yCol = j;.  }.  
f240: 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29  assert( pPk!=0 )
f250: 3b 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72  ;.  pPk->isCover
f260: 69 6e 67 20 3d 20 31 3b 0a 20 20 69 66 28 20 21  ing = 1;.  if( !
f270: 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65  db->init.imposte
f280: 72 54 61 62 6c 65 20 29 20 70 50 6b 2d 3e 75 6e  rTable ) pPk->un
f290: 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20  iqNotNull = 1;. 
f2a0: 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79   nPk = pPk->nKey
f2b0: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 42 79 70 61 73  Col;..  /* Bypas
f2c0: 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  s the creation o
f2d0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
f2e0: 59 20 62 74 72 65 65 20 61 6e 64 20 74 68 65 20  Y btree and the 
f2f0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20  sqlite_master.  
f300: 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20  ** table entry. 
f310: 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 72 65 71  This is only req
f320: 75 69 72 65 64 20 69 66 20 63 75 72 72 65 6e 74  uired if current
f330: 6c 79 20 67 65 6e 65 72 61 74 69 6e 67 20 56 44  ly generating VD
f340: 42 45 0a 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72  BE.  ** code for
f350: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
f360: 28 6e 6f 74 20 77 68 65 6e 20 70 61 72 73 69 6e  (not when parsin
f370: 67 20 6f 6e 65 20 61 73 20 70 61 72 74 20 6f 66  g one as part of
f380: 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61 20   reading.  ** a 
f390: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 29  database schema)
f3a0: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26  .  */.  if( v &&
f3b0: 20 70 50 6b 2d 3e 74 6e 75 6d 3e 30 20 29 7b 0a   pPk->tnum>0 ){.
f3c0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
f3d0: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a  init.busy==0 );.
f3e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
f3f0: 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70  hangeOpcode(v, p
f400: 50 6b 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74  Pk->tnum, OP_Got
f410: 6f 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  o);.  }..  /* Th
f420: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
f430: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
f440: 73 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  s the table root
f450: 20 70 61 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e   page */.  pPk->
f460: 74 6e 75 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75  tnum = pTab->tnu
f470: 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20  m;..  /* Update 
f480: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
f490: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
f4a0: 61 6c 6c 20 55 4e 49 51 55 45 20 69 6e 64 69 63  all UNIQUE indic
f4b0: 65 73 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67  es by converting
f4c0: 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20  .  ** the final 
f4d0: 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74  rowid column int
f4e0: 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f  o one or more co
f4f0: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49  lumns of the PRI
f500: 4d 41 52 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20  MARY KEY..  */. 
f510: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
f520: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
f530: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
f540: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
f550: 69 66 28 20 49 73 50 72 69 6d 61 72 79 4b 65 79  if( IsPrimaryKey
f560: 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f  Index(pIdx) ) co
f570: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
f580: 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b  i=n=0; i<nPk; i+
f590: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68  +){.      if( !h
f5a0: 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61  asColumn(pIdx->a
f5b0: 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e  iColumn, pIdx->n
f5c0: 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43  KeyCol, pPk->aiC
f5d0: 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b  olumn[i]) ) n++;
f5e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
f5f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
f600: 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 20  This index is a 
f610: 73 75 70 65 72 73 65 74 20 6f 66 20 74 68 65 20  superset of the 
f620: 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20  primary key */. 
f630: 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75       pIdx->nColu
f640: 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43  mn = pIdx->nKeyC
f650: 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ol;.      contin
f660: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
f670: 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a  ( resizeIndexObj
f680: 65 63 74 28 64 62 2c 20 70 49 64 78 2c 20 70 49  ect(db, pIdx, pI
f690: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29  dx->nKeyCol+n) )
f6a0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72   return;.    for
f6b0: 28 69 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b  (i=0, j=pIdx->nK
f6c0: 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b  eyCol; i<nPk; i+
f6d0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68  +){.      if( !h
f6e0: 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61  asColumn(pIdx->a
f6f0: 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e  iColumn, pIdx->n
f700: 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43  KeyCol, pPk->aiC
f710: 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20  olumn[i]) ){.   
f720: 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
f730: 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69  umn[j] = pPk->ai
f740: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
f750: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
f760: 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c  j] = pPk->azColl
f770: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b  [i];.        j++
f780: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f790: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
f7a0: 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d  ->nColumn>=pIdx-
f7b0: 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20  >nKeyCol+n );.  
f7c0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
f7d0: 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20  nColumn>=j );.  
f7e0: 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20  }..  /* Add all 
f7f0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f  table columns to
f800: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
f810: 20 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66   index.  */.  if
f820: 28 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ( nPk<pTab->nCol
f830: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 69   ){.    if( resi
f840: 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62  zeIndexObject(db
f850: 2c 20 70 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f  , pPk, pTab->nCo
f860: 6c 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  l) ) return;.   
f870: 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b   for(i=0, j=nPk;
f880: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
f890: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ++){.      if( !
f8a0: 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61  hasColumn(pPk->a
f8b0: 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29  iColumn, j, i) )
f8c0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
f8d0: 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e  ( j<pPk->nColumn
f8e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d   );.        pPk-
f8f0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69  >aiColumn[j] = i
f900: 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61  ;.        pPk->a
f910: 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74  zColl[j] = sqlit
f920: 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20  e3StrBINARY;.   
f930: 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
f940: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
f950: 72 74 28 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e  rt( pPk->nColumn
f960: 3d 3d 6a 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==j );.    asser
f970: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a  t( pTab->nCol==j
f980: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
f990: 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20   pPk->nColumn = 
f9a0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a  pTab->nCol;.  }.
f9b0: 20 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d    recomputeColum
f9c0: 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28 70 50 6b  nsNotIndexed(pPk
f9d0: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
f9e0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
f9f0: 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 52 65 74  LTABLE./*.** Ret
fa00: 75 72 6e 20 74 72 75 65 20 69 66 20 7a 4e 61 6d  urn true if zNam
fa10: 65 20 69 73 20 61 20 73 68 61 64 6f 77 20 74 61  e is a shadow ta
fa20: 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  ble name in the 
fa30: 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
fa40: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  .** connection..
fa50: 2a 2a 0a 2a 2a 20 7a 4e 61 6d 65 20 69 73 20 74  **.** zName is t
fa60: 65 6d 70 6f 72 61 72 69 6c 79 20 6d 6f 64 69 66  emporarily modif
fa70: 69 65 64 20 77 68 69 6c 65 20 74 68 69 73 20 72  ied while this r
fa80: 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e  outine is runnin
fa90: 67 2c 20 62 75 74 20 69 73 0a 2a 2a 20 72 65 73  g, but is.** res
faa0: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
fab0: 67 69 6e 61 6c 20 76 61 6c 75 65 20 70 72 69 6f  ginal value prio
fac0: 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
fad0: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
fae0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 53 68 61  static int isSha
faf0: 64 6f 77 54 61 62 6c 65 4e 61 6d 65 28 73 71 6c  dowTableName(sql
fb00: 69 74 65 33 20 2a 64 62 2c 20 63 68 61 72 20 2a  ite3 *db, char *
fb10: 7a 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  zName){.  char *
fb20: 7a 54 61 69 6c 3b 20 20 20 20 20 20 20 20 20 20  zTail;          
fb30: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
fb40: 65 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 22  er to the last "
fb50: 5f 22 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20  _" in zName */. 
fb60: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
fb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fb80: 2a 20 54 61 62 6c 65 20 74 68 61 74 20 7a 4e 61  * Table that zNa
fb90: 6d 65 20 69 73 20 61 20 73 68 61 64 6f 77 20 6f  me is a shadow o
fba0: 66 20 2a 2f 0a 20 20 4d 6f 64 75 6c 65 20 2a 70  f */.  Module *p
fbb0: 4d 6f 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mod;            
fbc0: 20 20 20 20 20 2f 2a 20 4d 6f 64 75 6c 65 20 66       /* Module f
fbd0: 6f 72 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  or the virtual t
fbe0: 61 62 6c 65 20 2a 2f 0a 0a 20 20 7a 54 61 69 6c  able */..  zTail
fbf0: 20 3d 20 73 74 72 72 63 68 72 28 7a 4e 61 6d 65   = strrchr(zName
fc00: 2c 20 27 5f 27 29 3b 0a 20 20 69 66 28 20 7a 54  , '_');.  if( zT
fc10: 61 69 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ail==0 ) return 
fc20: 30 3b 0a 20 20 2a 7a 54 61 69 6c 20 3d 20 30 3b  0;.  *zTail = 0;
fc30: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
fc40: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
fc50: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 2a 7a 54 61  Name, 0);.  *zTa
fc60: 69 6c 20 3d 20 27 5f 27 3b 0a 20 20 69 66 28 20  il = '_';.  if( 
fc70: 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
fc80: 20 30 3b 0a 20 20 69 66 28 20 21 49 73 56 69 72   0;.  if( !IsVir
fc90: 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
fca0: 75 72 6e 20 30 3b 0a 20 20 70 4d 6f 64 20 3d 20  urn 0;.  pMod = 
fcb0: 28 4d 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 33  (Module*)sqlite3
fcc0: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d  HashFind(&db->aM
fcd0: 6f 64 75 6c 65 2c 20 70 54 61 62 2d 3e 61 7a 4d  odule, pTab->azM
fce0: 6f 64 75 6c 65 41 72 67 5b 30 5d 29 3b 0a 20 20  oduleArg[0]);.  
fcf0: 69 66 28 20 70 4d 6f 64 3d 3d 30 20 29 20 72 65  if( pMod==0 ) re
fd00: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 4d  turn 0;.  if( pM
fd10: 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 69 56 65  od->pModule->iVe
fd20: 72 73 69 6f 6e 3c 33 20 29 20 72 65 74 75 72 6e  rsion<3 ) return
fd30: 20 30 3b 0a 20 20 69 66 28 20 70 4d 6f 64 2d 3e   0;.  if( pMod->
fd40: 70 4d 6f 64 75 6c 65 2d 3e 78 53 68 61 64 6f 77  pModule->xShadow
fd50: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
fd60: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 4d 6f   0;.  return pMo
fd70: 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 53 68 61  d->pModule->xSha
fd80: 64 6f 77 4e 61 6d 65 28 7a 54 61 69 6c 2b 31 29  dowName(zTail+1)
fd90: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
fda0: 6e 65 20 69 73 53 68 61 64 6f 77 54 61 62 6c 65  ne isShadowTable
fdb0: 4e 61 6d 65 28 78 2c 79 29 20 30 0a 23 65 6e 64  Name(x,y) 0.#end
fdc0: 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c  if /* ifndef SQL
fdd0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
fde0: 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
fdf0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
fe00: 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74  called to report
fe10: 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74   the final ")" t
fe20: 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a  hat terminates.*
fe30: 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  * a CREATE TABLE
fe40: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
fe50: 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75  * The table stru
fe60: 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72  cture that other
fe70: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
fe80: 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64   have been build
fe90: 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ing.** is added 
fea0: 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
feb0: 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73  hash tables, ass
fec0: 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20  uming no errors 
fed0: 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64  have.** occurred
fee0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79  ..**.** An entry
fef0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69   for the table i
ff00: 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61  s made in the ma
ff10: 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69  ster table on di
ff20: 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68  sk, unless.** th
ff30: 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
ff40: 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69  y table or db->i
ff50: 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68  nit.busy==1.  Wh
ff60: 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  en db->init.busy
ff70: 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20  ==1.** it means 
ff80: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
ff90: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
ffa0: 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77   table because w
ffb0: 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63  e just.** connec
ffc0: 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ted to the datab
ffd0: 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74  ase or because t
ffe0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
fff0: 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65   table has.** re
10000 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20  cently changed, 
10010 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  so the entry for
10020 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65   this table alre
10030 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a  ady exists in.**
10040 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
10050 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f  er table.  We do
10060 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65   not want to cre
10070 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a  ate it again..**
10080 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65  .** If the pSele
10090 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ct argument is n
100a0 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e  ot NULL, it mean
100b0 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  s that this rout
100c0 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65  ine.** was calle
100d0 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61  d to create a ta
100e0 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72  ble generated fr
100f0 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45  om a .** "CREATE
10100 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45   TABLE ... AS SE
10110 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d  LECT ..." statem
10120 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ent.  The column
10130 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
10140 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20   new table will 
10150 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74  match the result
10160 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
10170 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
10180 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50  te3EndTable(.  P
10190 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
101a0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
101b0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
101c0 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20  en *pCons,      
101d0 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20       /* The ',' 
101e0 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20  token after the 
101f0 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e  last column defn
10200 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  . */.  Token *pE
10210 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  nd,            /
10220 2a 20 54 68 65 20 27 29 27 20 62 65 66 6f 72 65  * The ')' before
10230 20 6f 70 74 69 6f 6e 73 20 69 6e 20 74 68 65 20   options in the 
10240 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a  CREATE TABLE */.
10250 20 20 75 38 20 74 61 62 4f 70 74 73 2c 20 20 20    u8 tabOpts,   
10260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
10270 72 61 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73  ra table options
10280 2e 20 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a  . Usually 0. */.
10290 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
102a0 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c  t         /* Sel
102b0 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41  ect from a "CREA
102c0 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  TE ... AS SELECT
102d0 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  " */.){.  Table 
102e0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
102f0 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74      /* The new t
10300 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
10310 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
10320 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62  db; /* The datab
10330 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
10340 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
10350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10360 20 44 61 74 61 62 61 73 65 20 69 6e 20 77 68 69   Database in whi
10370 63 68 20 74 68 65 20 74 61 62 6c 65 20 6c 69 76  ch the table liv
10380 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  es */.  Index *p
10390 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
103a0 20 20 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20    /* An implied 
103b0 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  index of the tab
103c0 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 6e  le */..  if( pEn
103d0 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d  d==0 && pSelect=
103e0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
103f0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
10400 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
10410 64 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  d );.  p = pPars
10420 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
10430 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
10440 6e 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63  n;..  if( pSelec
10450 74 3d 3d 30 20 26 26 20 69 73 53 68 61 64 6f 77  t==0 && isShadow
10460 54 61 62 6c 65 4e 61 6d 65 28 64 62 2c 20 70 2d  TableName(db, p-
10470 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 70  >zName) ){.    p
10480 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
10490 5f 53 68 61 64 6f 77 3b 0a 20 20 7d 0a 0a 20 20  _Shadow;.  }..  
104a0 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
104b0 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20  it.busy is 1 it 
104c0 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
104d0 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66  ding the SQL off
104e0 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74   the.  ** "sqlit
104f0 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71  e_master" or "sq
10500 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
10510 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64  " table on the d
10520 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20  isk..  ** So do 
10530 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
10540 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78   disk again.  Ex
10550 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70  tract the root p
10560 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
10570 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72  for the table fr
10580 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  om the db->init.
10590 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20  newTnum field.  
105a0 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (The page number
105b0 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76  .  ** should hav
105c0 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65  e been put there
105d0 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70   by the sqliteOp
105e0 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20  enCb routine.). 
105f0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
10600 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
10610 20 69 73 20 31 2c 20 74 68 61 74 20 6d 65 61 6e   is 1, that mean
10620 73 20 74 68 69 73 20 69 73 20 74 68 65 20 73 71  s this is the sq
10630 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a  lite_master.  **
10640 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 20 20   table itself.  
10650 53 6f 20 6d 61 72 6b 20 69 74 20 72 65 61 64 2d  So mark it read-
10660 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  only..  */.  if(
10670 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
10680 7b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  {.    if( pSelec
10690 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
106a0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
106b0 65 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  e, "");.      re
106c0 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
106d0 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  p->tnum = db->in
106e0 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20  it.newTnum;.    
106f0 69 66 28 20 70 2d 3e 74 6e 75 6d 3d 3d 31 20 29  if( p->tnum==1 )
10700 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20   p->tabFlags |= 
10710 54 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a 20 20 7d  TF_Readonly;.  }
10720 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 70  ..  /* Special p
10730 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 49  rocessing for WI
10740 54 48 4f 55 54 20 52 4f 57 49 44 20 54 61 62 6c  THOUT ROWID Tabl
10750 65 73 20 2a 2f 0a 20 20 69 66 28 20 74 61 62 4f  es */.  if( tabO
10760 70 74 73 20 26 20 54 46 5f 57 69 74 68 6f 75 74  pts & TF_Without
10770 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66 28  Rowid ){.    if(
10780 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20   (p->tabFlags & 
10790 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
107a0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
107b0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
107c0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 41 55  e,.          "AU
107d0 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6e 6f 74 20  TOINCREMENT not 
107e0 61 6c 6c 6f 77 65 64 20 6f 6e 20 57 49 54 48 4f  allowed on WITHO
107f0 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 22  UT ROWID tables"
10800 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
10810 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
10820 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  p->tabFlags & TF
10830 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 29 3d  _HasPrimaryKey)=
10840 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
10850 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
10860 73 65 2c 20 22 50 52 49 4d 41 52 59 20 4b 45 59  se, "PRIMARY KEY
10870 20 6d 69 73 73 69 6e 67 20 6f 6e 20 74 61 62 6c   missing on tabl
10880 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  e %s", p->zName)
10890 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
108a0 20 20 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c     p->tabFlags |
108b0 3d 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69  = TF_WithoutRowi
108c0 64 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65  d | TF_NoVisible
108d0 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e  Rowid;.      con
108e0 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77  vertToWithoutRow
108f0 69 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  idTable(pParse, 
10900 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
10910 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
10920 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
10930 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  p->pSchema);..#i
10940 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10950 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73  T_CHECK.  /* Res
10960 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c  olve names in al
10970 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  l CHECK constrai
10980 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  nt expressions..
10990 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43    */.  if( p->pC
109a0 68 65 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  heck ){.    sqli
109b0 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65  te3ResolveSelfRe
109c0 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20  ference(pParse, 
109d0 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20 30  p, NC_IsCheck, 0
109e0 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20  , p->pCheck);.  
109f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
10a00 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10a10 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a  _CHECK) */..  /*
10a20 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76   Estimate the av
10a30 65 72 61 67 65 20 72 6f 77 20 73 69 7a 65 20 66  erage row size f
10a40 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  or the table and
10a50 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64   for all implied
10a60 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65 73   indices */.  es
10a70 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68  timateTableWidth
10a80 28 70 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  (p);.  for(pIdx=
10a90 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
10aa0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
10ab0 74 29 7b 0a 20 20 20 20 65 73 74 69 6d 61 74 65  t){.    estimate
10ac0 49 6e 64 65 78 57 69 64 74 68 28 70 49 64 78 29  IndexWidth(pIdx)
10ad0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
10ae0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
10af0 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72   then create a r
10b00 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65  ecord for the ne
10b10 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  w table.  ** in 
10b20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
10b30 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64  R table of the d
10b40 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  atabase..  **.  
10b50 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
10b60 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c  TEMPORARY table,
10b70 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79   write the entry
10b80 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69   into the auxili
10b90 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  ary.  ** file in
10ba0 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68  stead of into th
10bb0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
10bc0 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
10bd0 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
10be0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
10bf0 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
10c00 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f  har *zType;    /
10c10 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62  * "view" or "tab
10c20 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  le" */.    char 
10c30 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56  *zType2;   /* "V
10c40 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20  IEW" or "TABLE" 
10c50 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
10c60 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  mt;    /* Text o
10c70 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
10c80 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45  LE or CREATE VIE
10c90 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a  W statement */..
10ca0 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
10cb0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
10cc0 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d      if( NEVER(v=
10cd0 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  =0) ) return;.. 
10ce0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10cf0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
10d00 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20  , 0);..    /* . 
10d10 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65     ** Initialize
10d20 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 6e   zType for the n
10d30 65 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c 65  ew view or table
10d40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10d50 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29   p->pSelect==0 )
10d60 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67  {.      /* A reg
10d70 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ular table */.  
10d80 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62      zType = "tab
10d90 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  le";.      zType
10da0 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66  2 = "TABLE";.#if
10db0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10dc0 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b  _VIEW.    }else{
10dd0 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
10de0 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
10df0 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20  = "view";.      
10e00 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b  zType2 = "VIEW";
10e10 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
10e20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
10e30 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
10e40 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  xx AS SELECT ...
10e50 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45  , execute the SE
10e60 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74  LECT.    ** stat
10e70 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74  ement to populat
10e80 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  e the new table.
10e90 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e   The root-page n
10ea0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20  umber for the.  
10eb0 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69    ** new table i
10ec0 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  s in register pP
10ed0 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20  arse->regRoot.. 
10ee0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63     **.    ** Onc
10ef0 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73  e the SELECT has
10f00 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73   been coded by s
10f10 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20  qlite3Select(), 
10f20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a  it is in a.    *
10f30 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65  * suitable state
10f40 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68   to query for th
10f50 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
10f60 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75  nd types to be u
10f70 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  sed.    ** by th
10f80 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20  e new table..   
10f90 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61   **.    ** A sha
10fa0 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d  red-cache write-
10fb0 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
10fc0 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ired to write to
10fd0 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a   the new table,.
10fe0 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65      ** as a sche
10ff0 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76  ma-lock must hav
11000 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  e already been o
11010 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74  btained to creat
11020 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20  e it. Since.    
11030 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  ** a schema-lock
11040 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74   excludes all ot
11050 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73 65  her database use
11060 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  rs, the write-lo
11070 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20  ck would.    ** 
11080 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20  be redundant..  
11090 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65    */.    if( pSe
110a0 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65  lect ){.      Se
110b0 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
110c0 20 20 2f 2a 20 57 68 65 72 65 20 74 68 65 20 53    /* Where the S
110d0 45 4c 45 43 54 20 73 68 6f 75 6c 64 20 73 74 6f  ELECT should sto
110e0 72 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  re results */.  
110f0 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64      int regYield
11100 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ;       /* Regis
11110 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 2d 72  ter holding co-r
11120 6f 75 74 69 6e 65 20 65 6e 74 72 79 2d 70 6f 69  outine entry-poi
11130 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nt */.      int 
11140 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20  addrTop;        
11150 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 63 6f  /* Top of the co
11160 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  -routine */.    
11170 20 20 69 6e 74 20 72 65 67 52 65 63 3b 20 20 20    int regRec;   
11180 20 20 20 20 20 20 2f 2a 20 41 20 72 65 63 6f 72        /* A recor
11190 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74 20 69  d to be insert i
111a0 6e 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c  nto the new tabl
111b0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  e */.      int r
111c0 65 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 2f  egRowid;       /
111d0 2a 20 52 6f 77 69 64 20 6f 66 20 74 68 65 20 6e  * Rowid of the n
111e0 65 78 74 20 72 6f 77 20 74 6f 20 69 6e 73 65 72  ext row to inser
111f0 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  t */.      int a
11200 64 64 72 49 6e 73 4c 6f 6f 70 3b 20 20 20 20 2f  ddrInsLoop;    /
11210 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
11220 70 20 66 6f 72 20 69 6e 73 65 72 74 69 6e 67 20  p for inserting 
11230 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 54 61  rows */.      Ta
11240 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20  ble *pSelTab;   
11250 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 74 68 61    /* A table tha
11260 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
11270 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a  SELECT results *
11280 2f 0a 0a 20 20 20 20 20 20 72 65 67 59 69 65 6c  /..      regYiel
11290 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
112a0 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 65 63  em;.      regRec
112b0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
112c0 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69  m;.      regRowi
112d0 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
112e0 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  em;.      assert
112f0 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31  (pParse->nTab==1
11300 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11310 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
11320 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11330 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
11340 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50  OpenWrite, 1, pP
11350 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69  arse->regRoot, i
11360 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
11370 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
11380 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47  , OPFLAG_P2ISREG
11390 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
113a0 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20  >nTab = 2;.     
113b0 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
113c0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
113d0 72 28 76 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  r(v) + 1;.      
113e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
113f0 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
11400 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
11410 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
11420 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
11430 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  nErr ) return;. 
11440 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73       pSelTab = s
11450 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
11460 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
11470 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
11480 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29  if( pSelTab==0 )
11490 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61   return;.      a
114a0 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d  ssert( p->aCol==
114b0 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43  0 );.      p->nC
114c0 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
114d0 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 43 6f  ol;.      p->aCo
114e0 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
114f0 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
11500 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
11510 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
11520 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
11530 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
11540 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
11550 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
11560 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
11570 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
11580 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73  gYield);.      s
11590 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
115a0 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64  rse, pSelect, &d
115b0 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
115c0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
115d0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 73 71 6c  eturn;.      sql
115e0 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
115f0 74 69 6e 65 28 76 2c 20 72 65 67 59 69 65 6c 64  tine(v, regYield
11600 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11610 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
11620 61 64 64 72 54 6f 70 20 2d 20 31 29 3b 0a 20 20  addrTop - 1);.  
11630 20 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f 70 20      addrInsLoop 
11640 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
11650 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
11660 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
11670 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
11680 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
11690 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
116a0 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
116b0 20 64 65 73 74 2e 69 53 64 73 74 2c 20 64 65 73   dest.iSdst, des
116c0 74 2e 6e 53 64 73 74 2c 20 72 65 67 52 65 63 29  t.nSdst, regRec)
116d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
116e0 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20  ableAffinity(v, 
116f0 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  p, 0);.      sql
11700 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11710 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 31  , OP_NewRowid, 1
11720 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
11730 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11740 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
11750 74 2c 20 31 2c 20 72 65 67 52 65 63 2c 20 72 65  t, 1, regRec, re
11760 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
11770 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
11780 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a  , addrInsLoop);.
11790 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
117a0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
117b0 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  rInsLoop);.     
117c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
117d0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
117e0 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
117f0 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
11800 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
11810 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
11820 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ent */.    if( p
11830 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
11840 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61  zStmt = createTa
11850 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a  bleStmt(db, p);.
11860 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11870 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20 3d 20   Token *pEnd2 = 
11880 74 61 62 4f 70 74 73 20 3f 20 26 70 50 61 72 73  tabOpts ? &pPars
11890 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20 3a 20  e->sLastToken : 
118a0 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20 3d 20  pEnd;.      n = 
118b0 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a 20 2d  (int)(pEnd2->z -
118c0 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
118d0 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 69 66  ken.z);.      if
118e0 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27  ( pEnd2->z[0]!='
118f0 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64 32 2d  ;' ) n += pEnd2-
11900 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20  >n;.      zStmt 
11910 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
11920 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
11930 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22  "CREATE %s %.*s"
11940 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61  , zType2, n, pPa
11950 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
11960 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  z.      );.    }
11970 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20  ..    /* A slot 
11980 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68  for the record h
11990 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
119a0 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  allocated in the
119b0 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f   .    ** SQLITE_
119c0 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57  MASTER table.  W
119d0 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75  e just need to u
119e0 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20  pdate that slot 
119f0 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  with all.    ** 
11a00 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
11a10 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e  we've collected.
11a20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
11a30 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
11a40 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50  Parse,.      "UP
11a50 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20  DATE %Q.%s ".   
11a60 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d        "SET type=
11a70 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74  '%s', name=%Q, t
11a80 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74  bl_name=%Q, root
11a90 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51  page=#%d, sql=%Q
11aa0 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45   ".       "WHERE
11ab0 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20   rowid=#%d",.   
11ac0 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
11ad0 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52  zDbSName, MASTER
11ae0 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20 7a 54 79  _NAME,.      zTy
11af0 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  pe,.      p->zNa
11b00 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  me,.      p->zNa
11b10 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  me,.      pParse
11b20 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20  ->regRoot,.     
11b30 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50   zStmt,.      pP
11b40 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20  arse->regRowid. 
11b50 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
11b60 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d  3DbFree(db, zStm
11b70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  t);.    sqlite3C
11b80 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
11b90 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64  se, iDb);..#ifnd
11ba0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
11bb0 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
11bc0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
11bd0 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63   if we need to c
11be0 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f  reate an sqlite_
11bf0 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66  sequence table f
11c00 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e  or.    ** keepin
11c10 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69  g track of autoi
11c20 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20  ncrement keys.. 
11c30 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
11c40 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
11c50 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d  Autoincrement)!=
11c60 30 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70  0 ){.      Db *p
11c70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
11c80 62 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  b];.      assert
11c90 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
11ca0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
11cb0 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66  , 0) );.      if
11cc0 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
11cd0 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20  pSeqTab==0 ){.  
11ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
11cf0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
11d00 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
11d10 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69  TE TABLE %Q.sqli
11d20 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65  te_sequence(name
11d30 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20  ,seq)",.        
11d40 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 0a    pDb->zDbSName.
11d50 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
11d60 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
11d70 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20  .    /* Reparse 
11d80 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70  everything to up
11d90 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
11da0 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  l data structure
11db0 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
11dc0 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
11dd0 6d 61 4f 70 28 70 50 61 72 73 65 2c 20 69 44 62  maOp(pParse, iDb
11de0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
11df0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
11e00 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41  "tbl_name='%q' A
11e10 4e 44 20 74 79 70 65 21 3d 27 74 72 69 67 67 65  ND type!='trigge
11e20 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b  r'", p->zName));
11e30 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20  .  }...  /* Add 
11e40 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65  the table to the
11e50 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
11e60 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
11e70 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
11e80 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
11e90 75 73 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  usy ){.    Table
11ea0 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65   *pOld;.    Sche
11eb0 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d  ma *pSchema = p-
11ec0 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73  >pSchema;.    as
11ed0 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
11ee0 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
11ef0 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
11f00 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
11f10 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d  shInsert(&pSchem
11f20 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a  a->tblHash, p->z
11f30 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  Name, p);.    if
11f40 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  ( pOld ){.      
11f50 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20  assert( p==pOld 
11f60 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
11f70 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69  st have failed i
11f80 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74  nside HashInsert
11f90 28 29 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  () */.      sqli
11fa0 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
11fb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
11fc0 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
11fd0 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a  >pNewTable = 0;.
11fe0 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73      db->mDbFlags
11ff0 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d   |= DBFLAG_Schem
12000 61 43 68 61 6e 67 65 3b 0a 0a 23 69 66 6e 64 65  aChange;..#ifnde
12010 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
12020 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28  TERTABLE.    if(
12030 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a   !p->pSelect ){.
12040 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
12050 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
12060 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e   char *)pParse->
12070 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20  sNameToken.z;.  
12080 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20      int nName;. 
12090 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
120a0 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26  elect && pCons &
120b0 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  & pEnd );.      
120c0 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20  if( pCons->z==0 
120d0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73  ){.        pCons
120e0 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d   = pEnd;.      }
120f0 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28  .      nName = (
12100 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72  int)((const char
12110 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e   *)pCons->z - zN
12120 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  ame);.      p->a
12130 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33  ddColOffset = 13
12140 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68   + sqlite3Utf8Ch
12150 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61  arLen(zName, nNa
12160 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  me);.    }.#endi
12170 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  f.  }.}..#ifndef
12180 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
12190 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  W./*.** The pars
121a0 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
121b0 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
121c0 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56  o create a new V
121d0 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IEW.*/.void sqli
121e0 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20  te3CreateView(. 
121f0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
12200 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
12210 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
12220 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20  Token *pBegin,  
12230 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
12240 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
12250 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ns the statement
12260 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
12270 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me1,     /* The 
12280 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
12290 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
122a0 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
122b0 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
122c0 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
122d0 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
122e0 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
122f0 45 78 70 72 4c 69 73 74 20 2a 70 43 4e 61 6d 65  ExprList *pCName
12300 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 6c  s, /* Optional l
12310 69 73 74 20 6f 66 20 76 69 65 77 20 63 6f 6c 75  ist of view colu
12320 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 53 65  mn names */.  Se
12330 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
12340 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61   /* A SELECT sta
12350 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c  tement that will
12360 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
12370 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
12380 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
12390 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f  TRUE for a TEMPO
123a0 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69  RARY view */.  i
123b0 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20  nt noErr        
123c0 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72    /* Suppress er
123d0 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66 20  ror messages if 
123e0 56 49 45 57 20 61 6c 72 65 61 64 79 20 65 78 69  VIEW already exi
123f0 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
12400 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  e *p;.  int n;. 
12410 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
12420 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
12430 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20  DbFixer sFix;.  
12440 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30  Token *pName = 0
12450 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73  ;.  int iDb;.  s
12460 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
12470 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
12480 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29  pParse->nVar>0 )
12490 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
124a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70  orMsg(pParse, "p
124b0 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f  arameters are no
124c0 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65  t allowed in vie
124d0 77 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 63  ws");.    goto c
124e0 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b  reate_view_fail;
124f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
12500 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c  artTable(pParse,
12510 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
12520 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e   isTemp, 1, 0, n
12530 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61  oErr);.  p = pPa
12540 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
12550 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50    if( p==0 || pP
12560 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
12570 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61  o create_view_fa
12580 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54 77 6f  il;.  sqlite3Two
12590 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
125a0 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
125b0 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20   &pName);.  iDb 
125c0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
125d0 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53  oIndex(db, p->pS
125e0 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65  chema);.  sqlite
125f0 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20  3FixInit(&sFix, 
12600 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69  pParse, iDb, "vi
12610 65 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  ew", pName);.  i
12620 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c  f( sqlite3FixSel
12630 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65  ect(&sFix, pSele
12640 63 74 29 20 29 20 67 6f 74 6f 20 63 72 65 61 74  ct) ) goto creat
12650 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20  e_view_fail;..  
12660 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  /* Make a copy o
12670 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c  f the entire SEL
12680 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
12690 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
126a0 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77  iew..  ** This w
126b0 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68  ill force all th
126c0 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76  e Expr.token.z v
126d0 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61  alues to be dyna
126e0 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c  mically.  ** all
126f0 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68  ocated rather th
12700 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  an point to the 
12710 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77  input string - w
12720 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a  hich means that.
12730 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70    ** they will p
12740 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65  ersist after the
12750 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33   current sqlite3
12760 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74  _exec() call ret
12770 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  urns..  */.  if(
12780 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
12790 54 20 29 7b 0a 20 20 20 20 70 2d 3e 70 53 65 6c  T ){.    p->pSel
127a0 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20  ect = pSelect;. 
127b0 20 20 20 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a     pSelect = 0;.
127c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
127d0 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
127e0 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
127f0 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f  Select, EXPRDUP_
12800 52 45 44 55 43 45 29 3b 0a 20 20 7d 0a 20 20 70  REDUCE);.  }.  p
12810 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74  ->pCheck = sqlit
12820 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
12830 2c 20 70 43 4e 61 6d 65 73 2c 20 45 58 50 52 44  , pCNames, EXPRD
12840 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 69 66  UP_REDUCE);.  if
12850 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
12860 65 64 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65  ed ) goto create
12870 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f  _view_fail;..  /
12880 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64  * Locate the end
12890 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56   of the CREATE V
128a0 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  IEW statement.  
128b0 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20  Make sEnd point 
128c0 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e  to.  ** the end.
128d0 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70  .  */.  sEnd = p
128e0 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
128f0 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 45 6e  n;.  assert( sEn
12900 64 2e 7a 5b 30 5d 21 3d 30 20 7c 7c 20 73 45 6e  d.z[0]!=0 || sEn
12910 64 2e 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  d.n==0 );.  if( 
12920 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29  sEnd.z[0]!=';' )
12930 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20  {.    sEnd.z += 
12940 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45  sEnd.n;.  }.  sE
12950 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  nd.n = 0;.  n = 
12960 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70  (int)(sEnd.z - p
12970 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61 73 73  Begin->z);.  ass
12980 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 7a 20  ert( n>0 );.  z 
12990 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77  = pBegin->z;.  w
129a0 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73  hile( sqlite3Iss
129b0 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20  pace(z[n-1]) ){ 
129c0 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20  n--; }.  sEnd.z 
129d0 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e  = &z[n-1];.  sEn
129e0 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55  d.n = 1;..  /* U
129f0 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  se sqlite3EndTab
12a00 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20  le() to add the 
12a10 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49  view to the SQLI
12a20 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
12a30 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54  */.  sqlite3EndT
12a40 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20  able(pParse, 0, 
12a50 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 0a 63  &sEnd, 0, 0);..c
12a60 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3a  reate_view_fail:
12a70 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
12a80 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
12a90 63 74 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45  ct);.  if( IN_RE
12aa0 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  NAME_OBJECT ){. 
12ab0 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
12ac0 45 78 70 72 6c 69 73 74 55 6e 6d 61 70 28 70 50  ExprlistUnmap(pP
12ad0 61 72 73 65 2c 20 70 43 4e 61 6d 65 73 29 3b 0a  arse, pCNames);.
12ae0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
12af0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
12b00 70 43 4e 61 6d 65 73 29 3b 0a 20 20 72 65 74 75  pCNames);.  retu
12b10 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
12b20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
12b30 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
12b40 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
12b50 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
12b60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
12b70 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20  UALTABLE)./*.** 
12b80 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
12b90 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65  ure pTable is re
12ba0 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69  ally a VIEW.  Fi
12bb0 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20  ll in the names 
12bc0 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  of.** the column
12bd0 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e  s of the view in
12be0 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75   the pTable stru
12bf0 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74  cture.  Return t
12c00 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
12c10 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65  errors.  If an e
12c20 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61  rror is seen lea
12c30 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
12c40 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
12c50 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
12c60 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
12c70 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a  umnNames(Parse *
12c80 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
12c90 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20  Table){.  Table 
12ca0 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41  *pSelTab;   /* A
12cb0 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d   fake table from
12cc0 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74 68   which we get th
12cd0 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
12ce0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
12cf0 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74      /* Copy of t
12d00 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  he SELECT that i
12d10 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
12d20 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72  ew */.  int nErr
12d30 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   = 0;     /* Num
12d40 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e  ber of errors en
12d50 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69  countered */.  i
12d60 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
12d70 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20   /* Temporarily 
12d80 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72  holds the number
12d90 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73 69   of cursors assi
12da0 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gned */.  sqlite
12db0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
12dc0 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  db;  /* Database
12dd0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20   connection for 
12de0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f  malloc errors */
12df0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12e00 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
12e10 45 0a 20 20 69 6e 74 20 72 63 3b 0a 23 65 6e 64  E.  int rc;.#end
12e20 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
12e30 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
12e40 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f 78  TION.  sqlite3_x
12e50 61 75 74 68 20 78 41 75 74 68 3b 20 20 20 20 20  auth xAuth;     
12e60 20 20 2f 2a 20 53 61 76 65 64 20 78 41 75 74 68    /* Saved xAuth
12e70 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 23 65 6e 64   pointer */.#end
12e80 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  if..  assert( pT
12e90 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66  able );..#ifndef
12ea0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
12eb0 54 55 41 4c 54 41 42 4c 45 0a 20 20 64 62 2d 3e  TUALTABLE.  db->
12ec0 6e 53 63 68 65 6d 61 4c 6f 63 6b 2b 2b 3b 0a 20  nSchemaLock++;. 
12ed0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
12ee0 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61  bCallConnect(pPa
12ef0 72 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  rse, pTable);.  
12f00 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 2d  db->nSchemaLock-
12f10 2d 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  -;.  if( rc ){. 
12f20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
12f30 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
12f40 28 70 54 61 62 6c 65 29 20 29 20 72 65 74 75 72  (pTable) ) retur
12f50 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  n 0;.#endif..#if
12f60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12f70 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73  _VIEW.  /* A pos
12f80 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73  itive nCol means
12f90 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d   the columns nam
12fa0 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77  es for this view
12fb0 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64   are.  ** alread
12fc0 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20  y known..  */.  
12fd0 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
12fe0 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  >0 ) return 0;..
12ff0 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20    /* A negative 
13000 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61  nCol is a specia
13010 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67  l marker meaning
13020 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72   that we are cur
13030 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69  rently.  ** tryi
13040 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ng to compute th
13050 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20  e column names. 
13060 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69   If we enter thi
13070 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20  s routine with. 
13080 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e   ** a negative n
13090 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77  Col, it means tw
130a0 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20  o or more views 
130b0 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b  form a loop, lik
130c0 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  e this:.  **.  *
130d0 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
130e0 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20  W one AS SELECT 
130f0 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a  * FROM two;.  **
13100 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
13110 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a   two AS SELECT *
13120 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a   FROM one;.  **.
13130 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
13140 68 65 20 65 72 72 6f 72 20 61 62 6f 76 65 20 69  he error above i
13150 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69  s now caught pri
13160 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74  or to reaching t
13170 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20  his point..  ** 
13180 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  But the followin
13190 67 20 74 65 73 74 20 69 73 20 73 74 69 6c 6c 20  g test is still 
131a0 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 69 74 20  important as it 
131b0 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a  does come up.  *
131c0 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * in the followi
131d0 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20  ng:.  ** .  **  
131e0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
131f0 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a  main.ex1(a);.  *
13200 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 45 4d  *     CREATE TEM
13210 50 20 56 49 45 57 20 65 78 31 20 41 53 20 53 45  P VIEW ex1 AS SE
13220 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 78 31 3b  LECT a FROM ex1;
13230 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
13240 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31   * FROM temp.ex1
13250 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ;.  */.  if( pTa
13260 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20  ble->nCol<0 ){. 
13270 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13280 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
13290 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c   %s is circularl
132a0 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62  y defined", pTab
132b0 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  le->zName);.    
132c0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
132d0 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
132e0 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nCol>=0 );..  /*
132f0 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
13300 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65  far, it means we
13310 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   need to compute
13320 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73   the table names
13330 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  ..  ** Note that
13340 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
13350 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
13360 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70  elect() will exp
13370 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22  and any.  ** "*"
13380 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
13390 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20   results set of 
133a0 74 68 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c  the view and wil
133b0 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73  l assign cursors
133c0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65  .  ** to the ele
133d0 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f  ments of the FRO
133e0 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77  M clause.  But w
133f0 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68  e do not want th
13400 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  ese changes.  **
13410 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74   to be permanent
13420 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74  .  So the comput
13430 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e  ation is done on
13440 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
13450 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65  ELECT.  ** state
13460 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
13470 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f  s the view..  */
13480 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
13490 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20  e->pSelect );.  
134a0 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65  pSel = sqlite3Se
134b0 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
134c0 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  le->pSelect, 0);
134d0 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 23  .  if( pSel ){.#
134e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
134f0 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
13500 20 20 75 38 20 65 50 61 72 73 65 4d 6f 64 65 20    u8 eParseMode 
13510 3d 20 70 50 61 72 73 65 2d 3e 65 50 61 72 73 65  = pParse->eParse
13520 4d 6f 64 65 3b 0a 20 20 20 20 70 50 61 72 73 65  Mode;.    pParse
13530 2d 3e 65 50 61 72 73 65 4d 6f 64 65 20 3d 20 50  ->eParseMode = P
13540 41 52 53 45 5f 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  ARSE_MODE_NORMAL
13550 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e 20 3d  ;.#endif.    n =
13560 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
13570 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
13580 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
13590 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72  Parse, pSel->pSr
135a0 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  c);.    pTable->
135b0 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 64  nCol = -1;.    d
135c0 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
135d0 73 61 62 6c 65 2b 2b 3b 0a 23 69 66 6e 64 65 66  sable++;.#ifndef
135e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
135f0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78  HORIZATION.    x
13600 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68  Auth = db->xAuth
13610 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20  ;.    db->xAuth 
13620 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  = 0;.    pSelTab
13630 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
13640 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
13650 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64  se, pSel);.    d
13660 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68  b->xAuth = xAuth
13670 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c  ;.#else.    pSel
13680 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
13690 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
136a0 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65  Parse, pSel);.#e
136b0 6e 64 69 66 0a 20 20 20 20 70 50 61 72 73 65 2d  ndif.    pParse-
136c0 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69  >nTab = n;.    i
136d0 66 28 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  f( pTable->pChec
136e0 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 52  k ){.      /* CR
136f0 45 41 54 45 20 56 49 45 57 20 6e 61 6d 65 28 61  EATE VIEW name(a
13700 72 67 6c 69 73 74 29 20 41 53 20 2e 2e 2e 0a 20  rglist) AS .... 
13710 20 20 20 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65       ** The name
13720 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
13730 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 61 72   in the table ar
13740 65 20 74 61 6b 65 6e 20 66 72 6f 6d 0a 20 20 20  e taken from.   
13750 20 20 20 2a 2a 20 61 72 67 6c 69 73 74 20 77 68     ** arglist wh
13760 69 63 68 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ich is stored in
13770 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 2e   pTable->pCheck.
13780 20 20 54 68 65 20 70 43 68 65 63 6b 20 66 69 65    The pCheck fie
13790 6c 64 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 72 6d  ld.      ** norm
137a0 61 6c 6c 79 20 68 6f 6c 64 73 20 43 48 45 43 4b  ally holds CHECK
137b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
137c0 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  an ordinary tabl
137d0 65 2c 20 62 75 74 20 66 6f 72 0a 20 20 20 20 20  e, but for.     
137e0 20 2a 2a 20 61 20 56 49 45 57 20 69 74 20 68 6f   ** a VIEW it ho
137f0 6c 64 73 20 74 68 65 20 6c 69 73 74 20 6f 66 20  lds the list of 
13800 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 0a 20 20  column names..  
13810 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
13820 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
13830 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
13840 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 2c 20  pTable->pCheck, 
13850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13870 20 20 26 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 2c    &pTable->nCol,
13880 20 26 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b   &pTable->aCol);
13890 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  .      if( db->m
138a0 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 0a  allocFailed==0 .
138b0 20 20 20 20 20 20 20 26 26 20 70 50 61 72 73 65         && pParse
138c0 2d 3e 6e 45 72 72 3d 3d 30 0a 20 20 20 20 20 20  ->nErr==0.      
138d0 20 26 26 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c   && pTable->nCol
138e0 3d 3d 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e  ==pSel->pEList->
138f0 6e 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a 20  nExpr.      ){. 
13900 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
13910 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
13920 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
13930 61 72 73 65 2c 20 70 54 61 62 6c 65 2c 20 70 53  arse, pTable, pS
13940 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  el);.      }.   
13950 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65 6c 54   }else if( pSelT
13960 61 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  ab ){.      /* C
13970 52 45 41 54 45 20 56 49 45 57 20 6e 61 6d 65 20  REATE VIEW name 
13980 41 53 2e 2e 2e 20 20 77 69 74 68 6f 75 74 20 61  AS...  without a
13990 6e 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 2e  n argument list.
139a0 20 20 43 6f 6e 73 74 72 75 63 74 0a 20 20 20 20    Construct.    
139b0 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20    ** the column 
139c0 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 53  names from the S
139d0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
139e0 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
139f0 20 76 69 65 77 2e 0a 20 20 20 20 20 20 2a 2f 0a   view..      */.
13a00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
13a10 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  able->aCol==0 );
13a20 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  .      pTable->n
13a30 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
13a40 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61 62 6c  Col;.      pTabl
13a50 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->aCol = pSelTa
13a60 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->aCol;.      p
13a70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
13a80 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
13a90 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
13aa0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13ab0 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
13ac0 64 62 2c 20 30 2c 20 70 54 61 62 6c 65 2d 3e 70  db, 0, pTable->p
13ad0 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 7d  Schema) );.    }
13ae0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62  else{.      pTab
13af0 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
13b00 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
13b10 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  }.    sqlite3Del
13b20 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65  eteTable(db, pSe
13b30 6c 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  lTab);.    sqlit
13b40 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
13b50 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64 62  b, pSel);.    db
13b60 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73  ->lookaside.bDis
13b70 61 62 6c 65 2d 2d 3b 0a 23 69 66 6e 64 65 66 20  able--;.#ifndef 
13b80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45  SQLITE_OMIT_ALTE
13b90 52 54 41 42 4c 45 0a 20 20 20 20 70 50 61 72 73  RTABLE.    pPars
13ba0 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 20 3d 20  e->eParseMode = 
13bb0 65 50 61 72 73 65 4d 6f 64 65 3b 0a 23 65 6e 64  eParseMode;.#end
13bc0 69 66 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  if.  } else {.  
13bd0 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20    nErr++;.  }.  
13be0 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
13bf0 3e 73 63 68 65 6d 61 46 6c 61 67 73 20 7c 3d 20  >schemaFlags |= 
13c00 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b  DB_UnresetViews;
13c10 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
13c20 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
13c30 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75  qlite3DeleteColu
13c40 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62  mnNames(db, pTab
13c50 6c 65 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  le);.    pTable-
13c60 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70  >aCol = 0;.    p
13c70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
13c80 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
13c90 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
13ca0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72  */.  return nErr
13cb0 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;  .}.#endif /* 
13cc0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13cd0 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
13ce0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
13cf0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
13d00 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
13d10 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
13d20 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
13d30 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
13d40 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61  every VIEW in da
13d50 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73  tabase idx..*/.s
13d60 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
13d70 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71  eViewResetAll(sq
13d80 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
13d90 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  dx){.  HashElem 
13da0 2a 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *i;.  assert( sq
13db0 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
13dc0 48 65 6c 64 28 64 62 2c 20 69 64 78 2c 20 30 29  Held(db, idx, 0)
13dd0 20 29 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73   );.  if( !DbHas
13de0 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
13df0 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
13e00 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  s) ) return;.  f
13e10 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
13e20 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64  irst(&db->aDb[id
13e30 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  x].pSchema->tblH
13e40 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65  ash); i;i=sqlite
13e50 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
13e60 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
13e70 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
13e80 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
13e90 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
13ea0 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43    sqlite3DeleteC
13eb0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70  olumnNames(db, p
13ec0 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Tab);.      pTab
13ed0 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
13ee0 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30    pTab->nCol = 0
13ef0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62  ;.    }.  }.  Db
13f00 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62  ClearProperty(db
13f10 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
13f20 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65  tViews);.}.#else
13f30 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65  .# define sqlite
13f40 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42  ViewResetAll(A,B
13f50 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
13f60 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
13f70 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
13f80 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
13f90 79 20 74 68 65 20 56 44 42 45 20 74 6f 20 61 64  y the VDBE to ad
13fa0 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61  just the interna
13fb0 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64  l schema.** used
13fc0 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20   by SQLite when 
13fd0 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20  the btree layer 
13fe0 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f  moves a table ro
13ff0 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20  ot page. The.** 
14000 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74  root-page of a t
14010 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e  able or index in
14020 20 64 61 74 61 62 61 73 65 20 69 44 62 20 68 61   database iDb ha
14030 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69  s changed from i
14040 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a  From.** to iTo..
14050 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37  **.** Ticket #17
14060 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20  28:  The symbol 
14070 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c  table might stil
14080 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d  l contain inform
14090 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c  ation.** on tabl
140a0 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65  es and/or indice
140b0 73 20 74 68 61 74 20 61 72 65 20 74 68 65 20 70  s that are the p
140c0 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
140d0 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79  deleted..** If y
140e0 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20  ou are unlucky, 
140f0 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c  one of those del
14100 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20  eted indices or 
14110 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20  tables might.** 
14120 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f  have the same ro
14130 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73  otpage number as
14140 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20   the real table 
14150 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  or index that is
14160 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e  .** being moved.
14170 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73    So we cannot s
14180 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20 61 66  top searching af
14190 74 65 72 20 74 68 65 20 66 69 72 73 74 20 6d 61  ter the first ma
141a0 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20  tch .** because 
141b0 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20  the first match 
141c0 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65  might be for one
141d0 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65 64 20   of the deleted 
141e0 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61  indices.** or ta
141f0 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65  bles and not the
14200 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61   table/index tha
14210 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65  t is actually be
14220 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65  ing moved..** We
14230 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c   must continue l
14240 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c  ooping until all
14250 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69   tables and indi
14260 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74  ces with.** root
14270 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65  page==iFrom have
14280 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20   been converted 
14290 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61  to have a rootpa
142a0 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20  ge of iTo.** in 
142b0 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65 72 74  order to be cert
142c0 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20  ain that we got 
142d0 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a  the right one..*
142e0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
142f0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
14300 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f  .void sqlite3Roo
14310 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c 69 74  tPageMoved(sqlit
14320 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
14330 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
14340 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  iTo){.  HashElem
14350 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20   *pElem;.  Hash 
14360 2a 70 48 61 73 68 3b 0a 20 20 44 62 20 2a 70 44  *pHash;.  Db *pD
14370 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  b;..  assert( sq
14380 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
14390 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
143a0 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d   );.  pDb = &db-
143b0 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 48 61  >aDb[iDb];.  pHa
143c0 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65  sh = &pDb->pSche
143d0 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66  ma->tblHash;.  f
143e0 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
143f0 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b  ashFirst(pHash);
14400 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
14410 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
14420 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  em)){.    Table 
14430 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
14440 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
14450 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75     if( pTab->tnu
14460 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  m==iFrom ){.    
14470 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69    pTab->tnum = i
14480 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  To;.    }.  }.  
14490 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53  pHash = &pDb->pS
144a0 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a  chema->idxHash;.
144b0 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
144c0 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73  teHashFirst(pHas
144d0 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
144e0 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
144f0 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64  pElem)){.    Ind
14500 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74  ex *pIdx = sqlit
14510 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
14520 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
14530 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  tnum==iFrom ){. 
14540 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20       pIdx->tnum 
14550 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  = iTo;.    }.  }
14560 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
14570 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65   Write code to e
14580 72 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 77  rase the table w
14590 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54  ith root-page iT
145a0 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61  able from databa
145b0 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20  se iDb..** Also 
145c0 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  write code to mo
145d0 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f  dify the sqlite_
145e0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
145f0 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
14600 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61  .** if a root-pa
14610 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61  ge of another ta
14620 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20  ble is moved by 
14630 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20  the btree-layer 
14640 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e  whilst.** erasin
14650 67 20 69 54 61 62 6c 65 20 28 74 68 69 73 20 63  g iTable (this c
14660 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
14670 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
14680 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61  tabase)..*/ .sta
14690 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
146a0 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a  RootPage(Parse *
146b0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62  pParse, int iTab
146c0 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  le, int iDb){.  
146d0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
146e0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
146f0 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c  ;.  int r1 = sql
14700 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
14710 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 69 54  Parse);.  if( iT
14720 61 62 6c 65 3c 32 20 29 20 73 71 6c 69 74 65 33  able<2 ) sqlite3
14730 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
14740 20 22 63 6f 72 72 75 70 74 20 73 63 68 65 6d 61   "corrupt schema
14750 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ");.  sqlite3Vdb
14760 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65  eAddOp3(v, OP_De
14770 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72  stroy, iTable, r
14780 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  1, iDb);.  sqlit
14790 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
147a0 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
147b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
147c0 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72  UM.  /* OP_Destr
147d0 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20  oy stores an in 
147e0 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20 74  integer r1. If t
147f0 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a  his integer.  **
14800 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
14810 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f  en it is the roo
14820 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
14830 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74   a table moved t
14840 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20  o.  ** location 
14850 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c  iTable. The foll
14860 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66  owing code modif
14870 69 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ies the sqlite_m
14880 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20  aster table to. 
14890 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73   ** reflect this
148a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
148b0 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53 51  "#NNN" in the SQ
148c0 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 63  L is a special c
148d0 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61  onstant that mea
148e0 6e 73 20 77 68 61 74 65 76 65 72 20 76 61 6c 75  ns whatever valu
148f0 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72 65 67  e.  ** is in reg
14900 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20  ister NNN.  See 
14910 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20 61 73  grammar rules as
14920 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
14930 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20  e TK_REGISTER.  
14940 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64  ** token for add
14950 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
14960 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ion..  */.  sqli
14970 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
14980 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50  Parse, .     "UP
14990 44 41 54 45 20 25 51 2e 25 73 20 53 45 54 20 72  DATE %Q.%s SET r
149a0 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52 45  ootpage=%d WHERE
149b0 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70 61 67   #%d AND rootpag
149c0 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70 50 61  e=#%d",.     pPa
149d0 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
149e0 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54  ].zDbSName, MAST
149f0 45 52 5f 4e 41 4d 45 2c 20 69 54 61 62 6c 65 2c  ER_NAME, iTable,
14a00 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66   r1, r1);.#endif
14a10 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
14a20 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
14a30 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   r1);.}../*.** W
14a40 72 69 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rite VDBE code t
14a50 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20 70 54  o erase table pT
14a60 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63  ab and all assoc
14a70 69 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e  iated indices on
14a80 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74   disk..** Code t
14a90 6f 20 75 70 64 61 74 65 20 74 68 65 20 73 71 6c  o update the sql
14aa0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
14ab0 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  s and internal s
14ac0 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e  chema definition
14ad0 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72  s.** in case a r
14ae0 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69  oot-page belongi
14af0 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61  ng to another ta
14b00 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20  ble is moved by 
14b10 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a  the btree layer.
14b20 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64  ** is also added
14b30 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65   (this can happe
14b40 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76  n with an auto-v
14b50 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e  acuum database).
14b60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14b70 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72  destroyTable(Par
14b80 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
14b90 65 20 2a 70 54 61 62 29 7b 0a 20 20 2f 2a 20 49  e *pTab){.  /* I
14ba0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  f the database m
14bb0 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75  ay be auto-vacuu
14bc0 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53 51  m capable (if SQ
14bd0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
14be0 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  CUUM.  ** is not
14bf0 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20   defined), then 
14c00 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
14c10 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72  to call OP_Destr
14c20 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74  oy on the.  ** t
14c30 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72  able and index r
14c40 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64  oot-pages in ord
14c50 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  er, starting wit
14c60 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c  h the numericall
14c70 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20  y .  ** largest 
14c80 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
14c90 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
14ca0 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74  s that none of t
14cb0 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20  he root-pages.  
14cc0 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79  ** to be destroy
14cd0 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20  ed is relocated 
14ce0 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50  by an earlier OP
14cf0 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69  _Destroy. i.e. i
14d00 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  f the.  ** follo
14d10 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a  wing were coded:
14d20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65  .  **.  ** OP_De
14d30 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e  stroy 4 0.  ** .
14d40 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72  ...  ** OP_Destr
14d50 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a  oy 5 0.  **.  **
14d60 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35   and root page 5
14d70 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20   happened to be 
14d80 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
14d90 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20  -page number in 
14da0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
14db0 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67  e, then root pag
14dc0 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76  e 5 would be mov
14dd0 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79 20  ed to page 4 by 
14de0 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65  the .  ** "OP_De
14df0 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64  stroy 4 0" opcod
14e00 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65 6e  e. The subsequen
14e10 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  t "OP_Destroy 5 
14e20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a  0" would hit.  *
14e30 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61  * a free-list pa
14e40 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69  ge..  */.  int i
14e50 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  Tab = pTab->tnum
14e60 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79  ;.  int iDestroy
14e70 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  ed = 0;..  while
14e80 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ( 1 ){.    Index
14e90 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20   *pIdx;.    int 
14ea0 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20  iLargest = 0;.. 
14eb0 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79 65     if( iDestroye
14ec0 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65  d==0 || iTab<iDe
14ed0 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20  stroyed ){.     
14ee0 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62   iLargest = iTab
14ef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
14f00 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
14f10 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
14f20 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
14f30 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64    int iIdx = pId
14f40 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61  x->tnum;.      a
14f50 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63  ssert( pIdx->pSc
14f60 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
14f70 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ema );.      if(
14f80 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20   (iDestroyed==0 
14f90 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f  || (iIdx<iDestro
14fa0 79 65 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c  yed)) && iIdx>iL
14fb0 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20  argest ){.      
14fc0 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64    iLargest = iId
14fd0 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
14fe0 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67 65 73  .    if( iLarges
14ff0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
15000 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  turn;.    }else{
15010 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
15020 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
15030 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
15040 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
15050 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15060 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50  iDb>=0 && iDb<pP
15070 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b  arse->db->nDb );
15080 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 52 6f  .      destroyRo
15090 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 69  otPage(pParse, i
150a0 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a 20  Largest, iDb);. 
150b0 20 20 20 20 20 69 44 65 73 74 72 6f 79 65 64 20       iDestroyed 
150c0 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20 20  = iLargest;.    
150d0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
150e0 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72  emove entries fr
150f0 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  om the sqlite_st
15100 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f 72 20  atN tables (for 
15110 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a 2a  N in (1,2,3)).**
15120 20 61 66 74 65 72 20 61 20 44 52 4f 50 20 49 4e   after a DROP IN
15130 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41 42 4c  DEX or DROP TABL
15140 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74  E command..*/.st
15150 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
15160 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
15170 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
15180 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
15190 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
151a0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
151b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
151c0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6e 75   The database nu
151d0 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  mber */.  const 
151e0 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20 20 20  char *zType,    
151f0 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22 74 62   /* "idx" or "tb
15200 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  l" */.  const ch
15210 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f  ar *zName      /
15220 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78 20  * Name of index 
15230 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  or table */.){. 
15240 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
15250 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20  char *zDbName = 
15260 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
15270 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
15280 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20   for(i=1; i<=4; 
15290 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  i++){.    char z
152a0 54 61 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c  Tab[24];.    sql
152b0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
152c0 7a 65 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c  zeof(zTab),zTab,
152d0 22 73 71 6c 69 74 65 5f 73 74 61 74 25 64 22 2c  "sqlite_stat%d",
152e0 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  i);.    if( sqli
152f0 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61  te3FindTable(pPa
15300 72 73 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a  rse->db, zTab, z
15310 44 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  DbName) ){.     
15320 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
15330 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
15340 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
15350 20 25 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d   %Q.%s WHERE %s=
15360 25 51 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62  %Q",.        zDb
15370 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70  Name, zTab, zTyp
15380 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29  e, zName.      )
15390 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
153a0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
153b0 64 65 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62  de to drop a tab
153c0 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
153d0 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65  te3CodeDropTable
153e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
153f0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74  Table *pTab, int
15400 20 69 44 62 2c 20 69 6e 74 20 69 73 56 69 65 77   iDb, int isView
15410 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
15420 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
15430 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67  arse->db;.  Trig
15440 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20  ger *pTrigger;. 
15450 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
15460 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d  aDb[iDb];..  v =
15470 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
15480 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
15490 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c  t( v!=0 );.  sql
154a0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
154b0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
154c0 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  1, iDb);..#ifnde
154d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
154e0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
154f0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
15500 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
15510 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
15520 56 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e  VBegin);.  }.#en
15530 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61  dif..  /* Drop a
15540 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f  ll triggers asso
15550 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
15560 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
15570 70 65 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69  ped. Code.  ** i
15580 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72  s generated to r
15590 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72  emove entries fr
155a0 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  om sqlite_master
155b0 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c   and/or.  ** sql
155c0 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
155d0 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  if required..  *
155e0 2f 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20 73  /.  pTrigger = s
155f0 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69 73  qlite3TriggerLis
15600 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  t(pParse, pTab);
15610 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67  .  while( pTrigg
15620 65 72 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  er ){.    assert
15630 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68  ( pTrigger->pSch
15640 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
15650 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 70  ma || .        p
15660 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
15670 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ==db->aDb[1].pSc
15680 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69  hema );.    sqli
15690 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74  te3DropTriggerPt
156a0 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67  r(pParse, pTrigg
156b0 65 72 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65  er);.    pTrigge
156c0 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e  r = pTrigger->pN
156d0 65 78 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ext;.  }..#ifnde
156e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
156f0 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a  TOINCREMENT.  /*
15700 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72   Remove any entr
15710 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ies of the sqlit
15720 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
15730 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
15740 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  .  ** the table 
15750 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54  being dropped. T
15760 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f  his is done befo
15770 72 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  re the table is 
15780 64 72 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74 20  dropped.  ** at 
15790 74 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c  the btree level,
157a0 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c   in case the sql
157b0 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
157c0 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a  le needs to.  **
157d0 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c   move as a resul
157e0 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63  t of the drop (c
157f0 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74  an happen in aut
15800 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a  o-vacuum mode)..
15810 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d    */.  if( pTab-
15820 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
15830 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a  utoincrement ){.
15840 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
15850 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
15860 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
15870 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75  M %Q.sqlite_sequ
15880 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d  ence WHERE name=
15890 25 51 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e  %Q",.      pDb->
158a0 7a 44 62 53 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  zDbSName, pTab->
158b0 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d  zName.    );.  }
158c0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72  .#endif..  /* Dr
158d0 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41  op all SQLITE_MA
158e0 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69  STER table and i
158f0 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61  ndex entries tha
15900 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20  t refer to the. 
15910 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70   ** table. The p
15920 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70  rogram name loop
15930 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61  s through the ma
15940 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64  ster table and d
15950 65 6c 65 74 65 73 0a 20 20 2a 2a 20 65 76 65 72  eletes.  ** ever
15960 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72  y row that refer
15970 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20  s to a table of 
15980 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
15990 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20   the one being. 
159a0 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69   ** dropped. Tri
159b0 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65  ggers are handle
159c0 64 20 73 65 70 61 72 61 74 65 6c 79 20 62 65 63  d separately bec
159d0 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20 63  ause a trigger c
159e0 61 6e 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74  an be.  ** creat
159f0 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64  ed in the temp d
15a00 61 74 61 62 61 73 65 20 74 68 61 74 20 72 65 66  atabase that ref
15a10 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69  ers to a table i
15a20 6e 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 64  n another.  ** d
15a30 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
15a40 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
15a50 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
15a60 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
15a70 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e  Q.%s WHERE tbl_n
15a80 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21  ame=%Q and type!
15a90 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20  ='trigger'",.   
15aa0 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65     pDb->zDbSName
15ab0 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70  , MASTER_NAME, p
15ac0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  Tab->zName);.  i
15ad0 66 28 20 21 69 73 56 69 65 77 20 26 26 20 21 49  f( !isView && !I
15ae0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
15af0 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 54 61 62  {.    destroyTab
15b00 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  le(pParse, pTab)
15b10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f  ;.  }..  /* Remo
15b20 76 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74  ve the table ent
15b30 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73  ry from SQLite's
15b40 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
15b50 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a   and modify.  **
15b60 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
15b70 69 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ie..  */.  if( I
15b80 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
15b90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
15ba0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44  eAddOp4(v, OP_VD
15bb0 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20  estroy, iDb, 0, 
15bc0 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  0, pTab->zName, 
15bd0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d  0);.    sqlite3M
15be0 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
15bf0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
15c00 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44  beAddOp4(v, OP_D
15c10 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30  ropTable, iDb, 0
15c20 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
15c30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  , 0);.  sqlite3C
15c40 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
15c50 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  se, iDb);.  sqli
15c60 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64  teViewResetAll(d
15c70 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  b, iDb);.}../*.*
15c80 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
15c90 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74  s called to do t
15ca0 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f  he work of a DRO
15cb0 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  P TABLE statemen
15cc0 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74  t..** pName is t
15cd0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
15ce0 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70  able to be dropp
15cf0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
15d00 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72  te3DropTable(Par
15d10 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
15d20 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ist *pName, int 
15d30 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72  isView, int noEr
15d40 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  r){.  Table *pTa
15d50 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
15d60 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
15d70 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
15d80 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  iDb;..  if( db->
15d90 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
15da0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
15db0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
15dc0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
15dd0 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73  nErr==0 );.  ass
15de0 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
15df0 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 21 49 73  ==1 );.  if( !Is
15e00 52 65 75 73 65 53 63 68 65 6d 61 28 64 62 29 20  ReuseSchema(db) 
15e10 26 26 20 73 71 6c 69 74 65 33 52 65 61 64 53 63  && sqlite3ReadSc
15e20 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67  hema(pParse) ) g
15e30 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
15e40 62 6c 65 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72  ble;.  if( noErr
15e50 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45   ) db->suppressE
15e60 72 72 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20  rr++;.  assert( 
15e70 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56  isView==0 || isV
15e80 69 65 77 3d 3d 4c 4f 43 41 54 45 5f 56 49 45 57  iew==LOCATE_VIEW
15e90 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   );.  pTab = sql
15ea0 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
15eb0 74 65 6d 28 70 50 61 72 73 65 2c 20 69 73 56 69  tem(pParse, isVi
15ec0 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ew, &pName->a[0]
15ed0 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29  );.  if( noErr )
15ee0 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72   db->suppressErr
15ef0 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  --;..  if( pTab=
15f00 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f  =0 ){.    if( no
15f10 45 72 72 20 29 20 73 71 6c 69 74 65 33 43 6f 64  Err ) sqlite3Cod
15f20 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
15f30 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  ma(pParse, pName
15f40 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
15f50 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
15f60 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
15f70 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
15f80 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
15f90 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
15fa0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
15fb0 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
15fc0 62 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63  b );.  sqlite3Sc
15fd0 68 65 6d 61 57 72 69 74 61 62 6c 65 28 70 50 61  hemaWritable(pPa
15fe0 72 73 65 2c 20 69 44 62 29 3b 0a 0a 20 20 2f 2a  rse, iDb);..  /*
15ff0 20 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69   If pTab is a vi
16000 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c  rtual table, cal
16010 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  l ViewGetColumnN
16020 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65  ames() to ensure
16030 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74  .  ** it is init
16040 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
16050 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
16060 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69  ab) && sqlite3Vi
16070 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
16080 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
16090 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
160a0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
160b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
160c0 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
160d0 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
160e0 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  de;.    const ch
160f0 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
16100 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
16110 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
16120 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
16130 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63  .zDbSName;.    c
16140 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32  onst char *zArg2
16150 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
16160 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
16170 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
16180 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
16190 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  Db)){.      goto
161a0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
161b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
161c0 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
161d0 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
161e0 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
161f0 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
16200 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
16210 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EW;.      }else{
16220 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
16230 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57  SQLITE_DROP_VIEW
16240 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
16250 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
16260 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d  RTUALTABLE.    }
16270 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75  else if( IsVirtu
16280 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
16290 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
162a0 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20  DROP_VTABLE;.   
162b0 20 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74     zArg2 = sqlit
162c0 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20  e3GetVTable(db, 
162d0 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61  pTab)->pMod->zNa
162e0 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  me;.#endif.    }
162f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
16300 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
16310 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
16320 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
16330 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  DROP_TEMP_TABLE;
16340 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16350 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
16360 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a  ITE_DROP_TABLE;.
16370 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16380 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
16390 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
163a0 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ode, pTab->zName
163b0 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b  , zArg2, zDb) ){
163c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
163d0 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
163e0 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
163f0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
16400 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
16410 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  E, pTab->zName, 
16420 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
16430 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
16440 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  table;.    }.  }
16450 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71  .#endif.  if( sq
16460 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
16470 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ab->zName, "sqli
16480 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20  te_", 7)==0 .   
16490 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
164a0 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Cmp(pTab->zName,
164b0 20 22 73 71 6c 69 74 65 5f 73 74 61 74 22 2c 20   "sqlite_stat", 
164c0 31 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  11)!=0 ){.    sq
164d0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
164e0 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
164f0 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70  may not be dropp
16500 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
16510 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
16520 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
16530 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16540 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20  _OMIT_VIEW.  /* 
16550 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c  Ensure DROP TABL
16560 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e  E is not used on
16570 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f   a view, and DRO
16580 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73  P VIEW is not us
16590 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62  ed.  ** on a tab
165a0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  le..  */.  if( i
165b0 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
165c0 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
165d0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
165e0 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
165f0 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65  OP TABLE to dele
16600 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54  te table %s", pT
16610 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
16620 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
16630 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
16640 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d  !isView && pTab-
16650 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
16660 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16670 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
16680 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65  P VIEW to delete
16690 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d   view %s", pTab-
166a0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
166b0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
166c0 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
166d0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
166e0 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
166f0 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d  table from the m
16700 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a  aster table.  **
16710 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
16720 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
16730 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
16740 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
16750 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
16760 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
16770 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , iDb);.    if( 
16780 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20  !isView ){.     
16790 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61   sqlite3ClearSta
167a0 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20  tTables(pParse, 
167b0 69 44 62 2c 20 22 74 62 6c 22 2c 20 70 54 61 62  iDb, "tbl", pTab
167c0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
167d0 73 71 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62  sqlite3FkDropTab
167e0 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
167f0 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  , pTab);.    }. 
16800 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72     sqlite3CodeDr
16810 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
16820 70 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65  pTab, iDb, isVie
16830 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72  w);.  }..exit_dr
16840 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69  op_table:.  sqli
16850 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
16860 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, pName);.}..
16870 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
16880 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
16890 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72  create a new for
168a0 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  eign key on the 
168b0 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74  table.** current
168c0 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
168d0 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c  ction.  pFromCol
168e0 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
168f0 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  h columns.** in 
16900 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
16910 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  e point to the f
16920 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20  oreign key.  If 
16930 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e  pFromCol==0 then
16940 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20  .** connect the 
16950 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20  key to the last 
16960 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e  column inserted.
16970 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d    pTo is the nam
16980 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  e of.** the tabl
16990 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 28 61  e referred to (a
169a0 2e 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74  .k.a the "parent
169b0 22 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f  " table).  pToCo
169c0 6c 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f  l is a list.** o
169d0 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
169e0 70 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65  parent pTo table
169f0 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e  .  flags contain
16a00 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  s all.** informa
16a10 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
16a20 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
16a30 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70  on algorithms sp
16a40 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68  ecified.** in th
16a50 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20  e ON DELETE, ON 
16a60 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e  UPDATE and ON IN
16a70 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SERT clauses..**
16a80 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75  .** An FKey stru
16a90 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
16aa0 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
16ab0 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
16ac0 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74  y.** under const
16ad0 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ruction in the p
16ae0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
16af0 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   field..**.** Th
16b00 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  e foreign key is
16b10 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41   set for IMMEDIA
16b20 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  TE processing.  
16b30 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  A subsequent cal
16b40 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44  l.** to sqlite3D
16b50 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29  eferForeignKey()
16b60 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
16b70 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a  is to DEFERRED..
16b80 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
16b90 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28  reateForeignKey(
16ba0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
16bb0 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
16bc0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
16bd0 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43  ExprList *pFromC
16be0 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ol,  /* Columns 
16bf0 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68  in this table th
16c00 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65  at point to othe
16c10 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b  r table */.  Tok
16c20 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20  en *pTo,        
16c30 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
16c40 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
16c50 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43    ExprList *pToC
16c60 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol,    /* Column
16c70 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74  s in the other t
16c80 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  able */.  int fl
16c90 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
16ca0 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
16cb0 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
16cc0 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  . */.){.  sqlite
16cd0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
16ce0 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
16cf0 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
16d00 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  KEY.  FKey *pFKe
16d10 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70  y = 0;.  FKey *p
16d20 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20  NextTo;.  Table 
16d30 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  *p = pParse->pNe
16d40 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42  wTable;.  int nB
16d50 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  yte;.  int i;.  
16d60 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72  int nCol;.  char
16d70 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *z;..  assert( 
16d80 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  pTo!=0 );.  if( 
16d90 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  p==0 || IN_DECLA
16da0 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66  RE_VTAB ) goto f
16db0 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72  k_end;.  if( pFr
16dc0 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
16dd0 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43  int iCol = p->nC
16de0 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45  ol-1;.    if( NE
16df0 56 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f  VER(iCol<0) ) go
16e00 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69  to fk_end;.    i
16e10 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
16e20 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b  Col->nExpr!=1 ){
16e30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
16e40 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
16e50 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25  foreign key on %
16e60 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68  s".         " sh
16e70 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f  ould reference o
16e80 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f  nly one column o
16e90 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20  f table %T",.   
16ea0 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43        p->aCol[iC
16eb0 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b  ol].zName, pTo);
16ec0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  .      goto fk_e
16ed0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  nd;.    }.    nC
16ee0 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ol = 1;.  }else 
16ef0 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
16f00 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72  oCol->nExpr!=pFr
16f10 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a  omCol->nExpr ){.
16f20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
16f30 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
16f40 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63      "number of c
16f50 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67  olumns in foreig
16f60 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  n key does not m
16f70 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
16f80 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f  of ".        "co
16f90 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66  lumns in the ref
16fa0 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b  erenced table");
16fb0 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
16fc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
16fd0 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Col = pFromCol->
16fe0 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79  nExpr;.  }.  nBy
16ff0 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b  te = sizeof(*pFK
17000 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73  ey) + (nCol-1)*s
17010 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f  izeof(pFKey->aCo
17020 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b  l[0]) + pTo->n +
17030 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c   1;.  if( pToCol
17040 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
17050 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72   i<pToCol->nExpr
17060 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42  ; i++){.      nB
17070 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  yte += sqlite3St
17080 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61  rlen30(pToCol->a
17090 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a  [i].zName) + 1;.
170a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
170b0 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  y = sqlite3DbMal
170c0 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
170d0 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79  e );.  if( pFKey
170e0 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ==0 ){.    goto 
170f0 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46  fk_end;.  }.  pF
17100 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a  Key->pFrom = p;.
17110 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72    pFKey->pNextFr
17120 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20  om = p->pFKey;. 
17130 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b   z = (char*)&pFK
17140 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a  ey->aCol[nCol];.
17150 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a    pFKey->zTo = z
17160 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d  ;.  if( IN_RENAM
17170 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
17180 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
17190 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76  enMap(pParse, (v
171a0 6f 69 64 2a 29 7a 2c 20 70 54 6f 29 3b 0a 20 20  oid*)z, pTo);.  
171b0 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54  }.  memcpy(z, pT
171c0 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20  o->z, pTo->n);. 
171d0 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a   z[pTo->n] = 0;.
171e0 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
171f0 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d  (z);.  z += pTo-
17200 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e  >n+1;.  pFKey->n
17210 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66  Col = nCol;.  if
17220 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
17230 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  .    pFKey->aCol
17240 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e  [0].iFrom = p->n
17250 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Col-1;.  }else{.
17260 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
17270 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
17280 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
17290 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c  r(j=0; j<p->nCol
172a0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
172b0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
172c0 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  mp(p->aCol[j].zN
172d0 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61  ame, pFromCol->a
172e0 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
172f0 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79  .          pFKey
17300 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20  ->aCol[i].iFrom 
17310 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = j;.          b
17320 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
17330 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
17340 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a  ( j>=p->nCol ){.
17350 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17360 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
17370 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e  .          "unkn
17380 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c  own column \"%s\
17390 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  " in foreign key
173a0 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20   definition", . 
173b0 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f           pFromCo
173c0 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
173d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f          goto fk_
173e0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
173f0 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45     if( IN_RENAME
17400 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20  _OBJECT ){.     
17410 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
17420 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73  TokenRemap(pPars
17430 65 2c 20 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  e, &pFKey->aCol[
17440 69 5d 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  i], pFromCol->a[
17450 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
17460 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
17470 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
17480 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
17490 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
174a0 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
174b0 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
174c0 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
174d0 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
174e0 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20  zCol = z;.      
174f0 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
17500 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  JECT ){.        
17510 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
17520 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20  enRemap(pParse, 
17530 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
17540 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
17550 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20        memcpy(z, 
17560 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
17570 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b  me, n);.      z[
17580 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20  n] = 0;.      z 
17590 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  += n+1;.    }.  
175a0 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  }.  pFKey->isDef
175b0 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b  erred = 0;.  pFK
175c0 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d  ey->aAction[0] =
175d0 20 28 75 38 29 28 66 6c 61 67 73 20 26 20 30 78   (u8)(flags & 0x
175e0 66 66 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ff);            
175f0 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61 63 74  /* ON DELETE act
17600 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e  ion */.  pFKey->
17610 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38  aAction[1] = (u8
17620 29 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20  )((flags >> 8 ) 
17630 26 20 30 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f  & 0xff);    /* O
17640 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e 20  N UPDATE action 
17650 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
17660 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
17670 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70  Held(db, 0, p->p
17680 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 70 4e 65  Schema) );.  pNe
17690 78 74 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73  xtTo = (FKey *)s
176a0 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
176b0 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b  (&p->pSchema->fk
176c0 65 79 48 61 73 68 2c 20 0a 20 20 20 20 20 20 70  eyHash, .      p
176d0 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64  FKey->zTo, (void
176e0 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20   *)pFKey.  );.  
176f0 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b  if( pNextTo==pFK
17700 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
17710 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
17720 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
17730 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 78 74 54    }.  if( pNextT
17740 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  o ){.    assert(
17750 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54   pNextTo->pPrevT
17760 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b 65  o==0 );.    pFKe
17770 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e 65  y->pNextTo = pNe
17780 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74 54  xtTo;.    pNextT
17790 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70 46 4b  o->pPrevTo = pFK
177a0 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69  ey;.  }..  /* Li
177b0 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  nk the foreign k
177c0 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ey to the table 
177d0 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70  as the last step
177e0 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65  ..  */.  p->pFKe
177f0 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b  y = pFKey;.  pFK
17800 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a  ey = 0;..fk_end:
17810 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
17820 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e  (db, pFKey);.#en
17830 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
17840 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
17850 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71  IGN_KEY) */.  sq
17860 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
17870 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c  ete(db, pFromCol
17880 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
17890 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
178a0 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ToCol);.}../*.**
178b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
178c0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
178d0 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
178e0 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59  ATE or INITIALLY
178f0 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61   DEFERRED.** cla
17900 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70  use is seen as p
17910 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e  art of a foreign
17920 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e   key definition.
17930 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64    The isDeferred
17940 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
17950 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   1 for INITIALLY
17960 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20   DEFERRED and 0 
17970 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d  for INITIALLY IM
17980 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20  MEDIATE..** The 
17990 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20  behavior of the 
179a0 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72  most recently cr
179b0 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  eated foreign ke
179c0 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a  y is adjusted.**
179d0 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f   accordingly..*/
179e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
179f0 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72  erForeignKey(Par
17a00 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
17a10 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66  isDeferred){.#if
17a20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17a30 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54  _FOREIGN_KEY.  T
17a40 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b  able *pTab;.  FK
17a50 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28  ey *pFKey;.  if(
17a60 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   (pTab = pParse-
17a70 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c  >pNewTable)==0 |
17a80 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d  | (pFKey = pTab-
17a90 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74  >pFKey)==0 ) ret
17aa0 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69  urn;.  assert( i
17ab0 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20  sDeferred==0 || 
17ac0 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29 3b  isDeferred==1 );
17ad0 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32 33 2d   /* EV: R-30323-
17ae0 32 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65 79  21917 */.  pFKey
17af0 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 28  ->isDeferred = (
17b00 75 38 29 69 73 44 65 66 65 72 72 65 64 3b 0a 23  u8)isDeferred;.#
17b10 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  endif.}../*.** G
17b20 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
17b30 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64  t will erase and
17b40 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70   refill index *p
17b50 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  Idx.  This is.**
17b60 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c   used to initial
17b70 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61  ize a newly crea
17b80 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20  ted index or to 
17b90 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  recompute the.**
17ba0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69   content of an i
17bb0 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65  ndex in response
17bc0 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f   to a REINDEX co
17bd0 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20  mmand..**.** if 
17be0 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e  memRootPage is n
17bf0 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20  ot negative, it 
17c00 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 69  means that the i
17c10 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a  ndex is newly.**
17c20 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 72   created.  The r
17c30 65 67 69 73 74 65 72 20 73 70 65 63 69 66 69 65  egister specifie
17c40 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65  d by memRootPage
17c50 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a   contains the.**
17c60 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
17c70 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  r of the index. 
17c80 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   If memRootPage 
17c90 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
17ca0 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61  n.** the index a
17cb0 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 6e  lready exists an
17cc0 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65  d must be cleare
17cd0 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72  d before being r
17ce0 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74  efilled and.** t
17cf0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
17d00 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
17d10 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70   is taken from p
17d20 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a  Index->tnum..*/.
17d30 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
17d40 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50  te3RefillIndex(P
17d50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
17d60 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74  dex *pIndex, int
17d70 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20   memRootPage){. 
17d80 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
17d90 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20  Index->pTable;  
17da0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68 61  /* The table tha
17db0 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a  t is indexed */.
17dc0 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61    int iTab = pPa
17dd0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
17de0 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72   /* Btree cursor
17df0 20 75 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a   used for pTab *
17e00 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70  /.  int iIdx = p
17e10 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
17e20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73     /* Btree curs
17e30 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64  or used for pInd
17e40 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72  ex */.  int iSor
17e50 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
17e60 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
17e70 20 6f 70 65 6e 65 64 20 62 79 20 4f 70 65 6e 53   opened by OpenS
17e80 6f 72 74 65 72 20 28 69 66 20 69 6e 20 75 73 65  orter (if in use
17e90 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31  ) */.  int addr1
17ea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17eb0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
17ec0 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20   of top of loop 
17ed0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 32 3b 20  */.  int addr2; 
17ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ef0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 74      /* Address t
17f00 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 6e 65  o jump to for ne
17f10 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a  xt iteration */.
17f20 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20    int tnum;     
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f40 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
17f50 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
17f60 69 50 61 72 74 49 64 78 4c 61 62 65 6c 3b 20 20  iPartIdxLabel;  
17f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
17f80 6d 70 20 74 6f 20 74 68 69 73 20 6c 61 62 65 6c  mp to this label
17f90 20 74 6f 20 73 6b 69 70 20 61 20 72 6f 77 20 2a   to skip a row *
17fa0 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
17fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fc0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
17fd0 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69  ode into this vi
17fe0 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f  rtual machine */
17ff0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
18000 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18010 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72    /* KeyInfo for
18020 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
18030 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20  regRecord;      
18040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18050 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61  gister holding a
18060 73 73 65 6d 62 6c 65 64 20 69 6e 64 65 78 20 72  ssembled index r
18070 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ecord */.  sqlit
18080 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
18090 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  >db;      /* The
180a0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
180b0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  tion */.  int iD
180c0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
180d0 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  aToIndex(db, pIn
180e0 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  dex->pSchema);..
180f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18100 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
18110 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  N.  if( sqlite3A
18120 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
18130 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c   SQLITE_REINDEX,
18140 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
18150 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  0,.      db->aDb
18160 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 29  [iDb].zDbSName )
18170 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
18180 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
18190 20 52 65 71 75 69 72 65 20 61 20 77 72 69 74 65   Require a write
181a0 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62  -lock on the tab
181b0 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  le to perform th
181c0 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  is operation */.
181d0 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
181e0 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
181f0 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70  pTab->tnum, 1, p
18200 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
18210 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
18220 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
18230 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
18240 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61  .  if( memRootPa
18250 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75  ge>=0 ){.    tnu
18260 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b  m = memRootPage;
18270 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e  .  }else{.    tn
18280 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75  um = pIndex->tnu
18290 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20  m;.  }.  pKey = 
182a0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
182b0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
182c0 6e 64 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  ndex);.  assert(
182d0 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e   pKey!=0 || db->
182e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
182f0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a  pParse->nErr );.
18300 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73  .  /* Open the s
18310 6f 72 74 65 72 20 63 75 72 73 6f 72 20 69 66 20  orter cursor if 
18320 77 65 20 61 72 65 20 74 6f 20 75 73 65 20 6f 6e  we are to use on
18330 65 2e 20 2a 2f 0a 20 20 69 53 6f 72 74 65 72 20  e. */.  iSorter 
18340 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
18350 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
18360 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp4(v, OP_Sort
18370 65 72 4f 70 65 6e 2c 20 69 53 6f 72 74 65 72 2c  erOpen, iSorter,
18380 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79   0, pIndex->nKey
18390 43 6f 6c 2c 20 28 63 68 61 72 2a 29 0a 20 20 20  Col, (char*).   
183a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183b0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52   sqlite3KeyInfoR
183c0 65 66 28 70 4b 65 79 29 2c 20 50 34 5f 4b 45 59  ef(pKey), P4_KEY
183d0 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  INFO);..  /* Ope
183e0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f  n the table. Loo
183f0 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f  p through all ro
18400 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c  ws of the table,
18410 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 64 65 78   inserting index
18420 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e  .  ** records in
18430 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a  to the sorter. *
18440 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  /.  sqlite3OpenT
18450 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61  able(pParse, iTa
18460 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  b, iDb, pTab, OP
18470 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64  _OpenRead);.  ad
18480 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
18490 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
184a0 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 20  wind, iTab, 0); 
184b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
184c0 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
184d0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
184e0 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
184f0 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 70 50  te3MultiWrite(pP
18500 61 72 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65  arse);..  sqlite
18510 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
18520 79 28 70 50 61 72 73 65 2c 70 49 6e 64 65 78 2c  y(pParse,pIndex,
18530 69 54 61 62 2c 72 65 67 52 65 63 6f 72 64 2c 30  iTab,regRecord,0
18540 2c 26 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c  ,&iPartIdxLabel,
18550 30 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  0,0);.  sqlite3V
18560 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18570 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53  SorterInsert, iS
18580 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64  orter, regRecord
18590 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f  );.  sqlite3Reso
185a0 6c 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28  lvePartIdxLabel(
185b0 70 50 61 72 73 65 2c 20 69 50 61 72 74 49 64 78  pParse, iPartIdx
185c0 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  Label);.  sqlite
185d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
185e0 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
185f0 64 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65  dr1+1); VdbeCove
18600 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
18610 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
18620 2c 20 61 64 64 72 31 29 3b 0a 20 20 69 66 28 20  , addr1);.  if( 
18630 6d 65 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29 20  memRootPage<0 ) 
18640 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18650 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74  2(v, OP_Clear, t
18660 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c  num, iDb);.  sql
18670 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
18680 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
18690 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c  iIdx, tnum, iDb,
186a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
186b0 20 20 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b        (char *)pK
186c0 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  ey, P4_KEYINFO);
186d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
186e0 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
186f0 5f 42 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f  _BULKCSR|((memRo
18700 6f 74 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41  otPage>=0)?OPFLA
18710 47 5f 50 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a  G_P2ISREG:0));..
18720 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
18730 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18740 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 53  P_SorterSort, iS
18750 6f 72 74 65 72 2c 20 30 29 3b 20 56 64 62 65 43  orter, 0); VdbeC
18760 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66  overage(v);.  if
18770 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  ( IsUniqueIndex(
18780 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69  pIndex) ){.    i
18790 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56  nt j2 = sqlite3V
187a0 64 62 65 47 6f 74 6f 28 76 2c 20 31 29 3b 0a 20  dbeGoto(v, 1);. 
187b0 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
187c0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
187d0 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
187e0 33 56 64 62 65 56 65 72 69 66 79 41 62 6f 72 74  3VdbeVerifyAbort
187f0 61 62 6c 65 28 76 2c 20 4f 45 5f 41 62 6f 72 74  able(v, OE_Abort
18800 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
18810 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
18820 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c  P_SorterCompare,
18830 20 69 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65   iSorter, j2, re
18840 67 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20  gRecord,.       
18850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18860 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f    pIndex->nKeyCo
18870 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
18880 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
18890 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74  UniqueConstraint
188a0 28 70 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72  (pParse, OE_Abor
188b0 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  t, pIndex);.    
188c0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
188d0 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 7d 65  ere(v, j2);.  }e
188e0 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 32 20 3d  lse{.    addr2 =
188f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
18900 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a  entAddr(v);.  }.
18910 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18920 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op3(v, OP_Sorter
18930 44 61 74 61 2c 20 69 53 6f 72 74 65 72 2c 20 72  Data, iSorter, r
18940 65 67 52 65 63 6f 72 64 2c 20 69 49 64 78 29 3b  egRecord, iIdx);
18950 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
18960 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 65 6b 45  dOp1(v, OP_SeekE
18970 6e 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c  nd, iIdx);.  sql
18980 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18990 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
189a0 69 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29  iIdx, regRecord)
189b0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
189c0 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
189d0 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
189e0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
189f0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
18a00 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
18a10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18a20 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65  2(v, OP_SorterNe
18a30 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64  xt, iSorter, add
18a40 72 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  r2); VdbeCoverag
18a50 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
18a60 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
18a70 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65  ddr1);..  sqlite
18a80 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
18a90 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a  P_Close, iTab);.
18aa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18ab0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
18ac0 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65   iIdx);.  sqlite
18ad0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
18ae0 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72  P_Close, iSorter
18af0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  );.}../*.** Allo
18b00 63 61 74 65 20 68 65 61 70 20 73 70 61 63 65 20  cate heap space 
18b10 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78  to hold an Index
18b20 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 43 6f   object with nCo
18b30 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a  l columns..**.**
18b40 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   Increase the al
18b50 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f  location size to
18b60 20 70 72 6f 76 69 64 65 20 61 6e 20 65 78 74 72   provide an extr
18b70 61 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a  a nExtra bytes.*
18b80 2a 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67  * of 8-byte alig
18b90 6e 65 64 20 73 70 61 63 65 20 61 66 74 65 72 20  ned space after 
18ba0 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
18bb0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a   and return a.**
18bc0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
18bd0 20 65 78 74 72 61 20 73 70 61 63 65 20 69 6e 20   extra space in 
18be0 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64  *ppExtra..*/.Ind
18bf0 65 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63  ex *sqlite3Alloc
18c00 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a  ateIndexObject(.
18c10 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
18c20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
18c30 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
18c40 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20  .  i16 nCol,    
18c50 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
18c60 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
18c70 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
18c80 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
18c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
18ca0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
18cb0 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 61  extra space to a
18cc0 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
18cd0 2a 70 70 45 78 74 72 61 20 20 20 20 20 20 20 2f  *ppExtra       /
18ce0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
18cf0 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20 2a   "extra" space *
18d00 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b  /.){.  Index *p;
18d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
18d20 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20 6f  llocated index o
18d30 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  bject */.  int n
18d40 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
18d50 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
18d60 65 20 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65  e for Index obje
18d70 63 74 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a  ct + arrays */..
18d80 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
18d90 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 20  (sizeof(Index)) 
18da0 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  +              /
18db0 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  * Index structur
18dc0 65 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e  */.          
18dd0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68  ROUND8(sizeof(ch
18de0 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20  ar*)*nCol) +    
18df0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a       /* Index.az
18e00 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20  Coll     */.    
18e10 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a        ROUND8(siz
18e20 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f  eof(LogEst)*(nCo
18e30 6c 2b 31 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e  l+1) +     /* In
18e40 64 65 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20  dex.aiRowLogEst 
18e50 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
18e60 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 31 36        sizeof(i16
18e70 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20  )*nCol +        
18e80 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43      /* Index.aiC
18e90 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20  olumn   */.     
18ea0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
18eb0 6f 66 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20  of(u8)*nCol);   
18ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
18ed0 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f  ex.aSortOrder */
18ee0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
18ef0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
18f00 42 79 74 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a  Byte + nExtra);.
18f10 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
18f20 68 61 72 20 2a 70 45 78 74 72 61 20 3d 20 28 28  har *pExtra = ((
18f30 63 68 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28  char*)p)+ROUND8(
18f40 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a  sizeof(Index));.
18f50 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20      p->azColl = 
18f60 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 70 45  (const char**)pE
18f70 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20  xtra; pExtra += 
18f80 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68  ROUND8(sizeof(ch
18f90 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20  ar*)*nCol);.    
18fa0 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d  p->aiRowLogEst =
18fb0 20 28 4c 6f 67 45 73 74 2a 29 70 45 78 74 72 61   (LogEst*)pExtra
18fc0 3b 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65  ; pExtra += size
18fd0 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c  of(LogEst)*(nCol
18fe0 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f  +1);.    p->aiCo
18ff0 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45 78  lumn = (i16*)pEx
19000 74 72 61 3b 20 20 20 20 20 20 20 70 45 78 74 72  tra;       pExtr
19010 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29  a += sizeof(i16)
19020 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53  *nCol;.    p->aS
19030 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
19040 70 45 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e  pExtra;.    p->n
19050 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20  Column = nCol;. 
19060 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20     p->nKeyCol = 
19070 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70  nCol - 1;.    *p
19080 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a  pExtra = ((char*
19090 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d  )p) + nByte;.  }
190a0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
190b0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
190c0 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  ew index for an 
190d0 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d  SQL table.  pNam
190e0 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65  e1.pName2 is the
190f0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
19100 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c  ex .** and pTblL
19110 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ist is the name 
19120 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
19130 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
19140 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
19150 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
19160 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
19170 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
19180 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69   created to sati
19190 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20  sfy a.** UNIQUE 
191a0 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20  constraint.  If 
191b0 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65  pTable and pInde
191c0 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20  x are NULL, use 
191d0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
191e0 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  e.** as the tabl
191f0 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
19200 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
19210 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74  ble is a table t
19220 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  hat is.** curren
19230 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
19240 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54  ucted by a CREAT
19250 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
19260 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  t..**.** pList i
19270 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
19280 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
19290 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
192a0 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a  e NULL if this.*
192b0 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b  * is a primary k
192c0 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e  ey or unique-con
192d0 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d  straint on the m
192e0 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d  ost recent colum
192f0 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
19300 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
19310 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
19320 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20  tion.  .*/.void 
19330 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
19340 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
19350 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20  rse,     /* All 
19360 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
19370 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a  t this parse */.
19380 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
19390 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
193a0 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
193b0 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
193c0 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
193d0 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  ,     /* Second 
193e0 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
193f0 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
19400 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
19410 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65  blName, /* Table
19420 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70   to index. Use p
19430 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
19440 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c   if 0 */.  ExprL
19450 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
19460 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   A list of colum
19470 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
19480 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
19490 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41  r,       /* OE_A
194a0 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
194b0 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
194c0 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b  OE_None */.  Tok
194d0 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20  en *pStart,     
194e0 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
194f0 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
19500 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a  this statement *
19510 2f 0a 20 20 45 78 70 72 20 2a 70 50 49 57 68 65  /.  Expr *pPIWhe
19520 72 65 2c 20 20 20 20 2f 2a 20 57 48 45 52 45 20  re,    /* WHERE 
19530 63 6c 61 75 73 65 20 66 6f 72 20 70 61 72 74 69  clause for parti
19540 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  al indices */.  
19550 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20  int sortOrder,  
19560 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72     /* Sort order
19570 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20   of primary key 
19580 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c  when pList==NULL
19590 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45   */.  int ifNotE
195a0 78 69 73 74 2c 20 20 20 20 2f 2a 20 4f 6d 69 74  xist,    /* Omit
195b0 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20   error if index 
195c0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
195d0 2f 0a 20 20 75 38 20 69 64 78 54 79 70 65 20 20  /.  u8 idxType  
195e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
195f0 64 65 78 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  dex type */.){. 
19600 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
19610 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  ;     /* Table t
19620 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
19630 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
19640 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e  = 0;   /* The in
19650 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65  dex to be create
19660 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  d */.  char *zNa
19670 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  me = 0;     /* N
19680 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
19690 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
196a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
196b0 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
196c0 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20  rs in zName */. 
196d0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 44 62 46   int i, j;.  DbF
196e0 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 20 20  ixer sFix;      
196f0 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69    /* For assigni
19700 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ng database name
19710 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20  s to pTable */. 
19720 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61   int sortOrderMa
19730 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f  sk;   /* 1 to ho
19740 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65  nor DESC in inde
19750 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e  x.  0 to ignore.
19760 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
19770 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
19780 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
19790 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
197a0 65 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e  ecific table con
197b0 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65  taining the inde
197c0 78 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  xed database */.
197d0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
197e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
197f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19800 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72  that is being wr
19810 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  itten */.  Token
19820 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *pName = 0;    
19830 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
19840 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
19850 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20   to create */.  
19860 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
19870 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b  item *pListItem;
19880 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
19890 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20  over pList */.  
198a0 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20  int nExtra = 0; 
198b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198c0 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61   /* Space alloca
198d0 74 65 64 20 66 6f 72 20 7a 45 78 74 72 61 5b 5d  ted for zExtra[]
198e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
198f0 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
19900 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19910 20 6f 66 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e   of extra column
19920 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 63 68  s needed */.  ch
19930 61 72 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b 20  ar *zExtra = 0; 
19940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19950 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 61 66  * Extra space af
19960 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62  ter the Index ob
19970 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ject */.  Index 
19980 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f  *pPk = 0;      /
19990 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  * PRIMARY KEY in
199a0 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20  dex for WITHOUT 
199b0 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a  ROWID tables */.
199c0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
199d0 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
199e0 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20  e->nErr>0 ){.   
199f0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
19a00 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  e_index;.  }.  i
19a10 66 28 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  f( IN_DECLARE_VT
19a20 41 42 20 26 26 20 69 64 78 54 79 70 65 21 3d 53  AB && idxType!=S
19a30 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52  QLITE_IDXTYPE_PR
19a40 49 4d 41 52 59 4b 45 59 20 29 7b 0a 20 20 20 20  IMARYKEY ){.    
19a50 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19a60 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
19a70 28 20 21 49 73 52 65 75 73 65 53 63 68 65 6d 61  ( !IsReuseSchema
19a80 28 64 62 29 20 26 26 20 53 51 4c 49 54 45 5f 4f  (db) && SQLITE_O
19a90 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
19aa0 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
19ab0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
19ac0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
19ad0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
19ae0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
19af0 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
19b00 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69    Return early i
19b10 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  f not found..  *
19b20 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65  /.  if( pTblName
19b30 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55  !=0 ){..    /* U
19b40 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20  se the two-part 
19b50 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65  index name to de
19b60 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61  termine the data
19b70 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20  base .    ** to 
19b80 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74  search for the t
19b90 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20  able. 'Fix' the 
19ba0 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
19bb0 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66  is db.    ** bef
19bc0 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74  ore looking up t
19bd0 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  he table..    */
19be0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
19bf0 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b  me1 && pName2 );
19c00 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
19c10 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
19c20 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
19c30 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
19c40 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67     if( iDb<0 ) g
19c50 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19c60 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72  index;.    asser
19c70 74 28 20 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d  t( pName && pNam
19c80 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66  e->z );..#ifndef
19c90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d   SQLITE_OMIT_TEM
19ca0 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  PDB.    /* If th
19cb0 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73  e index name was
19cc0 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68   unqualified, ch
19cd0 65 63 6b 20 69 66 20 74 68 65 20 74 61 62 6c 65  eck if the table
19ce0 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d  .    ** is a tem
19cf0 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20  p table. If so, 
19d00 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
19d10 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f   to 1. Do not do
19d20 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20   this.    ** if 
19d30 69 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64  initialising a d
19d40 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
19d50 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
19d60 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
19d70 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71  .      pTab = sq
19d80 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b  lite3SrcListLook
19d90 75 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e  up(pParse, pTblN
19da0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
19db0 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20  pName2->n==0 && 
19dc0 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53  pTab && pTab->pS
19dd0 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
19de0 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ].pSchema ){.   
19df0 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20       iDb = 1;.  
19e00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
19e10 69 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46  if..    sqlite3F
19e20 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50  ixInit(&sFix, pP
19e30 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65  arse, iDb, "inde
19e40 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  x", pName);.    
19e50 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 72  if( sqlite3FixSr
19e60 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 62  cList(&sFix, pTb
19e70 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  lName) ){.      
19e80 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 70  /* Because the p
19e90 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73  arser constructs
19ea0 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61   pTblName from a
19eb0 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69   single identifi
19ec0 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  er,.      ** sql
19ed0 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 20 63  ite3FixSrcList c
19ee0 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a  an never fail. *
19ef0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30  /.      assert(0
19f00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  );.    }.    pTa
19f10 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
19f20 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
19f30 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d  e, 0, &pTblName-
19f40 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65  >a[0]);.    asse
19f50 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
19f60 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d  iled==0 || pTab=
19f70 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  =0 );.    if( pT
19f80 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  ab==0 ) goto exi
19f90 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19fa0 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 26      if( iDb==1 &
19fb0 26 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  & db->aDb[iDb].p
19fc0 53 63 68 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53  Schema!=pTab->pS
19fd0 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73  chema ){.      s
19fe0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
19ff0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
1a000 20 20 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74     "cannot creat
1a010 65 20 61 20 54 45 4d 50 20 69 6e 64 65 78 20 6f  e a TEMP index o
1a020 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65  n non-TEMP table
1a030 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20   \"%s\"",.      
1a040 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
1a050 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  );.      goto ex
1a060 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1a070 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
1a080 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
1a090 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72   pPk = sqlite3Pr
1a0a0 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
1a0b0 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ab);.  }else{.  
1a0c0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d    assert( pName=
1a0d0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1a0e0 28 20 70 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20  ( pStart==0 );. 
1a0f0 20 20 20 70 54 61 62 20 3d 20 70 50 61 72 73 65     pTab = pParse
1a100 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20  ->pNewTable;.   
1a110 20 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74   if( !pTab ) got
1a120 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1a130 64 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  dex;.    iDb = s
1a140 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
1a150 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
1a160 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44  chema);.  }.  pD
1a170 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
1a180 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  ];..  assert( pT
1a190 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ab!=0 );.  asser
1a1a0 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
1a1b0 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  =0 );.  if( sqli
1a1c0 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62  te3StrNICmp(pTab
1a1d0 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  ->zName, "sqlite
1a1e0 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 20  _", 7)==0 .     
1a1f0 20 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75    && db->init.bu
1a200 73 79 3d 3d 30 0a 23 69 66 20 53 51 4c 49 54 45  sy==0.#if SQLITE
1a210 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
1a220 54 49 4f 4e 0a 20 20 20 20 20 20 20 26 26 20 73  TION.       && s
1a230 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61  qlite3UserAuthTa
1a240 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  ble(pTab->zName)
1a250 3d 3d 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ==0.#endif.#ifde
1a260 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 53  f SQLITE_ALLOW_S
1a270 51 4c 49 54 45 5f 4d 41 53 54 45 52 5f 49 4e 44  QLITE_MASTER_IND
1a280 45 58 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  EX.       && sql
1a290 69 74 65 33 53 74 72 49 43 6d 70 28 26 70 54 61  ite3StrICmp(&pTa
1a2a0 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 6d 61 73  b->zName[7],"mas
1a2b0 74 65 72 22 29 21 3d 30 0a 23 65 6e 64 69 66 0a  ter")!=0.#endif.
1a2c0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1a2d0 33 53 74 72 4e 49 43 6d 70 28 26 70 54 61 62 2d  3StrNICmp(&pTab-
1a2e0 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72  >zName[7],"alter
1a2f0 74 61 62 5f 22 2c 39 29 21 3d 30 0a 20 29 7b 0a  tab_",9)!=0. ){.
1a300 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1a310 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
1a320 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
1a330 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d   indexed", pTab-
1a340 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
1a350 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1a360 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  dex;.  }.#ifndef
1a370 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
1a380 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53  W.  if( pTab->pS
1a390 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
1a3a0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1a3b0 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20  rse, "views may 
1a3c0 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
1a3d0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
1a3e0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1a3f0 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  }.#endif.#ifndef
1a400 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1a410 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
1a420 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
1a430 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1a440 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1a450 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d  virtual tables m
1a460 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
1a470 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
1a480 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1a490 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1a4a0 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
1a4b0 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
1a4c0 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  x.  Make sure th
1a4d0 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ere is not alrea
1a4e0 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20  dy another.  ** 
1a4f0 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77  index or table w
1a500 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
1a510 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  e.  .  **.  ** E
1a520 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65  xception:  If we
1a530 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
1a540 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e   names of perman
1a550 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d  ent indices from
1a560 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
1a570 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62  _master table (b
1a580 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65  ecause some othe
1a590 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65  r process change
1a5a0 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e  d the schema) an
1a5b0 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  d.  ** one of th
1a5c0 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f  e index names co
1a5d0 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20  llides with the 
1a5e0 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72  name of a tempor
1a5f0 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a  ary table or.  *
1a600 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65  * index, then we
1a610 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74   will continue t
1a620 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69  o process this i
1a630 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
1a640 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  If pName==0 it m
1a650 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65  eans that we are
1a660 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69  .  ** dealing wi
1a670 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  th a primary key
1a680 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
1a690 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20  raint.  We have 
1a6a0 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20  to invent our.  
1a6b0 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a  ** own name..  *
1a6c0 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  /.  if( pName ){
1a6d0 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
1a6e0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1a6f0 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
1a700 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
1a710 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1a720 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73  e_index;.    ass
1a730 65 72 74 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30  ert( pName->z!=0
1a740 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   );.    if( SQLI
1a750 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
1a760 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
1a770 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
1a780 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1a790 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1a7a0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 49 4e 5f    }.    if( !IN_
1a7b0 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
1a7c0 0a 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e  .      if( !db->
1a7d0 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
1a7e0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1a7f0 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
1a800 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20  ame, 0)!=0 ){.  
1a810 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a820 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1a830 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
1a840 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  y a table named 
1a850 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
1a860 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
1a870 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1a880 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1a890 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1a8a0 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
1a8b0 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 44 62 53  zName, pDb->zDbS
1a8c0 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
1a8d0 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78      if( !ifNotEx
1a8e0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
1a8f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1a900 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
1a910 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %s already exist
1a920 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
1a930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a940 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62       assert( !db
1a950 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
1a960 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1a970 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
1a980 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
1a990 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a9a0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1a9b0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
1a9c0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1a9d0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49      int n;.    I
1a9e0 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20  ndex *pLoop;.   
1a9f0 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d   for(pLoop=pTab-
1aa00 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c  >pIndex, n=1; pL
1aa10 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
1aa20 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a  ->pNext, n++){}.
1aa30 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
1aa40 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1aa50 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78  sqlite_autoindex
1aa60 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a  _%s_%d", pTab->z
1aa70 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66  Name, n);.    if
1aa80 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
1aa90 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1aaa0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1aab0 7d 0a 0a 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61  }..    /* Automa
1aac0 74 69 63 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  tic index names 
1aad0 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 77  generated from w
1aae0 69 74 68 69 6e 20 73 71 6c 69 74 65 33 5f 64 65  ithin sqlite3_de
1aaf0 63 6c 61 72 65 5f 76 74 61 62 28 29 0a 20 20 20  clare_vtab().   
1ab00 20 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 6e 61   ** must have na
1ab10 6d 65 73 20 74 68 61 74 20 61 72 65 20 64 69 73  mes that are dis
1ab20 74 69 6e 63 74 20 66 72 6f 6d 20 6e 6f 72 6d 61  tinct from norma
1ab30 6c 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  l automatic inde
1ab40 78 20 6e 61 6d 65 73 2e 0a 20 20 20 20 2a 2a 20  x names..    ** 
1ab50 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  The following st
1ab60 61 74 65 6d 65 6e 74 20 63 6f 6e 76 65 72 74 73  atement converts
1ab70 20 22 73 71 6c 69 74 65 33 5f 61 75 74 6f 69 6e   "sqlite3_autoin
1ab80 64 65 78 2e 2e 2e 22 20 69 6e 74 6f 0a 20 20 20  dex..." into.   
1ab90 20 2a 2a 20 22 73 71 6c 69 74 65 33 5f 62 75 74   ** "sqlite3_but
1aba0 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e 20 6f 72  oindex..." in or
1abb0 64 65 72 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  der to make the 
1abc0 6e 61 6d 65 73 20 64 69 73 74 69 6e 63 74 2e 0a  names distinct..
1abd0 20 20 20 20 2a 2a 20 54 68 65 20 22 76 74 61 62      ** The "vtab
1abe0 5f 65 72 72 2e 74 65 73 74 22 20 74 65 73 74 20  _err.test" test 
1abf0 64 65 6d 6f 6e 73 74 72 61 74 65 73 20 74 68 65  demonstrates the
1ac00 20 6e 65 65 64 20 6f 66 20 74 68 69 73 20 73 74   need of this st
1ac10 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20  atement. */.    
1ac20 69 66 28 20 49 4e 5f 53 50 45 43 49 41 4c 5f 50  if( IN_SPECIAL_P
1ac30 41 52 53 45 20 29 20 7a 4e 61 6d 65 5b 37 5d 2b  ARSE ) zName[7]+
1ac40 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  +;.  }..  /* Che
1ac50 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61  ck for authoriza
1ac60 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61  tion to create a
1ac70 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69  n index..  */.#i
1ac80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ac90 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
1aca0 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45    if( !IN_RENAME
1acb0 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 63  _OBJECT ){.    c
1acc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
1acd0 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 3b 0a   pDb->zDbSName;.
1ace0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
1acf0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1ad00 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
1ad10 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
1ad20 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  ), 0, zDb) ){.  
1ad30 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1ad40 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1ad50 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45  }.    i = SQLITE
1ad60 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20  _CREATE_INDEX;. 
1ad70 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
1ad80 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20  PDB && iDb==1 ) 
1ad90 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
1ada0 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  E_TEMP_INDEX;.  
1adb0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1adc0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69  hCheck(pParse, i
1add0 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  , zName, pTab->z
1ade0 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
1adf0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1ae00 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1ae10 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1ae20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
1ae30 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
1ae40 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
1ae50 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
1ae60 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
1ae70 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
1ae80 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
1ae90 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
1aea0 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
1aeb0 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
1aec0 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
1aed0 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
1aee0 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
1aef0 20 20 54 6f 6b 65 6e 20 70 72 65 76 43 6f 6c 3b    Token prevCol;
1af00 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  .    Column *pCo
1af10 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  l = &pTab->aCol[
1af20 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20  pTab->nCol-1];. 
1af30 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67     pCol->colFlag
1af40 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 55 4e 49  s |= COLFLAG_UNI
1af50 51 55 45 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  QUE;.    sqlite3
1af60 54 6f 6b 65 6e 49 6e 69 74 28 26 70 72 65 76 43  TokenInit(&prevC
1af70 6f 6c 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  ol, pCol->zName)
1af80 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
1af90 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
1afa0 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 0a 20  end(pParse, 0,. 
1afb0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1afc0 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
1afd0 2c 20 54 4b 5f 49 44 2c 20 26 70 72 65 76 43 6f  , TK_ID, &prevCo
1afe0 6c 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20  l, 0));.    if( 
1aff0 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
1b000 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1b010 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
1b020 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  List->nExpr==1 )
1b030 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1b040 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65  rListSetSortOrde
1b050 72 28 70 4c 69 73 74 2c 20 73 6f 72 74 4f 72 64  r(pList, sortOrd
1b060 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
1b070 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
1b080 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61  tCheckLength(pPa
1b090 72 73 65 2c 20 70 4c 69 73 74 2c 20 22 69 6e 64  rse, pList, "ind
1b0a0 65 78 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ex");.  }..  /* 
1b0b0 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
1b0c0 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70 61  any bytes of spa
1b0d0 63 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ce are required 
1b0e0 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69  to store explici
1b0f0 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69  tly.  ** specifi
1b100 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
1b110 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  uence names..  *
1b120 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
1b130 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1b140 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
1b150 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
1b160 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  .pExpr;.    asse
1b170 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a  rt( pExpr!=0 );.
1b180 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
1b190 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b  p==TK_COLLATE ){
1b1a0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d  .      nExtra +=
1b1b0 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74 72   (1 + sqlite3Str
1b1c0 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a  len30(pExpr->u.z
1b1d0 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20  Token));.    }. 
1b1e0 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41   }..  /* .  ** A
1b1f0 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
1b200 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20  x structure. .  
1b210 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  */.  nName = sql
1b220 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
1b230 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c  me);.  nExtraCol
1b240 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b   = pPk ? pPk->nK
1b250 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70 49 6e  eyCol : 1;.  pIn
1b260 64 65 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c  dex = sqlite3All
1b270 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74  ocateIndexObject
1b280 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70  (db, pList->nExp
1b290 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20  r + nExtraCol,. 
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2c0 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78       nName + nEx
1b2d0 74 72 61 20 2b 20 31 2c 20 26 7a 45 78 74 72 61  tra + 1, &zExtra
1b2e0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
1b2f0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1b300 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1b310 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61  e_index;.  }.  a
1b320 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
1b330 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64  E_ALIGNMENT(pInd
1b340 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 29  ex->aiRowLogEst)
1b350 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
1b360 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
1b370 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  NT(pIndex->azCol
1b380 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  l) );.  pIndex->
1b390 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a  zName = zExtra;.
1b3a0 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d    zExtra += nNam
1b3b0 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28  e + 1;.  memcpy(
1b3c0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  pIndex->zName, z
1b3d0 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a  Name, nName+1);.
1b3e0 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
1b3f0 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65   = pTab;.  pInde
1b400 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38  x->onError = (u8
1b410 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64  )onError;.  pInd
1b420 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  ex->uniqNotNull 
1b430 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  = onError!=OE_No
1b440 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 64  ne;.  pIndex->id
1b450 78 54 79 70 65 20 3d 20 69 64 78 54 79 70 65 3b  xType = idxType;
1b460 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  .  pIndex->pSche
1b470 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
1b480 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e  ].pSchema;.  pIn
1b490 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70  dex->nKeyCol = p
1b4a0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
1b4b0 66 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20  f( pPIWhere ){. 
1b4c0 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
1b4d0 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70  eSelfReference(p
1b4e0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f  Parse, pTab, NC_
1b4f0 50 61 72 74 49 64 78 2c 20 70 50 49 57 68 65 72  PartIdx, pPIWher
1b500 65 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65  e, 0);.    pInde
1b510 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
1b520 20 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20   = pPIWhere;.   
1b530 20 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20   pPIWhere = 0;. 
1b540 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
1b550 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
1b560 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
1b570 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
1b580 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75  o see if we shou
1b590 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65  ld honor DESC re
1b5a0 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20  quests on index 
1b5b0 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
1b5c0 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
1b5d0 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
1b5e0 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  ){.    sortOrder
1b5f0 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20  Mask = -1;   /* 
1b600 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20  Honor DESC */.  
1b610 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f  }else{.    sortO
1b620 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20  rderMask = 0;   
1b630 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20   /* Ignore DESC 
1b640 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61  */.  }..  /* Ana
1b650 6c 79 7a 65 20 74 68 65 20 6c 69 73 74 20 6f 66  lyze the list of
1b660 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1b670 74 20 66 6f 72 6d 20 74 68 65 20 74 65 72 6d 73  t form the terms
1b680 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e   of the index an
1b690 64 0a 20 20 2a 2a 20 72 65 70 6f 72 74 20 61 6e  d.  ** report an
1b6a0 79 20 65 72 72 6f 72 73 2e 20 20 49 6e 20 74 68  y errors.  In th
1b6b0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
1b6c0 65 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ere the expressi
1b6d0 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 0a 20 20  on is exactly.  
1b6e0 2a 2a 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d  ** a table colum
1b6f0 6e 2c 20 73 74 6f 72 65 20 74 68 61 74 20 63 6f  n, store that co
1b700 6c 75 6d 6e 20 69 6e 20 61 69 43 6f 6c 75 6d 6e  lumn in aiColumn
1b710 5b 5d 2e 20 20 46 6f 72 20 67 65 6e 65 72 61 6c  [].  For general
1b720 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 20 20   expressions,.  
1b730 2a 2a 20 70 6f 70 75 6c 61 74 65 20 70 49 6e 64  ** populate pInd
1b740 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 61 6e 64  ex->aColExpr and
1b750 20 73 74 6f 72 65 20 58 4e 5f 45 58 50 52 20 28   store XN_EXPR (
1b760 2d 32 29 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b  -2) in aiColumn[
1b770 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  ]..  **.  ** TOD
1b780 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e 69  O: Issue a warni
1b790 6e 67 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ng if two or mor
1b7a0 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
1b7b0 20 69 6e 64 65 78 20 61 72 65 20 69 64 65 6e 74   index are ident
1b7c0 69 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f 44 4f 3a  ical..  ** TODO:
1b7d0 20 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67   Issue a warning
1b7e0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 70 72   if the table pr
1b7f0 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73 65  imary key is use
1b800 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
1b810 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6b 65 79 2e  .  ** index key.
1b820 0a 20 20 2a 2f 0a 20 20 70 4c 69 73 74 49 74 65  .  */.  pListIte
1b830 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20  m = pList->a;.  
1b840 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
1b850 4a 45 43 54 20 29 7b 0a 20 20 20 20 70 49 6e 64  JECT ){.    pInd
1b860 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70  ex->aColExpr = p
1b870 4c 69 73 74 3b 0a 20 20 20 20 70 4c 69 73 74 20  List;.    pList 
1b880 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  = 0;.  }.  for(i
1b890 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 4b  =0; i<pIndex->nK
1b8a0 65 79 43 6f 6c 3b 20 69 2b 2b 2c 20 70 4c 69 73  eyCol; i++, pLis
1b8b0 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  tItem++){.    Ex
1b8c0 70 72 20 2a 70 43 45 78 70 72 3b 20 20 20 20 20  pr *pCExpr;     
1b8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b8e0 54 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20 65  The i-th index e
1b8f0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
1b900 20 69 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f   int requestedSo
1b910 72 74 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20  rtOrder;        
1b920 2f 2a 20 41 53 43 20 6f 72 20 44 45 53 43 20 6f  /* ASC or DESC o
1b930 6e 20 74 68 65 20 69 2d 74 68 20 65 78 70 72 65  n the i-th expre
1b940 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e  ssion */.    con
1b950 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20  st char *zColl; 
1b960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1b970 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1b980 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 73  e name */..    s
1b990 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64  qlite3StringToId
1b9a0 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70  (pListItem->pExp
1b9b0 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  r);.    sqlite3R
1b9c0 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65  esolveSelfRefere
1b9d0 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  nce(pParse, pTab
1b9e0 2c 20 4e 43 5f 49 64 78 45 78 70 72 2c 20 70 4c  , NC_IdxExpr, pL
1b9f0 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  istItem->pExpr, 
1ba00 30 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72  0);.    if( pPar
1ba10 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
1ba20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1ba30 78 3b 0a 20 20 20 20 70 43 45 78 70 72 20 3d 20  x;.    pCExpr = 
1ba40 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
1ba50 6f 6c 6c 61 74 65 28 70 4c 69 73 74 49 74 65 6d  ollate(pListItem
1ba60 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ->pExpr);.    if
1ba70 28 20 70 43 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  ( pCExpr->op!=TK
1ba80 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
1ba90 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73   if( pTab==pPars
1baa0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a  e->pNewTable ){.
1bab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1bac0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1bad0 22 65 78 70 72 65 73 73 69 6f 6e 73 20 70 72 6f  "expressions pro
1bae0 68 69 62 69 74 65 64 20 69 6e 20 50 52 49 4d 41  hibited in PRIMA
1baf0 52 59 20 4b 45 59 20 61 6e 64 20 22 0a 20 20 20  RY KEY and ".   
1bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55 4e               "UN
1bb20 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73  IQUE constraints
1bb30 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ");.        goto
1bb40 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1bb50 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
1bb60 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 43    if( pIndex->aC
1bb70 6f 6c 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20  olExpr==0 ){.   
1bb80 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f       pIndex->aCo
1bb90 6c 45 78 70 72 20 3d 20 70 4c 69 73 74 3b 0a 20  lExpr = pList;. 
1bba0 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 30         pList = 0
1bbb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bbc0 6a 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20  j = XN_EXPR;.   
1bbd0 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
1bbe0 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 45 58 50 52  umn[i] = XN_EXPR
1bbf0 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  ;.      pIndex->
1bc00 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b  uniqNotNull = 0;
1bc10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bc20 20 20 6a 20 3d 20 70 43 45 78 70 72 2d 3e 69 43    j = pCExpr->iC
1bc30 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 61 73 73  olumn;.      ass
1bc40 65 72 74 28 20 6a 3c 3d 30 78 37 66 66 66 20 29  ert( j<=0x7fff )
1bc50 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 30 20  ;.      if( j<0 
1bc60 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70  ){.        j = p
1bc70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
1bc80 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
1bc90 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c  ->aCol[j].notNul
1bca0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
1bcb0 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e  pIndex->uniqNotN
1bcc0 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ull = 0;.      }
1bcd0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  .      pIndex->a
1bce0 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31  iColumn[i] = (i1
1bcf0 36 29 6a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  6)j;.    }.    z
1bd00 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  Coll = 0;.    if
1bd10 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  ( pListItem->pEx
1bd20 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pr->op==TK_COLLA
1bd30 54 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  TE ){.      int 
1bd40 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a 43 6f  nColl;.      zCo
1bd50 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e  ll = pListItem->
1bd60 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
1bd70 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73  .      nColl = s
1bd80 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1bd90 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20  Coll) + 1;.     
1bda0 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e   assert( nExtra>
1bdb0 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20  =nColl );.      
1bdc0 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a  memcpy(zExtra, z
1bdd0 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20  Coll, nColl);.  
1bde0 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74      zColl = zExt
1bdf0 72 61 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61  ra;.      zExtra
1be00 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20   += nColl;.     
1be10 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c   nExtra -= nColl
1be20 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1be30 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43  j>=0 ){.      zC
1be40 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  oll = pTab->aCol
1be50 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 7d  [j].zColl;.    }
1be60 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20  .    if( !zColl 
1be70 29 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ) zColl = sqlite
1be80 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20  3StrBINARY;.    
1be90 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
1bea0 73 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f  sy && !sqlite3Lo
1beb0 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
1bec0 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  se, zColl) ){.  
1bed0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1bee0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1bef0 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a  }.    pIndex->az
1bf00 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b  Coll[i] = zColl;
1bf10 0a 20 20 20 20 72 65 71 75 65 73 74 65 64 53 6f  .    requestedSo
1bf20 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49  rtOrder = pListI
1bf30 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26  tem->sortOrder &
1bf40 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a   sortOrderMask;.
1bf50 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72      pIndex->aSor
1bf60 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29  tOrder[i] = (u8)
1bf70 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
1bf80 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70  er;.  }..  /* Ap
1bf90 70 65 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6b  pend the table k
1bfa0 65 79 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ey to the end of
1bfb0 20 74 68 65 20 69 6e 64 65 78 2e 20 20 46 6f 72   the index.  For
1bfc0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20   WITHOUT ROWID. 
1bfd0 20 2a 2a 20 74 61 62 6c 65 73 20 28 77 68 65 6e   ** tables (when
1bfe0 20 70 50 6b 21 3d 30 29 20 74 68 69 73 20 77 69   pPk!=0) this wi
1bff0 6c 6c 20 62 65 20 74 68 65 20 64 65 63 6c 61 72  ll be the declar
1c000 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20  ed PRIMARY KEY. 
1c010 20 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c   For.  ** normal
1c020 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50   tables (when pP
1c030 6b 3d 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20  k==0) this will 
1c040 62 65 20 74 68 65 20 72 6f 77 69 64 2e 0a 20 20  be the rowid..  
1c050 2a 2f 0a 20 20 69 66 28 20 70 50 6b 20 29 7b 0a  */.  if( pPk ){.
1c060 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
1c070 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  Pk->nKeyCol; j++
1c080 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d  ){.      int x =
1c090 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a   pPk->aiColumn[j
1c0a0 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
1c0b0 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69   x>=0 );.      i
1c0c0 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49 6e  f( hasColumn(pIn
1c0d0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70  dex->aiColumn, p
1c0e0 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20  Index->nKeyCol, 
1c0f0 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  x) ){.        pI
1c100 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b  ndex->nColumn--;
1c110 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20   .      }else{. 
1c120 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
1c130 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a  iColumn[i] = x;.
1c140 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1c150 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d  azColl[i] = pPk-
1c160 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20  >azColl[j];.    
1c170 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72      pIndex->aSor
1c180 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 50 6b 2d  tOrder[i] = pPk-
1c190 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a  >aSortOrder[j];.
1c1a0 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
1c1b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
1c1c0 73 73 65 72 74 28 20 69 3d 3d 70 49 6e 64 65 78  ssert( i==pIndex
1c1d0 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d  ->nColumn );.  }
1c1e0 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64 65 78  else{.    pIndex
1c1f0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
1c200 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 70 49  XN_ROWID;.    pI
1c210 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20  ndex->azColl[i] 
1c220 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  = sqlite3StrBINA
1c230 52 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  RY;.  }.  sqlite
1c240 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70  3DefaultRowEst(p
1c250 49 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 70 50  Index);.  if( pP
1c260 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
1c270 3d 30 20 29 20 65 73 74 69 6d 61 74 65 49 6e 64  =0 ) estimateInd
1c280 65 78 57 69 64 74 68 28 70 49 6e 64 65 78 29 3b  exWidth(pIndex);
1c290 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1c2a0 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73 20 65 76  ndex contains ev
1c2b0 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 74  ery column of it
1c2c0 73 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  s table, then ma
1c2d0 72 6b 0a 20 20 2a 2a 20 69 74 20 61 73 20 61 20  rk.  ** it as a 
1c2e0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a  covering index *
1c2f0 2f 0a 20 20 61 73 73 65 72 74 28 20 48 61 73 52  /.  assert( HasR
1c300 6f 77 69 64 28 70 54 61 62 29 20 0a 20 20 20 20  owid(pTab) .    
1c310 20 20 7c 7c 20 70 54 61 62 2d 3e 69 50 4b 65 79    || pTab->iPKey
1c320 3c 30 20 7c 7c 20 73 71 6c 69 74 65 33 43 6f 6c  <0 || sqlite3Col
1c330 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65  umnOfIndex(pInde
1c340 78 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79 29 3e  x, pTab->iPKey)>
1c350 3d 30 20 29 3b 0a 20 20 72 65 63 6f 6d 70 75 74  =0 );.  recomput
1c360 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65 78  eColumnsNotIndex
1c370 65 64 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66  ed(pIndex);.  if
1c380 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 26 26  ( pTblName!=0 &&
1c390 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
1c3a0 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  >=pTab->nCol ){.
1c3b0 20 20 20 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f      pIndex->isCo
1c3c0 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20  vering = 1;.    
1c3d0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
1c3e0 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
1c3f0 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e     if( j==pTab->
1c400 69 50 4b 65 79 20 29 20 63 6f 6e 74 69 6e 75 65  iPKey ) continue
1c410 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
1c420 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
1c430 28 70 49 6e 64 65 78 2c 6a 29 3e 3d 30 20 29 20  (pIndex,j)>=0 ) 
1c440 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1c450 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72 69  pIndex->isCoveri
1c460 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  ng = 0;.      br
1c470 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
1c480 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72    if( pTab==pPar
1c490 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b  se->pNewTable ){
1c4a0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  .    /* This rou
1c4b0 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61  tine has been ca
1c4c0 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
1c4d0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
1c4e0 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65  x as a.    ** re
1c4f0 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52  sult of a PRIMAR
1c500 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
1c510 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75  clause on a colu
1c520 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f  mn definition, o
1c530 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41  r.    ** a PRIMA
1c540 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
1c550 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e   clause followin
1c560 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66  g the column def
1c570 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  initions..    **
1c580 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20   i.e. one of:.  
1c590 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41    **.    ** CREA
1c5a0 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49  TE TABLE t(x PRI
1c5b0 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
1c5c0 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
1c5d0 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45  E t(x, y, UNIQUE
1c5e0 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a  (x, y));.    **.
1c5f0 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61      ** Either wa
1c600 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  y, check to see 
1c610 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  if the table alr
1c620 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e  eady has such an
1c630 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a   index. If.    *
1c640 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68  * so, don't both
1c650 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73  er creating this
1c660 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20   one. This only 
1c670 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a  applies to.    *
1c680 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
1c690 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e  created indices.
1c6a0 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73   Users can do as
1c6b0 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a   they wish with.
1c6c0 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20      ** explicit 
1c6d0 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a  indices..    **.
1c6e0 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55      ** Two UNIQU
1c6f0 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
1c700 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
1c710 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69   considered equi
1c720 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61  valent.    ** (a
1c730 6e 64 20 74 68 75 73 20 73 75 70 70 72 65 73 73  nd thus suppress
1c740 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  ing the second o
1c750 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68 65 79  ne) even if they
1c760 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
1c770 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65      ** sort orde
1c780 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rs..    **.    *
1c790 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
1c7a0 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69  ifferent collati
1c7b0 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20  ng sequences or 
1c7c0 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  if the columns o
1c7d0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e  f.    ** the con
1c7e0 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e  straint occur in
1c7f0 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
1c800 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73  s, then the cons
1c810 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20  traints are.    
1c820 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69  ** considered di
1c830 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20  stinct and both 
1c840 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61  result in separa
1c850 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  te indices..    
1c860 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
1c870 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
1c880 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
1c890 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
1c8a0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
1c8b0 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t k;.      asser
1c8c0 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  t( IsUniqueIndex
1c8d0 28 70 49 64 78 29 20 29 3b 0a 20 20 20 20 20 20  (pIdx) );.      
1c8e0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 64  assert( pIdx->id
1c8f0 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44  xType!=SQLITE_ID
1c900 58 54 59 50 45 5f 41 50 50 44 45 46 20 29 3b 0a  XTYPE_APPDEF );.
1c910 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73        assert( Is
1c920 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64  UniqueIndex(pInd
1c930 65 78 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  ex) );..      if
1c940 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21  ( pIdx->nKeyCol!
1c950 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c  =pIndex->nKeyCol
1c960 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1c970 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49     for(k=0; k<pI
1c980 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b  dx->nKeyCol; k++
1c990 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
1c9a0 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20   char *z1;.     
1c9b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1c9c0 32 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  2;.        asser
1c9d0 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  t( pIdx->aiColum
1c9e0 6e 5b 6b 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20  n[k]>=0 );.     
1c9f0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
1ca00 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78  olumn[k]!=pIndex
1ca10 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20  ->aiColumn[k] ) 
1ca20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a  break;.        z
1ca30 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  1 = pIdx->azColl
1ca40 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20  [k];.        z2 
1ca50 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
1ca60 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [k];.        if(
1ca70 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1ca80 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b  z1, z2) ) break;
1ca90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1caa0 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79  f( k==pIdx->nKey
1cab0 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Col ){.        i
1cac0 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
1cad0 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  !=pIndex->onErro
1cae0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
1caf0 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  * This constrain
1cb00 74 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61  t creates the sa
1cb10 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72  me index as a pr
1cb20 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20  evious.         
1cb30 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73   ** constraint s
1cb40 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65  pecified somewhe
1cb50 72 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  re in the CREATE
1cb60 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
1cb70 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48  ..          ** H
1cb80 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f  owever the ON CO
1cb90 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61  NFLICT clauses a
1cba0 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66  re different. If
1cbb0 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20   both this .    
1cbc0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61        ** constra
1cbd0 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76  int and the prev
1cbe0 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20  ious equivalent 
1cbf0 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20  constraint have 
1cc00 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20  explicit.       
1cc10 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43     ** ON CONFLIC
1cc20 54 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69  T clauses this i
1cc30 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65  s an error. Othe
1cc40 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20  rwise, use the. 
1cc50 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c           ** expl
1cc60 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64  icitly specified
1cc70 20 62 65 68 61 76 69 6f 72 20 66 6f 72 20 74 68   behavior for th
1cc80 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  e index..       
1cc90 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1cca0 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72  if( !(pIdx->onEr
1ccb0 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
1ccc0 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  || pIndex->onErr
1ccd0 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20  or==OE_Default) 
1cce0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1ccf0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1cd00 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
1cd10 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63          "conflic
1cd20 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54  ting ON CONFLICT
1cd30 20 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69   clauses specifi
1cd40 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ed", 0);.       
1cd50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
1cd60 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
1cd70 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a  ==OE_Default ){.
1cd80 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
1cd90 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64  ->onError = pInd
1cda0 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20  ex->onError;.   
1cdb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1cdc0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
1cdd0 64 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49  dxType==SQLITE_I
1cde0 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45  DXTYPE_PRIMARYKE
1cdf0 59 20 29 20 70 49 64 78 2d 3e 69 64 78 54 79 70  Y ) pIdx->idxTyp
1ce00 65 20 3d 20 69 64 78 54 79 70 65 3b 0a 20 20 20  e = idxType;.   
1ce10 20 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41       if( IN_RENA
1ce20 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
1ce30 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70         pIndex->p
1ce40 4e 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 70  Next = pParse->p
1ce50 4e 65 77 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  NewIndex;.      
1ce60 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
1ce70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
1ce80 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78            pIndex
1ce90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
1cea0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
1ceb0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1cec0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ced0 7d 0a 0a 20 20 69 66 28 20 21 49 4e 5f 52 45 4e  }..  if( !IN_REN
1cee0 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 0a 20  AME_OBJECT ){.. 
1cef0 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e     /* Link the n
1cf00 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  ew Index structu
1cf10 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20  re to its table 
1cf20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72  and to the other
1cf30 0a 20 20 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  .    ** in-memor
1cf40 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  y database struc
1cf50 74 75 72 65 73 2e 20 0a 20 20 20 20 2a 2f 0a 20  tures. .    */. 
1cf60 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1cf70 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20  e->nErr==0 );.  
1cf80 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
1cf90 75 73 79 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  usy ){.      Ind
1cfa0 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 61 73 73  ex *p;.      ass
1cfb0 65 72 74 28 20 21 49 4e 5f 53 50 45 43 49 41 4c  ert( !IN_SPECIAL
1cfc0 5f 50 41 52 53 45 20 29 3b 0a 20 20 20 20 20 20  _PARSE );.      
1cfd0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
1cfe0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
1cff0 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53  b, 0, pIndex->pS
1d000 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20  chema) );.      
1d010 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
1d020 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
1d030 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  x->tnum = db->in
1d040 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20  it.newTnum;.    
1d050 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1d060 6e 64 65 78 48 61 73 44 75 70 6c 69 63 61 74 65  ndexHasDuplicate
1d070 52 6f 6f 74 50 61 67 65 28 70 49 6e 64 65 78 29  RootPage(pIndex)
1d080 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
1d090 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1d0a0 61 72 73 65 2c 20 22 69 6e 76 61 6c 69 64 20 72  arse, "invalid r
1d0b0 6f 6f 74 70 61 67 65 22 29 3b 0a 20 20 20 20 20  ootpage");.     
1d0c0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
1d0d0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1d0e0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
1d0f0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1d100 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 20  e_index;.       
1d110 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1d120 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
1d130 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e  Insert(&pIndex->
1d140 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
1d150 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 49 6e  , .          pIn
1d160 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64  dex->zName, pInd
1d170 65 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ex);.      if( p
1d180 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1d190 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b  rt( p==pIndex );
1d1a0 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
1d1b0 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
1d1c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
1d1d0 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
1d1e0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1d1f0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1d200 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6d     }.      db->m
1d210 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41  DbFlags |= DBFLA
1d220 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  G_SchemaChange;.
1d230 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1d240 20 74 68 69 73 20 69 73 20 74 68 65 20 69 6e 69   this is the ini
1d250 74 69 61 6c 20 43 52 45 41 54 45 20 49 4e 44 45  tial CREATE INDE
1d260 58 20 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20  X statement (or 
1d270 43 52 45 41 54 45 20 54 41 42 4c 45 20 69 66 20  CREATE TABLE if 
1d280 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  the.    ** index
1d290 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 69   is an implied i
1d2a0 6e 64 65 78 20 66 6f 72 20 61 20 55 4e 49 51 55  ndex for a UNIQU
1d2b0 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
1d2c0 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 74 68 65   constraint) the
1d2d0 6e 0a 20 20 20 20 2a 2a 20 65 6d 69 74 20 63 6f  n.    ** emit co
1d2e0 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  de to allocate t
1d2f0 68 65 20 69 6e 64 65 78 20 72 6f 6f 74 70 61 67  he index rootpag
1d300 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64 20 6d 61  e on disk and ma
1d310 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 0a  ke an entry for.
1d320 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78      ** the index
1d330 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
1d340 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
1d350 70 6f 70 75 6c 61 74 65 20 74 68 65 20 69 6e 64  populate the ind
1d360 65 78 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 63  ex with.    ** c
1d370 6f 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f  ontent.  But, do
1d380 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 69 66 20   not do this if 
1d390 77 65 20 61 72 65 20 73 69 6d 70 6c 79 20 72 65  we are simply re
1d3a0 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
1d3b0 5f 6d 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 74  _master.    ** t
1d3c0 61 62 6c 65 20 74 6f 20 70 61 72 73 65 20 74 68  able to parse th
1d3d0 65 20 73 63 68 65 6d 61 2c 20 6f 72 20 69 66 20  e schema, or if 
1d3e0 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 74 68  this index is th
1d3f0 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
1d400 64 65 78 0a 20 20 20 20 2a 2a 20 6f 66 20 61 20  dex.    ** of a 
1d410 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
1d420 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ble..    **.    
1d430 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d  ** If pTblName==
1d440 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
1d450 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74  index is generat
1d460 65 64 20 61 73 20 61 6e 20 69 6d 70 6c 69 65 64  ed as an implied
1d470 20 50 52 49 4d 41 52 59 20 4b 45 59 0a 20 20 20   PRIMARY KEY.   
1d480 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 69 6e   ** or UNIQUE in
1d490 64 65 78 20 69 6e 20 61 20 43 52 45 41 54 45 20  dex in a CREATE 
1d4a0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
1d4b0 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c    Since the tabl
1d4c0 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6a 75 73  e.    ** has jus
1d4d0 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  t been created, 
1d4e0 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  it contains no d
1d4f0 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ata and the inde
1d500 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  x initialization
1d510 0a 20 20 20 20 2a 2a 20 73 74 65 70 20 63 61 6e  .    ** step can
1d520 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   be skipped..   
1d530 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1d540 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
1d550 7c 7c 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  || pTblName!=0 )
1d560 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76 3b  {.      Vdbe *v;
1d570 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 74  .      char *zSt
1d580 6d 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d  mt;.      int iM
1d590 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
1d5a0 4d 65 6d 3b 0a 0a 20 20 20 20 20 20 76 20 3d 20  Mem;..      v = 
1d5b0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1d5c0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66  Parse);.      if
1d5d0 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ( v==0 ) goto ex
1d5e0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1d5f0 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ..      sqlite3B
1d600 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
1d610 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
1d620 62 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72  b);..      /* Cr
1d630 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67  eate the rootpag
1d640 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  e for the index 
1d650 75 73 69 6e 67 20 43 72 65 61 74 65 49 6e 64 65  using CreateInde
1d660 78 2e 20 42 75 74 20 62 65 66 6f 72 65 0a 20 20  x. But before.  
1d670 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c      ** doing so,
1d680 20 63 6f 64 65 20 61 20 4e 6f 6f 70 20 69 6e 73   code a Noop ins
1d690 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 73 74 6f  truction and sto
1d6a0 72 65 20 69 74 73 20 61 64 64 72 65 73 73 20 69  re its address i
1d6b0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 49 6e 64 65  n .      ** Inde
1d6c0 78 2e 74 6e 75 6d 2e 20 54 68 69 73 20 69 73 20  x.tnum. This is 
1d6d0 72 65 71 75 69 72 65 64 20 69 6e 20 63 61 73 65  required in case
1d6e0 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 61   this index is a
1d6f0 63 74 75 61 6c 6c 79 20 61 20 0a 20 20 20 20 20  ctually a .     
1d700 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
1d710 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 69 73  and the table is
1d720 20 61 63 74 75 61 6c 6c 79 20 61 20 57 49 54 48   actually a WITH
1d730 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e  OUT ROWID table.
1d740 20 49 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   In .      ** th
1d750 61 74 20 63 61 73 65 20 74 68 65 20 63 6f 6e 76  at case the conv
1d760 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69  ertToWithoutRowi
1d770 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65  dTable() routine
1d780 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20   will replace.  
1d790 20 20 20 20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20      ** the Noop 
1d7a0 77 69 74 68 20 61 20 47 6f 74 6f 20 74 6f 20 6a  with a Goto to j
1d7b0 75 6d 70 20 6f 76 65 72 20 74 68 65 20 56 44 42  ump over the VDB
1d7c0 45 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  E code generated
1d7d0 20 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20   below. */.     
1d7e0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
1d7f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d800 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20  0(v, OP_Noop);. 
1d810 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d820 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65  AddOp3(v, OP_Cre
1d830 61 74 65 42 74 72 65 65 2c 20 69 44 62 2c 20 69  ateBtree, iDb, i
1d840 4d 65 6d 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b  Mem, BTREE_BLOBK
1d850 45 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  EY);..      /* G
1d860 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65  ather the comple
1d870 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
1d880 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
1d890 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 20  ement into.     
1d8a0 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61   ** the zStmt va
1d8b0 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a  riable.      */.
1d8c0 20 20 20 20 20 20 69 66 28 20 70 53 74 61 72 74        if( pStart
1d8d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
1d8e0 6e 20 3d 20 28 69 6e 74 29 28 70 50 61 72 73 65  n = (int)(pParse
1d8f0 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d  ->sLastToken.z -
1d900 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61   pName->z) + pPa
1d910 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e  rse->sLastToken.
1d920 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  n;.        if( p
1d930 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b  Name->z[n-1]==';
1d940 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 20  ' ) n--;.       
1d950 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65   /* A named inde
1d960 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63  x with an explic
1d970 69 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  it CREATE INDEX 
1d980 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
1d990 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c       zStmt = sql
1d9a0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1d9b0 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20  "CREATE%s INDEX 
1d9c0 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 20  %.*s",.         
1d9d0 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e     onError==OE_N
1d9e0 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49  one ? "" : " UNI
1d9f0 51 55 45 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e  QUE", n, pName->
1da00 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  z);.      }else{
1da10 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61  .        /* An a
1da20 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63  utomatic index c
1da30 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d  reated by a PRIM
1da40 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
1da50 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  E constraint */.
1da60 20 20 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74          /* zStmt
1da70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
1da80 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20  f(""); */.      
1da90 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    zStmt = 0;.   
1daa0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41     }..      /* A
1dab0 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73  dd an entry in s
1dac0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72  qlite_master for
1dad0 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20   this index.    
1dae0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
1daf0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
1db00 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
1db10 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51   "INSERT INTO %Q
1db20 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65  .%s VALUES('inde
1db30 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51 29  x',%Q,%Q,#%d,%Q)
1db40 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 64 62  ;",.          db
1db50 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
1db60 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45  ame, MASTER_NAME
1db70 2c 0a 20 20 20 20 20 20 20 20 20 20 70 49 6e 64  ,.          pInd
1db80 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ex->zName,.     
1db90 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
1dba0 2c 0a 20 20 20 20 20 20 20 20 20 20 69 4d 65 6d  ,.          iMem
1dbb0 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 6d  ,.          zStm
1dbc0 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  t.          );. 
1dbd0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
1dbe0 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a  ee(db, zStmt);..
1dbf0 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68        /* Fill th
1dc00 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61 74  e index with dat
1dc10 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74 68  a and reparse th
1dc20 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61  e schema. Code a
1dc30 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20  n OP_Expire.    
1dc40 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61    ** to invalida
1dc50 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69  te all pre-compi
1dc60 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
1dc70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1dc80 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20  f( pTblName ){. 
1dc90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
1dca0 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
1dcb0 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b  , pIndex, iMem);
1dcc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1dcd0 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
1dce0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
1dcf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1dd00 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 70  dParseSchemaOp(p
1dd10 50 61 72 73 65 2c 20 69 44 62 2c 0a 20 20 20 20  Parse, iDb,.    
1dd20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
1dd30 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65  Printf(db, "name
1dd40 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27  ='%q' AND type='
1dd50 69 6e 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d  index'", pIndex-
1dd60 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
1dd70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1dd80 4f 70 32 28 76 2c 20 4f 50 5f 45 78 70 69 72 65  Op2(v, OP_Expire
1dd90 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  , 0, 1);.      }
1dda0 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
1ddb0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
1ddc0 49 6e 64 65 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20  Index->tnum);.  
1ddd0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68    }.  }..  /* Wh
1dde0 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64  en adding an ind
1ddf0 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ex to the list o
1de00 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20  f indices for a 
1de10 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a  table, make.  **
1de20 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65   sure all indice
1de30 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70  s labeled OE_Rep
1de40 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20  lace come after 
1de50 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65  all those labele
1de60 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65  d.  ** OE_Ignore
1de70 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
1de80 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72  sary for the cor
1de90 72 65 63 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  rect constraint 
1dea0 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65  check.  ** proce
1deb0 73 73 69 6e 67 20 28 69 6e 20 73 71 6c 69 74 65  ssing (in sqlite
1dec0 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61  3GenerateConstra
1ded0 69 6e 74 43 68 65 63 6b 73 28 29 29 20 61 73 20  intChecks()) as 
1dee0 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44  part of.  ** UPD
1def0 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20 73  ATE and INSERT s
1df00 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a  tatements.  .  *
1df10 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
1df20 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d  .busy || pTblNam
1df30 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e==0 ){.    if( 
1df40 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
1df50 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e  ace || pTab->pIn
1df60 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  dex==0.         
1df70 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d  || pTab->pIndex-
1df80 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70  >onError==OE_Rep
1df90 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e  lace){.      pIn
1dfa0 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61  dex->pNext = pTa
1dfb0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
1dfc0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20   pTab->pIndex = 
1dfd0 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73  pIndex;.    }els
1dfe0 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
1dff0 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70  pOther = pTab->p
1e000 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69  Index;.      whi
1e010 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  le( pOther->pNex
1e020 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65  t && pOther->pNe
1e030 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  xt->onError!=OE_
1e040 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20  Replace ){.     
1e050 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68     pOther = pOth
1e060 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
1e070 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d   }.      pIndex-
1e080 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d  >pNext = pOther-
1e090 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f  >pNext;.      pO
1e0a0 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49  ther->pNext = pI
1e0b0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
1e0c0 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
1e0d0 20 20 65 6c 73 65 20 69 66 28 20 49 4e 5f 52 45    else if( IN_RE
1e0e0 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  NAME_OBJECT ){. 
1e0f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1e100 65 2d 3e 70 4e 65 77 49 6e 64 65 78 3d 3d 30 20  e->pNewIndex==0 
1e110 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  );.    pParse->p
1e120 4e 65 77 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  NewIndex = pInde
1e130 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20  x;.    pIndex = 
1e140 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65  0;.  }..  /* Cle
1e150 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69  an up before exi
1e160 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65  ting */.exit_cre
1e170 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28  ate_index:.  if(
1e180 20 70 49 6e 64 65 78 20 29 20 73 71 6c 69 74 65   pIndex ) sqlite
1e190 33 46 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70  3FreeIndex(db, p
1e1a0 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65  Index);.  sqlite
1e1b0 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1e1c0 70 50 49 57 68 65 72 65 29 3b 0a 20 20 73 71 6c  pPIWhere);.  sql
1e1d0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
1e1e0 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
1e1f0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
1e200 65 6c 65 74 65 28 64 62 2c 20 70 54 62 6c 4e 61  elete(db, pTblNa
1e210 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
1e220 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
1e230 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74  .}../*.** Fill t
1e240 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73  he Index.aiRowEs
1e250 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 64  t[] array with d
1e260 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69  efault informati
1e270 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  on - information
1e280 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77  .** to be used w
1e290 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20  hen we have not 
1e2a0 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20  run the ANALYZE 
1e2b0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61  command..**.** a
1e2c0 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75  iRowEst[0] is su
1e2d0 70 70 6f 73 65 64 20 74 6f 20 63 6f 6e 74 61 69  pposed to contai
1e2e0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1e2f0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
1e300 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20  index..** Since 
1e310 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20  we do not know, 
1e320 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e  guess 1 million.
1e330 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73    aiRowEst[1] is
1e340 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
1e350 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
1e360 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
1e370 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e  le that match an
1e380 79 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c  y particular val
1e390 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72  ue of the.** fir
1e3a0 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
1e3b0 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73   index.  aiRowEs
1e3c0 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[2] is an estim
1e3d0 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
1e3e0 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61  r.** of rows tha
1e3f0 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
1e400 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69  icular combinati
1e410 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  on of the first 
1e420 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20  2 columns.** of 
1e430 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20  the index.  And 
1e440 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75  so forth.  It mu
1e450 73 74 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  st always be the
1e460 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20   case that.*.** 
1e470 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
1e480 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b  st[N]<=aiRowEst[
1e490 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20  N-1].**         
1e4a0 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31    aiRowEst[N]>=1
1e4b0 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f  .**.** Apart fro
1e4c0 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76 65 20  m that, we have 
1e4d0 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20  little to go on 
1e4e0 62 65 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f  besides intuitio
1e4f0 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61  n as to.** how a
1e500 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64  iRowEst[] should
1e510 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
1e520 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65    The numbers ge
1e530 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20  nerated here.** 
1e540 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70  are based on typ
1e550 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e  ical values foun
1e560 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69  d in actual indi
1e570 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ces..*/.void sql
1e580 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
1e590 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  t(Index *pIdx){.
1e5a0 20 20 2f 2a 20 20 20 20 20 20 20 20 20 20 20 20    /*            
1e5b0 20 20 20 20 31 30 2c 20 20 39 2c 20 20 38 2c 20      10,  9,  8, 
1e5c0 20 37 2c 20 20 36 20 2a 2f 0a 20 20 4c 6f 67 45   7,  6 */.  LogE
1e5d0 73 74 20 61 56 61 6c 5b 5d 20 3d 20 7b 20 33 33  st aVal[] = { 33
1e5e0 2c 20 33 32 2c 20 33 30 2c 20 32 38 2c 20 32 36  , 32, 30, 28, 26
1e5f0 20 7d 3b 0a 20 20 4c 6f 67 45 73 74 20 2a 61 20   };.  LogEst *a 
1e600 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67  = pIdx->aiRowLog
1e610 45 73 74 3b 0a 20 20 69 6e 74 20 6e 43 6f 70 79  Est;.  int nCopy
1e620 20 3d 20 4d 49 4e 28 41 72 72 61 79 53 69 7a 65   = MIN(ArraySize
1e630 28 61 56 61 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b  (aVal), pIdx->nK
1e640 65 79 43 6f 6c 29 3b 0a 20 20 69 6e 74 20 69 3b  eyCol);.  int i;
1e650 0a 0a 20 20 2f 2a 20 49 6e 64 65 78 65 73 20 77  ..  /* Indexes w
1e660 69 74 68 20 64 65 66 61 75 6c 74 20 72 6f 77 20  ith default row 
1e670 65 73 74 69 6d 61 74 65 73 20 73 68 6f 75 6c 64  estimates should
1e680 20 6e 6f 74 20 68 61 76 65 20 73 74 61 74 31 20   not have stat1 
1e690 64 61 74 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  data */.  assert
1e6a0 28 20 21 70 49 64 78 2d 3e 68 61 73 53 74 61 74  ( !pIdx->hasStat
1e6b0 31 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  1 );..  /* Set t
1e6c0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 28  he first entry (
1e6d0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1e6e0 6e 20 74 68 65 20 69 6e 64 65 78 29 20 74 6f 20  n the index) to 
1e6f0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 0a 20  the estimated . 
1e700 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f   ** number of ro
1e710 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c  ws in the table,
1e720 20 6f 72 20 68 61 6c 66 20 74 68 65 20 6e 75 6d   or half the num
1e730 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1e740 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 66 6f  he table.  ** fo
1e750 72 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  r a partial inde
1e760 78 2e 20 20 20 42 75 74 20 64 6f 20 6e 6f 74 20  x.   But do not 
1e770 6c 65 74 20 74 68 65 20 65 73 74 69 6d 61 74 65  let the estimate
1e780 20 64 72 6f 70 20 62 65 6c 6f 77 20 31 30 2e 20   drop below 10. 
1e790 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20 70 49 64 78  */.  a[0] = pIdx
1e7a0 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f  ->pTable->nRowLo
1e7b0 67 45 73 74 3b 0a 20 20 69 66 28 20 70 49 64 78  gEst;.  if( pIdx
1e7c0 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21  ->pPartIdxWhere!
1e7d0 3d 30 20 29 20 61 5b 30 5d 20 2d 3d 20 31 30 3b  =0 ) a[0] -= 10;
1e7e0 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71    assert( 10==sq
1e7f0 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29  lite3LogEst(2) )
1e800 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3c 33 33 20  ;.  if( a[0]<33 
1e810 29 20 61 5b 30 5d 20 3d 20 33 33 3b 20 20 20 20  ) a[0] = 33;    
1e820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1e830 73 65 72 74 28 20 33 33 3d 3d 73 71 6c 69 74 65  sert( 33==sqlite
1e840 33 4c 6f 67 45 73 74 28 31 30 29 20 29 3b 0a 0a  3LogEst(10) );..
1e850 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68    /* Estimate th
1e860 61 74 20 61 5b 31 5d 20 69 73 20 31 30 2c 20 61  at a[1] is 10, a
1e870 5b 32 5d 20 69 73 20 39 2c 20 61 5b 33 5d 20 69  [2] is 9, a[3] i
1e880 73 20 38 2c 20 61 5b 34 5d 20 69 73 20 37 2c 20  s 8, a[4] is 7, 
1e890 61 5b 35 5d 20 69 73 0a 20 20 2a 2a 20 36 20 61  a[5] is.  ** 6 a
1e8a0 6e 64 20 65 61 63 68 20 73 75 62 73 65 71 75 65  nd each subseque
1e8b0 6e 74 20 76 61 6c 75 65 20 28 69 66 20 61 6e 79  nt value (if any
1e8c0 29 20 69 73 20 35 2e 20 20 2a 2f 0a 20 20 6d 65  ) is 5.  */.  me
1e8d0 6d 63 70 79 28 26 61 5b 31 5d 2c 20 61 56 61 6c  mcpy(&a[1], aVal
1e8e0 2c 20 6e 43 6f 70 79 2a 73 69 7a 65 6f 66 28 4c  , nCopy*sizeof(L
1e8f0 6f 67 45 73 74 29 29 3b 0a 20 20 66 6f 72 28 69  ogEst));.  for(i
1e900 3d 6e 43 6f 70 79 2b 31 3b 20 69 3c 3d 70 49 64  =nCopy+1; i<=pId
1e910 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29  x->nKeyCol; i++)
1e920 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 32 33 3b  {.    a[i] = 23;
1e930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e940 20 20 20 20 61 73 73 65 72 74 28 20 32 33 3d 3d      assert( 23==
1e950 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 35 29  sqlite3LogEst(5)
1e960 20 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72   );.  }..  asser
1e970 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  t( 0==sqlite3Log
1e980 45 73 74 28 31 29 20 29 3b 0a 20 20 69 66 28 20  Est(1) );.  if( 
1e990 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
1e9a0 64 78 29 20 29 20 61 5b 70 49 64 78 2d 3e 6e 4b  dx) ) a[pIdx->nK
1e9b0 65 79 43 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f  eyCol] = 0;.}../
1e9c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1e9d0 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65  e will drop an e
1e9e0 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e  xisting named in
1e9f0 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69  dex.  This routi
1ea00 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73  ne.** implements
1ea10 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20   the DROP INDEX 
1ea20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
1ea30 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e  id sqlite3DropIn
1ea40 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
1ea50 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
1ea60 65 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73 29  e, int ifExists)
1ea70 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
1ea80 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  x;.  Vdbe *v;.  
1ea90 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1eaa0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
1eab0 69 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  iDb;..  assert( 
1eac0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
1ead0 29 3b 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61  );   /* Never ca
1eae0 6c 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72 20  lled with prior 
1eaf0 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20  errors */.  if( 
1eb00 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1eb10 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
1eb20 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1eb30 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  }.  assert( pNam
1eb40 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
1eb50 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
1eb60 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
1eb70 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
1eb80 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1eb90 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  ndex;.  }.  pInd
1eba0 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
1ebb0 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d  Index(db, pName-
1ebc0 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61  >a[0].zName, pNa
1ebd0 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
1ebe0 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  se);.  if( pInde
1ebf0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  x==0 ){.    if( 
1ec00 21 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20  !ifExists ){.   
1ec10 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1ec20 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
1ec30 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20  uch index: %S", 
1ec40 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d  pName, 0);.    }
1ec50 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1ec60 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d  te3CodeVerifyNam
1ec70 65 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  edSchema(pParse,
1ec80 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
1ec90 74 61 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20  tabase);.    }. 
1eca0 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
1ecb0 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
1ecc0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1ecd0 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
1ece0 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 21  pIndex->idxType!
1ecf0 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
1ed00 41 50 50 44 45 46 20 29 7b 0a 20 20 20 20 73 71  APPDEF ){.    sq
1ed10 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1ed20 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73  arse, "index ass
1ed30 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49  ociated with UNI
1ed40 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20  QUE ".      "or 
1ed50 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
1ed60 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65  traint cannot be
1ed70 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20   dropped", 0);. 
1ed80 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1ed90 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  p_index;.  }.  i
1eda0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
1edb0 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49  maToIndex(db, pI
1edc0 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  ndex->pSchema);.
1edd0 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 57    sqlite3SchemaW
1ede0 72 69 74 61 62 6c 65 28 70 50 61 72 73 65 2c 20  ritable(pParse, 
1edf0 69 44 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  iDb);.#ifndef SQ
1ee00 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
1ee10 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
1ee20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  int code = SQLIT
1ee30 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20  E_DROP_INDEX;.  
1ee40 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
1ee50 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a  pIndex->pTable;.
1ee60 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1ee70 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
1ee80 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
1ee90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1eea0 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
1eeb0 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73  (iDb);.    if( s
1eec0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1eed0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
1eee0 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
1eef0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
1ef00 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1ef10 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
1ef20 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
1ef30 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53  & iDb ) code = S
1ef40 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
1ef50 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
1ef60 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1ef70 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49  pParse, code, pI
1ef80 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61  ndex->zName, pTa
1ef90 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
1efa0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
1efb0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1efc0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1efd0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1efe0 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
1eff0 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20   index and from 
1f000 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
1f010 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
1f020 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1f030 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1f040 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1f050 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1f060 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
1f070 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
1f080 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
1f090 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
1f0a0 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65  %Q.%s WHERE name
1f0b0 3d 25 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e  =%Q AND type='in
1f0c0 64 65 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62  dex'",.       db
1f0d0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
1f0e0 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45  ame, MASTER_NAME
1f0f0 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a  , pIndex->zName.
1f100 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
1f110 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65  e3ClearStatTable
1f120 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  s(pParse, iDb, "
1f130 69 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  idx", pIndex->zN
1f140 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
1f150 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
1f160 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
1f170 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
1f180 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e  pParse, pIndex->
1f190 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
1f1a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f1b0 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65  4(v, OP_DropInde
1f1c0 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 49  x, iDb, 0, 0, pI
1f1d0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
1f1e0 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  .  }..exit_drop_
1f1f0 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33  index:.  sqlite3
1f200 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
1f210 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , pName);.}../*.
1f220 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61 20 70  ** pArray is a p
1f230 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72  ointer to an arr
1f240 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45  ay of objects. E
1f250 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  ach object in th
1f260 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73 7a  e.** array is sz
1f270 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20 73  Entry bytes in s
1f280 69 7a 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ize. This routin
1f290 65 20 75 73 65 73 20 73 71 6c 69 74 65 33 44 62  e uses sqlite3Db
1f2a0 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20  Realloc().** to 
1f2b0 65 78 74 65 6e 64 20 74 68 65 20 61 72 72 61 79  extend the array
1f2c0 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69   so that there i
1f2d0 73 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65  s space for a ne
1f2e0 77 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20  w object at the 
1f2f0 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  end..**.** When 
1f300 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1f310 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72   called, *pnEntr
1f320 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  y contains the c
1f330 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a  urrent size of.*
1f340 2a 20 74 68 65 20 61 72 72 61 79 20 28 69 6e 20  * the array (in 
1f350 65 6e 74 72 69 65 73 20 2d 20 73 6f 20 74 68 65  entries - so the
1f360 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28   allocation is (
1f370 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45  (*pnEntry) * szE
1f380 6e 74 72 79 29 20 62 79 74 65 73 0a 2a 2a 20 69  ntry) bytes.** i
1f390 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  n total)..**.** 
1f3a0 49 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29  If the realloc()
1f3b0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 20 28   is successful (
1f3c0 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63  i.e. if no OOM c
1f3d0 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 73 29  ondition occurs)
1f3e0 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61  , the.** space a
1f3f0 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
1f400 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20 7a   new object is z
1f410 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20  eroed, *pnEntry 
1f420 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65  updated to.** re
1f430 66 6c 65 63 74 20 74 68 65 20 6e 65 77 20 73 69  flect the new si
1f440 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  ze of the array 
1f450 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  and a pointer to
1f460 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74   the new allocat
1f470 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  ion.** returned.
1f480 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f   *pIdx is set to
1f490 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
1f4a0 65 20 6e 65 77 20 61 72 72 61 79 20 65 6e 74 72  e new array entr
1f4b0 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
1f4c0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1f4d0 20 69 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28   if the realloc(
1f4e0 29 20 66 61 69 6c 73 2c 20 2a 70 49 64 78 20 69  ) fails, *pIdx i
1f4f0 73 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e  s set to -1, *pn
1f500 45 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a  Entry remains.**
1f510 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61   unchanged and a
1f520 20 63 6f 70 79 20 6f 66 20 70 41 72 72 61 79 20   copy of pArray 
1f530 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69  returned..*/.voi
1f540 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41  d *sqlite3ArrayA
1f550 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74  llocate(.  sqlit
1f560 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20  e3 *db,      /* 
1f570 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  Connection to no
1f580 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66  tify of malloc f
1f590 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69  ailures */.  voi
1f5a0 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f  d *pArray,     /
1f5b0 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63  * Array of objec
1f5c0 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65  ts.  Might be re
1f5d0 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69  allocated */.  i
1f5e0 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20  nt szEntry,     
1f5f0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68   /* Size of each
1f600 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61   object in the a
1f610 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  rray */.  int *p
1f620 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e  nEntry,     /* N
1f630 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
1f640 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
1f650 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78  e */.  int *pIdx
1f660 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1f670 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  e the index of a
1f680 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20 2a   new slot here *
1f690 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  /.){.  char *z;.
1f6a0 20 20 69 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74    int n = *pnEnt
1f6b0 72 79 3b 0a 20 20 69 66 28 20 28 6e 20 26 20 28  ry;.  if( (n & (
1f6c0 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  n-1))==0 ){.    
1f6d0 69 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20  int sz = (n==0) 
1f6e0 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76  ? 1 : 2*n;.    v
1f6f0 6f 69 64 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  oid *pNew = sqli
1f700 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
1f710 20 70 41 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e   pArray, sz*szEn
1f720 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  try);.    if( pN
1f730 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  ew==0 ){.      *
1f740 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pIdx = -1;.     
1f750 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a   return pArray;.
1f760 20 20 20 20 7d 0a 20 20 20 20 70 41 72 72 61 79      }.    pArray
1f770 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a   = pNew;.  }.  z
1f780 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61 79   = (char*)pArray
1f790 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20  ;.  memset(&z[n 
1f7a0 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73  * szEntry], 0, s
1f7b0 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64 78  zEntry);.  *pIdx
1f7c0 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74   = n;.  ++*pnEnt
1f7d0 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72  ry;.  return pAr
1f7e0 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  ray;.}../*.** Ap
1f7f0 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65  pend a new eleme
1f800 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  nt to the given 
1f810 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  IdList.  Create 
1f820 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a  a new IdList if.
1f830 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a  ** need be..**.*
1f840 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69  * A new IdList i
1f850 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
1f860 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
1f870 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74  fails..*/.IdList
1f880 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41   *sqlite3IdListA
1f890 70 70 65 6e 64 28 50 61 72 73 65 20 2a 70 50 61  ppend(Parse *pPa
1f8a0 72 73 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69  rse, IdList *pLi
1f8b0 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
1f8c0 6e 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  n){.  sqlite3 *d
1f8d0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1f8e0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1f8f0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
1f900 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
1f910 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
1f920 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b  izeof(IdList) );
1f930 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
1f940 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1f950 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73  }.  pList->a = s
1f960 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
1f970 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20  ate(.      db,. 
1f980 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20       pList->a,. 
1f990 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73       sizeof(pLis
1f9a0 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20  t->a[0]),.      
1f9b0 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20  &pList->nId,.   
1f9c0 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28     &i.  );.  if(
1f9d0 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69   i<0 ){.    sqli
1f9e0 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
1f9f0 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
1fa00 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1fa10 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1fa20 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
1fa30 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f  romToken(db, pTo
1fa40 6b 65 6e 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52  ken);.  if( IN_R
1fa50 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20  ENAME_OBJECT && 
1fa60 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1fa70 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1fa80 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70  RenameTokenMap(p
1fa90 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 70 4c  Parse, (void*)pL
1faa0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
1fab0 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20   pToken);.  }.  
1fac0 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
1fad0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
1fae0 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64   IdList..*/.void
1faf0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1fb00 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
1fb10 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29  , IdList *pList)
1fb20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1fb30 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1fb40 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
1fb50 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
1fb60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1fb70 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
1fb80 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
1fb90 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1fba0 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a  (db, pList->a);.
1fbb0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
1fbc0 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  N(db, pList);.}.
1fbd0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1fbe0 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  e index in pList
1fbf0 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69   of the identifi
1fc00 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52  er named zId.  R
1fc10 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e  eturn -1.** if n
1fc20 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  ot found..*/.int
1fc30 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
1fc40 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  dex(IdList *pLis
1fc50 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
1fc60 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
1fc70 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1fc80 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f   return -1;.  fo
1fc90 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1fca0 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nId; i++){.    i
1fcb0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1fcc0 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
1fcd0 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
1fce0 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
1fcf0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
1fd00 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a  *.** Maximum siz
1fd10 65 20 6f 66 20 61 20 53 72 63 4c 69 73 74 20 6f  e of a SrcList o
1fd20 62 6a 65 63 74 2e 0a 2a 2a 20 54 68 65 20 53 72  bject..** The Sr
1fd30 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 69 73 20  cList object is 
1fd40 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
1fd50 74 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  t the FROM claus
1fd60 65 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54  e of a.** SELECT
1fd70 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6e 64 20   statement, and 
1fd80 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
1fd90 72 20 63 61 6e 6e 6f 74 20 64 65 61 6c 20 77 69  r cannot deal wi
1fda0 74 68 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20  th more.** than 
1fdb0 36 34 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a  64 tables in a j
1fdc0 6f 69 6e 2e 20 20 53 6f 20 61 6e 79 20 76 61 6c  oin.  So any val
1fdd0 75 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 36  ue larger than 6
1fde0 34 20 68 65 72 65 0a 2a 2a 20 69 73 20 73 75 66  4 here.** is suf
1fdf0 66 69 63 69 65 6e 74 20 66 6f 72 20 6d 6f 73 74  ficient for most
1fe00 20 75 73 65 73 2e 20 20 53 6d 61 6c 6c 65 72 20   uses.  Smaller 
1fe10 76 61 6c 75 65 73 2c 20 6c 69 6b 65 20 73 61 79  values, like say
1fe20 20 31 30 2c 20 61 72 65 0a 2a 2a 20 61 70 70 72   10, are.** appr
1fe30 6f 70 72 69 61 74 65 20 66 6f 72 20 73 6d 61 6c  opriate for smal
1fe40 6c 20 61 6e 64 20 6d 65 6d 6f 72 79 2d 6c 69 6d  l and memory-lim
1fe50 69 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e  ited application
1fe60 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  s..*/.#ifndef SQ
1fe70 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54  LITE_MAX_SRCLIST
1fe80 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
1fe90 5f 4d 41 58 5f 53 52 43 4c 49 53 54 20 32 30 30  _MAX_SRCLIST 200
1fea0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45  .#endif../*.** E
1feb0 78 70 61 6e 64 20 74 68 65 20 73 70 61 63 65 20  xpand the space 
1fec0 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
1fed0 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 20  e given SrcList 
1fee0 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72 65  object by.** cre
1fef0 61 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65 77  ating nExtra new
1ff00 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67   slots beginning
1ff10 20 61 74 20 69 53 74 61 72 74 2e 20 20 69 53 74   at iStart.  iSt
1ff20 61 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73 65  art is zero base
1ff30 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20  d..** New slots 
1ff40 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a  are zeroed..**.*
1ff50 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73  * For example, s
1ff60 75 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73 74  uppose a SrcList
1ff70 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61   initially conta
1ff80 69 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73 3a  ins two entries:
1ff90 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65   A,B..** To appe
1ffa0 6e 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65 73  nd 3 new entries
1ffb0 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20 64   onto the end, d
1ffc0 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  o this:.**.**   
1ffd0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
1ffe0 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 6c  nlarge(db, pSrcl
1fff0 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a  ist, 3, 2);.**.*
20000 2a 20 41 66 74 65 72 20 74 68 65 20 63 61 6c 6c  * After the call
20010 20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64 20   above it would 
20020 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20  contain:  A, B, 
20030 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a  nil, nil, nil..*
20040 2a 20 49 66 20 74 68 65 20 69 53 74 61 72 74 20  * If the iStart 
20050 61 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65 65  argument had bee
20060 6e 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20 32  n 1 instead of 2
20070 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
20080 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20  t.** would have 
20090 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e  been:  A, nil, n
200a0 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20  il, nil, B.  To 
200b0 70 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77 20  prepend the new 
200c0 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53  slots,.** the iS
200d0 74 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c 64  tart value would
200e0 20 62 65 20 30 2e 20 20 54 68 65 20 72 65 73 75   be 0.  The resu
200f0 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a  lt then would.**
20100 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e   be: nil, nil, n
20110 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20  il, A, B..**.** 
20120 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
20130 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 6f 72 20  cation fails or 
20140 74 68 65 20 53 72 63 4c 69 73 74 20 62 65 63 6f  the SrcList beco
20150 6d 65 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 6c  mes too large, l
20160 65 61 76 65 0a 2a 2a 20 74 68 65 20 6f 72 69 67  eave.** the orig
20170 69 6e 61 6c 20 53 72 63 4c 69 73 74 20 75 6e 63  inal SrcList unc
20180 68 61 6e 67 65 64 2c 20 72 65 74 75 72 6e 20 4e  hanged, return N
20190 55 4c 4c 2c 20 61 6e 64 20 6c 65 61 76 65 20 61  ULL, and leave a
201a0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
201b0 2a 2a 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ** in pParse..*/
201c0 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
201d0 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
201e0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
201f0 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
20200 20 63 6f 6e 74 65 78 74 20 69 6e 74 6f 20 77 68   context into wh
20210 69 63 68 20 65 72 72 6f 72 73 20 61 72 65 20 72  ich errors are r
20220 65 70 6f 72 74 65 64 20 2a 2f 0a 20 20 53 72 63  eported */.  Src
20230 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
20240 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74  /* The SrcList t
20250 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f  o be enlarged */
20260 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
20270 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20280 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20  of new slots to 
20290 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d  add to pSrc->a[]
202a0 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
202b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
202c0 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f  x in pSrc->a[] o
202d0 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74  f first new slot
202e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
202f0 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
20300 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67  cking on calling
20310 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
20320 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e   assert( iStart>
20330 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
20340 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61  nExtra>=1 );.  a
20350 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
20360 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
20370 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29  rt<=pSrc->nSrc )
20380 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
20390 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63   additional spac
203a0 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  e if needed */. 
203b0 20 69 66 28 20 28 75 33 32 29 70 53 72 63 2d 3e   if( (u32)pSrc->
203c0 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63  nSrc+nExtra>pSrc
203d0 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
203e0 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
203f0 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
20400 70 53 72 63 2d 3e 6e 53 72 63 2a 32 2b 6e 45 78  pSrc->nSrc*2+nEx
20410 74 72 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tra;.    sqlite3
20420 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
20430 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  b;..    if( pSrc
20440 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e 3d 53  ->nSrc+nExtra>=S
20450 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53  QLITE_MAX_SRCLIS
20460 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T ){.      sqlit
20470 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
20480 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 46 52 4f  e, "too many FRO
20490 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2c 20  M clause terms, 
204a0 6d 61 78 3a 20 25 64 22 2c 0a 20 20 20 20 20 20  max: %d",.      
204b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204c0 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49  SQLITE_MAX_SRCLI
204d0 53 54 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ST);.      retur
204e0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
204f0 66 28 20 6e 41 6c 6c 6f 63 3e 53 51 4c 49 54 45  f( nAlloc>SQLITE
20500 5f 4d 41 58 5f 53 52 43 4c 49 53 54 20 29 20 6e  _MAX_SRCLIST ) n
20510 41 6c 6c 6f 63 20 3d 20 53 51 4c 49 54 45 5f 4d  Alloc = SQLITE_M
20520 41 58 5f 53 52 43 4c 49 53 54 3b 0a 20 20 20 20  AX_SRCLIST;.    
20530 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
20540 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63  Realloc(db, pSrc
20550 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20560 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b   sizeof(*pSrc) +
20570 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65   (nAlloc-1)*size
20580 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29  of(pSrc->a[0]) )
20590 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
205a0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
205b0 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
205c0 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
205d0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
205e0 20 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20   pSrc = pNew;.  
205f0 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d    pSrc->nAlloc =
20600 20 6e 41 6c 6c 6f 63 3b 0a 20 20 7d 0a 0a 20 20   nAlloc;.  }..  
20610 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67  /* Move existing
20620 20 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65   slots that come
20630 20 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79   after the newly
20640 20 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a   inserted slots.
20650 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20    ** out of the 
20660 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70  way */.  for(i=p
20670 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d  Src->nSrc-1; i>=
20680 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20  iStart; i--){.  
20690 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74    pSrc->a[i+nExt
206a0 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  ra] = pSrc->a[i]
206b0 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53  ;.  }.  pSrc->nS
206c0 72 63 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a 20  rc += nExtra;.. 
206d0 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77   /* Zero the new
206e0 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f  ly allocated slo
206f0 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ts */.  memset(&
20700 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c  pSrc->a[iStart],
20710 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d   0, sizeof(pSrc-
20720 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a  >a[0])*nExtra);.
20730 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20    for(i=iStart; 
20740 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b  i<iStart+nExtra;
20750 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d   i++){.    pSrc-
20760 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20  >a[i].iCursor = 
20770 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  -1;.  }..  /* Re
20780 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
20790 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53  o the enlarged S
207a0 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75  rcList */.  retu
207b0 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn pSrc;.}.../*.
207c0 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
207d0 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
207e0 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e  e given SrcList.
207f0 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
20800 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  rcList if.** nee
20810 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74  d be.  A new ent
20820 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  ry is created in
20830 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65   the SrcList eve
20840 6e 20 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e  n if pTable is N
20850 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63  ULL..**.** A Src
20860 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
20870 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65  , or NULL if the
20880 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72  re is an OOM err
20890 6f 72 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20  or or if the.** 
208a0 53 72 63 4c 69 73 74 20 67 72 6f 77 73 20 74 6f  SrcList grows to
208b0 20 6c 61 72 67 65 2e 20 20 54 68 65 20 72 65 74   large.  The ret
208c0 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74  urned.** SrcList
208d0 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61   might be the sa
208e0 6d 65 20 61 73 20 74 68 65 20 53 72 63 4c 69 73  me as the SrcLis
208f0 74 20 74 68 61 74 20 77 61 73 20 69 6e 70 75 74  t that was input
20900 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a   or it might be.
20910 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49  ** a new one.  I
20920 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64  f an OOM error d
20930 6f 65 73 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  oes occurs, then
20940 20 74 68 65 20 70 72 69 6f 72 20 76 61 6c 75 65   the prior value
20950 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61   of pList.** tha
20960 74 20 69 73 20 69 6e 70 75 74 20 74 6f 20 74 68  t is input to th
20970 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 75  is routine is au
20980 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72 65 65  tomatically free
20990 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74  d..**.** If pDat
209a0 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c  abase is not nul
209b0 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
209c0 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
209d0 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61  n optional.** da
209e0 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66  tabase name pref
209f0 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20  ix.  Like this: 
20a00 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65   "database.table
20a10 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73  ".  The pDatabas
20a20 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  e.** points to t
20a30 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
20a40 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69  d the pTable poi
20a50 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nts to the datab
20a60 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65  ase name..** The
20a70 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61   SrcList.a[].zNa
20a80 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c  me field is fill
20a90 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
20aa0 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67  e name which mig
20ab0 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20  ht.** come from 
20ac0 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61  pTable (if pData
20ad0 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72  base is NULL) or
20ae0 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e   from pDatabase.
20af0 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b    .** SrcList.a[
20b00 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66  ].zDatabase is f
20b10 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64  illed with the d
20b20 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f  atabase name fro
20b30 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20  m pTable,.** or 
20b40 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20  with NULL if no 
20b50 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63  database is spec
20b60 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ified..**.** In 
20b70 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
20b80 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  call like this:.
20b90 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
20ba0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
20bb0 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a  nd(D,A,B,0);.**.
20bc0 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74  ** Then B is a t
20bd0 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
20be0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
20bf0 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20  is unspecified. 
20c00 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69   If called.** li
20c10 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
20c20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
20c30 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
20c40 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,C);.**.** Then
20c50 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20   C is the table 
20c60 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68  name and B is th
20c70 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
20c80 20 20 49 66 20 43 20 69 73 20 64 65 66 69 6e 65    If C is define
20c90 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69 73 20  d.** then so is 
20ca0 42 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  B.  In other wor
20cb0 64 73 2c 20 77 65 20 6e 65 76 65 72 20 68 61 76  ds, we never hav
20cc0 65 20 61 20 63 61 73 65 20 77 68 65 72 65 3a 0a  e a case where:.
20cd0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
20ce0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
20cf0 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a  nd(D,A,0,C);.**.
20d00 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c 65 20 61  ** Both pTable a
20d10 6e 64 20 70 44 61 74 61 62 61 73 65 20 61 72 65  nd pDatabase are
20d20 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 71   assumed to be q
20d30 75 6f 74 65 64 2e 20 20 54 68 65 79 20 61 72 65  uoted.  They are
20d40 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66   dequoted.** bef
20d50 6f 72 65 20 62 65 69 6e 67 20 61 64 64 65 64 20  ore being added 
20d60 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74 2e 0a  to the SrcList..
20d70 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
20d80 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
20d90 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
20da0 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  e,      /* Parsi
20db0 6e 67 20 63 6f 6e 74 65 78 74 2c 20 69 6e 20 77  ng context, in w
20dc0 68 69 63 68 20 65 72 72 6f 72 73 20 61 72 65 20  hich errors are 
20dd0 72 65 70 6f 72 74 65 64 20 2a 2f 0a 20 20 53 72  reported */.  Sr
20de0 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  cList *pList,   
20df0 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74    /* Append to t
20e00 68 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c  his SrcList. NUL
20e10 4c 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20  L creates a new 
20e20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b  SrcList */.  Tok
20e30 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20  en *pTable,     
20e40 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70 70   /* Table to app
20e50 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  end */.  Token *
20e60 70 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a 20  pDatabase    /* 
20e70 44 61 74 61 62 61 73 65 20 6f 66 20 74 68 65 20  Database of the 
20e80 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74  table */.){.  st
20e90 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
20ea0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
20eb0 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72  te3 *db;.  asser
20ec0 74 28 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20  t( pDatabase==0 
20ed0 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20  || pTable!=0 ); 
20ee0 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20   /* Cannot have 
20ef0 43 20 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20  C without B */. 
20f00 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
20f10 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
20f20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b  pParse->db!=0 );
20f30 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
20f40 64 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  db;.  if( pList=
20f50 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
20f60 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
20f70 63 52 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64  cRawNN(pParse->d
20f80 62 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73  b, sizeof(SrcLis
20f90 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
20fa0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
20fb0 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
20fc0 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 20 20 70 4c  lloc = 1;.    pL
20fd0 69 73 74 2d 3e 6e 53 72 63 20 3d 20 31 3b 0a 20  ist->nSrc = 1;. 
20fe0 20 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74     memset(&pList
20ff0 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[0], 0, sizeo
21000 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
21010 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  .    pList->a[0]
21020 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  .iCursor = -1;. 
21030 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53 72 63 4c   }else{.    SrcL
21040 69 73 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  ist *pNew = sqli
21050 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
21060 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  e(pParse, pList,
21070 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29   1, pList->nSrc)
21080 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
21090 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
210a0 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
210b0 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
210c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
210d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69  }else{.      pLi
210e0 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  st = pNew;.    }
210f0 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
21100 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
21110 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70  nSrc-1];.  if( p
21120 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74  Database && pDat
21130 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  abase->z==0 ){. 
21140 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30     pDatabase = 0
21150 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74  ;.  }.  if( pDat
21160 61 62 61 73 65 20 29 7b 0a 20 20 20 20 70 49 74  abase ){.    pIt
21170 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
21180 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
21190 28 64 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b  (db, pDatabase);
211a0 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74  .    pItem->zDat
211b0 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e  abase = sqlite3N
211c0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
211d0 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73   pTable);.  }els
211e0 65 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  e{.    pItem->zN
211f0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
21200 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
21210 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 49 74 65  Table);.    pIte
21220 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30  m->zDatabase = 0
21230 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
21240 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  List;.}../*.** A
21250 73 73 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72  ssign VdbeCursor
21260 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74   index numbers t
21270 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  o all tables in 
21280 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69  a SrcList.*/.voi
21290 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
212a0 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61  AssignCursors(Pa
212b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
212c0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
212d0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
212e0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
212f0 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c  tem;.  assert(pL
21300 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ist || pParse->d
21310 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
21320 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
21330 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  {.    for(i=0, p
21340 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
21350 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
21360 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
21370 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43     if( pItem->iC
21380 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b  ursor>=0 ) break
21390 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69  ;.      pItem->i
213a0 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
213b0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69  >nTab++;.      i
213c0 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
213d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
213e0 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
213f0 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
21400 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d   pItem->pSelect-
21410 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  >pSrc);.      }.
21420 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
21430 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
21440 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
21450 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
21460 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
21470 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
21480 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
21490 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
214a0 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
214b0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
214c0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
214d0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
214e0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74  eturn;.  for(pIt
214f0 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
21500 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
21510 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
21520 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
21530 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61  e(db, pItem->zDa
21540 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
21550 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
21560 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
21570 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
21580 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  db, pItem->zAlia
21590 73 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  s);.    if( pIte
215a0 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
215b0 79 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  y ) sqlite3DbFre
215c0 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e  e(db, pItem->u1.
215d0 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20  zIndexedBy);.   
215e0 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69   if( pItem->fg.i
215f0 73 54 61 62 46 75 6e 63 20 29 20 73 71 6c 69 74  sTabFunc ) sqlit
21600 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
21610 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70  (db, pItem->u1.p
21620 46 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 73 71  FuncArg);.    sq
21630 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
21640 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  (db, pItem->pTab
21650 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
21660 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
21670 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Item->pSelect);.
21680 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
21690 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
216a0 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  >pOn);.    sqlit
216b0 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
216c0 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  b, pItem->pUsing
216d0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
216e0 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69  DbFreeNN(db, pLi
216f0 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  st);.}../*.** Th
21700 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
21710 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
21720 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20  er to add a new 
21730 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65  term to the.** e
21740 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20  nd of a growing 
21750 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
21760 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20  e "p" parameter 
21770 69 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a  is the part of.*
21780 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
21790 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61  e that has alrea
217a0 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63  dy been construc
217b0 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c  ted.  "p" is NUL
217c0 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20  L.** if this is 
217d0 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f  the first term o
217e0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
217f0 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70  e.  pTable and p
21800 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20  Database.** are 
21810 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
21820 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61  table and databa
21830 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20  se named in the 
21840 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
21850 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69  ..** pDatabase i
21860 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61  s NULL if the da
21870 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c  tabase name qual
21880 69 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67  ifier is missing
21890 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20   - the.** usual 
218a0 63 61 73 65 2e 20 20 49 66 20 74 68 65 20 74 65  case.  If the te
218b0 72 6d 20 68 61 73 20 61 6e 20 61 6c 69 61 73 2c  rm has an alias,
218c0 20 74 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69   then pAlias poi
218d0 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c  nts to the.** al
218e0 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74  ias token.  If t
218f0 68 65 20 74 65 72 6d 20 69 73 20 61 20 73 75 62  he term is a sub
21900 71 75 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62  query, then pSub
21910 71 75 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20  query is the.** 
21920 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
21930 20 74 68 61 74 20 74 68 65 20 73 75 62 71 75 65   that the subque
21940 72 79 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65  ry encodes.  The
21950 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70   pTable and.** p
21960 44 61 74 61 62 61 73 65 20 70 61 72 61 6d 65 74  Database paramet
21970 65 72 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72  ers are NULL for
21980 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 54 68   subqueries.  Th
21990 65 20 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67  e pOn and pUsing
219a0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61  .** parameters a
219b0 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  re the content o
219c0 66 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  f the ON and USI
219d0 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  NG clauses..**.*
219e0 2a 20 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53  * Return a new S
219f0 72 63 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63  rcList which enc
21a00 6f 64 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d  odes is the FROM
21a10 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a   with the new.**
21a20 20 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a   term added..*/.
21a30 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
21a40 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f  SrcListAppendFro
21a50 6d 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a  mTerm(.  Parse *
21a60 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
21a70 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
21a80 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
21a90 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
21aa0 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72   /* The left par
21ab0 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
21ac0 61 75 73 65 20 61 6c 72 65 61 64 79 20 73 65 65  ause already see
21ad0 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  n */.  Token *pT
21ae0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
21af0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
21b00 62 6c 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68  ble to add to th
21b10 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
21b20 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  .  Token *pDatab
21b30 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61  ase,       /* Na
21b40 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
21b50 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54  se containing pT
21b60 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  able */.  Token 
21b70 2a 70 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20  *pAlias,        
21b80 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68    /* The right-h
21b90 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
21ba0 41 53 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  AS subexpression
21bb0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
21bc0 75 62 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a  ubquery,      /*
21bd0 20 41 20 73 75 62 71 75 65 72 79 20 75 73 65 64   A subquery used
21be0 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74   in place of a t
21bf0 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45  able name */.  E
21c00 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20  xpr *pOn,       
21c10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e         /* The ON
21c20 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69   clause of a joi
21c30 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  n */.  IdList *p
21c40 55 73 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f  Using          /
21c50 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75  * The USING clau
21c60 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a  se of a join */.
21c70 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  ){.  struct SrcL
21c80 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
21c90 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
21ca0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
21cb0 66 28 20 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c  f( !p && (pOn ||
21cc0 20 70 55 73 69 6e 67 29 20 29 7b 0a 20 20 20 20   pUsing) ){.    
21cd0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
21ce0 70 50 61 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20  pParse, "a JOIN 
21cf0 63 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72  clause is requir
21d00 65 64 20 62 65 66 6f 72 65 20 25 73 22 2c 20 0a  ed before %s", .
21d10 20 20 20 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e        (pOn ? "ON
21d20 22 20 3a 20 22 55 53 49 4e 47 22 29 0a 20 20 20  " : "USING").   
21d30 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70   );.    goto app
21d40 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a  end_from_error;.
21d50 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65    }.  p = sqlite
21d60 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70  3SrcListAppend(p
21d70 50 61 72 73 65 2c 20 70 2c 20 70 54 61 62 6c 65  Parse, p, pTable
21d80 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
21d90 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
21da0 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d  goto append_from
21db0 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 61 73  _error;.  }.  as
21dc0 73 65 72 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20  sert( p->nSrc>0 
21dd0 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d  );.  pItem = &p-
21de0 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
21df0 20 61 73 73 65 72 74 28 20 28 70 54 61 62 6c 65   assert( (pTable
21e00 3d 3d 30 29 3d 3d 28 70 44 61 74 61 62 61 73 65  ==0)==(pDatabase
21e10 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ==0) );.  assert
21e20 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pItem->zName==
21e30 30 20 7c 7c 20 70 44 61 74 61 62 61 73 65 21 3d  0 || pDatabase!=
21e40 30 20 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45  0 );.  if( IN_RE
21e50 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20 70  NAME_OBJECT && p
21e60 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  Item->zName ){. 
21e70 20 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e     Token *pToken
21e80 20 3d 20 28 41 4c 57 41 59 53 28 70 44 61 74 61   = (ALWAYS(pData
21e90 62 61 73 65 29 20 26 26 20 70 44 61 74 61 62 61  base) && pDataba
21ea0 73 65 2d 3e 7a 29 20 3f 20 70 44 61 74 61 62 61  se->z) ? pDataba
21eb0 73 65 20 3a 20 70 54 61 62 6c 65 3b 0a 20 20 20  se : pTable;.   
21ec0 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f   sqlite3RenameTo
21ed0 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 70  kenMap(pParse, p
21ee0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 6f  Item->zName, pTo
21ef0 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ken);.  }.  asse
21f00 72 74 28 20 70 41 6c 69 61 73 21 3d 30 20 29 3b  rt( pAlias!=0 );
21f10 0a 20 20 69 66 28 20 70 41 6c 69 61 73 2d 3e 6e  .  if( pAlias->n
21f20 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   ){.    pItem->z
21f30 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e  Alias = sqlite3N
21f40 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
21f50 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20   pAlias);.  }.  
21f60 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pItem->pSelect =
21f70 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70 49   pSubquery;.  pI
21f80 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a  tem->pOn = pOn;.
21f90 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20    pItem->pUsing 
21fa0 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65 74 75  = pUsing;.  retu
21fb0 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e 64 5f 66  rn p;.. append_f
21fc0 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73  rom_error:.  ass
21fd0 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 73  ert( p==0 );.  s
21fe0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
21ff0 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 73 71 6c  (db, pOn);.  sql
22000 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
22010 28 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20  (db, pUsing);.  
22020 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
22030 65 74 65 28 64 62 2c 20 70 53 75 62 71 75 65 72  ete(db, pSubquer
22040 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  y);.  return 0;.
22050 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
22060 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e 4f  INDEXED BY or NO
22070 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65  T INDEXED clause
22080 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63   to the most rec
22090 65 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a 20  ently added .** 
220a0 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 73  element of the s
220b0 6f 75 72 63 65 2d 6c 69 73 74 20 70 61 73 73 65  ource-list passe
220c0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
220d0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  argument..*/.voi
220e0 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
220f0 49 6e 64 65 78 65 64 42 79 28 50 61 72 73 65 20  IndexedBy(Parse 
22100 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
22110 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e 64   *p, Token *pInd
22120 65 78 65 64 42 79 29 7b 0a 20 20 61 73 73 65 72  exedBy){.  asser
22130 74 28 20 70 49 6e 64 65 78 65 64 42 79 21 3d 30  t( pIndexedBy!=0
22140 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70   );.  if( p && p
22150 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3e 30 20 29  IndexedBy->n>0 )
22160 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
22170 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
22180 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
22190 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20 20 20 70  >nSrc>0 );.    p
221a0 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
221b0 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73  nSrc-1];.    ass
221c0 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e  ert( pItem->fg.n
221d0 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a  otIndexed==0 );.
221e0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
221f0 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
22200 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  y==0 );.    asse
22210 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
22220 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20  TabFunc==0 );.  
22230 20 20 69 66 28 20 70 49 6e 64 65 78 65 64 42 79    if( pIndexedBy
22240 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65  ->n==1 && !pInde
22250 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20  xedBy->z ){.    
22260 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45    /* A "NOT INDE
22270 58 45 44 22 20 63 6c 61 75 73 65 20 77 61 73 20  XED" clause was 
22280 73 75 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61  supplied. See pa
22290 72 73 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20  rse.y .      ** 
222a0 63 6f 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78  construct "index
222b0 65 64 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61  ed_opt" for deta
222c0 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49  ils. */.      pI
222d0 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  tem->fg.notIndex
222e0 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
222f0 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  e{.      pItem->
22300 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20  u1.zIndexedBy = 
22310 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
22320 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
22330 20 70 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20   pIndexedBy);.  
22340 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73      pItem->fg.is
22350 49 6e 64 65 78 65 64 42 79 20 3d 20 31 3b 0a 20  IndexedBy = 1;. 
22360 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
22370 2a 20 41 64 64 20 74 68 65 20 6c 69 73 74 20 6f  * Add the list o
22380 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
22390 65 6e 74 73 20 74 6f 20 74 68 65 20 53 72 63 4c  ents to the SrcL
223a0 69 73 74 20 65 6e 74 72 79 20 66 6f 72 20 61 0a  ist entry for a.
223b0 2a 2a 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d  ** table-valued-
223c0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
223d0 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
223e0 46 75 6e 63 41 72 67 73 28 50 61 72 73 65 20 2a  FuncArgs(Parse *
223f0 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
22400 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  *p, ExprList *pL
22410 69 73 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ist){.  if( p ){
22420 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
22430 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
22440 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
22450 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
22460 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64  pItem->fg.notInd
22470 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  exed==0 );.    a
22480 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
22490 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20  .isIndexedBy==0 
224a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
224b0 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
224c0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74  nc==0 );.    pIt
224d0 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20  em->u1.pFuncArg 
224e0 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 70 49 74  = pList;.    pIt
224f0 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
22500 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
22510 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
22520 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
22530 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d  >db, pList);.  }
22540 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62  .}../*.** When b
22550 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f  uilding up a FRO
22560 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
22570 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e  parser, the join
22580 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   operator.** is 
22590 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68  initially attach
225a0 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ed to the left o
225b0 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65  perand.  But the
225c0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
225d0 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65 20 6a  ** expects the j
225e0 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  oin operator to 
225f0 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  be on the right 
22600 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72  operand.  This r
22610 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73  outine.** Shifts
22620 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74   all join operat
22630 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  ors from left to
22640 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e   right for an en
22650 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61  tire FROM.** cla
22660 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  use..**.** Examp
22670 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20  le: Suppose the 
22680 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69  join is like thi
22690 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
226a0 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f     A natural cro
226b0 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20  ss join B.**.** 
226c0 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20  The operator is 
226d0 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a  "natural cross j
226e0 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64  oin".  The A and
226f0 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20   B operands are 
22700 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e  stored.** in p->
22710 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d  a[0] and p->a[1]
22720 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
22730 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 69 74   The parser init
22740 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65  ially stores the
22750 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74  .** operator wit
22760 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69  h A.  This routi
22770 6e 65 20 73 68 69 66 74 73 20 74 68 61 74 20 6f  ne shifts that o
22780 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20  perator over to 
22790 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  B..*/.void sqlit
227a0 65 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f  e3SrcListShiftJo
227b0 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a  inType(SrcList *
227c0 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
227d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
227e0 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69  r(i=p->nSrc-1; i
227f0 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
22800 70 2d 3e 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74  p->a[i].fg.joint
22810 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e  ype = p->a[i-1].
22820 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  fg.jointype;.   
22830 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 66   }.    p->a[0].f
22840 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  g.jointype = 0;.
22850 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
22860 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
22870 66 6f 72 20 61 20 42 45 47 49 4e 20 73 74 61 74  for a BEGIN stat
22880 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
22890 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73  qlite3BeginTrans
228a0 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
228b0 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b  arse, int type){
228c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
228d0 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
228e0 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   i;..  assert( p
228f0 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62  Parse!=0 );.  db
22900 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
22910 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
22920 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
22930 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
22940 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
22950 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c  ION, "BEGIN", 0,
22960 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   0) ){.    retur
22970 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c  n;.  }.  v = sql
22980 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
22990 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20  se);.  if( !v ) 
229a0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79  return;.  if( ty
229b0 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20  pe!=TK_DEFERRED 
229c0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
229d0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
229e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
229f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54  beAddOp2(v, OP_T
22a00 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28  ransaction, i, (
22a10 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49  type==TK_EXCLUSI
22a20 56 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  VE)+1);.      sq
22a30 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
22a40 65 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  ee(v, i);.    }.
22a50 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
22a60 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 41 75  eAddOp0(v, OP_Au
22a70 74 6f 43 6f 6d 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a  toCommit);.}../*
22a80 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
22a90 45 20 63 6f 64 65 20 66 6f 72 20 61 20 43 4f 4d  E code for a COM
22aa0 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20  MIT or ROLLBACK 
22ab0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 43 6f  statement..** Co
22ac0 64 65 20 66 6f 72 20 52 4f 4c 4c 42 41 43 4b 20  de for ROLLBACK 
22ad0 69 73 20 67 65 6e 65 72 61 74 65 64 20 69 66 20  is generated if 
22ae0 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41  eType==TK_ROLLBA
22af0 43 4b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  CK.  Otherwise.*
22b00 2a 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  * code is genera
22b10 74 65 64 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54  ted for a COMMIT
22b20 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22b30 33 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  3EndTransaction(
22b40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
22b50 6e 74 20 65 54 79 70 65 29 7b 0a 20 20 56 64 62  nt eType){.  Vdb
22b60 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 73 52 6f  e *v;.  int isRo
22b70 6c 6c 62 61 63 6b 3b 0a 0a 20 20 61 73 73 65 72  llback;..  asser
22b80 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
22b90 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
22ba0 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ->db!=0 );.  ass
22bb0 65 72 74 28 20 65 54 79 70 65 3d 3d 54 4b 5f 43  ert( eType==TK_C
22bc0 4f 4d 4d 49 54 20 7c 7c 20 65 54 79 70 65 3d 3d  OMMIT || eType==
22bd0 54 4b 5f 45 4e 44 20 7c 7c 20 65 54 79 70 65 3d  TK_END || eType=
22be0 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  =TK_ROLLBACK );.
22bf0 20 20 69 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 65    isRollback = e
22c00 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43  Type==TK_ROLLBAC
22c10 4b 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  K;.  if( sqlite3
22c20 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
22c30 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
22c40 54 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20 69 73  TION, .       is
22c50 52 6f 6c 6c 62 61 63 6b 20 3f 20 22 52 4f 4c 4c  Rollback ? "ROLL
22c60 42 41 43 4b 22 20 3a 20 22 43 4f 4d 4d 49 54 22  BACK" : "COMMIT"
22c70 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  , 0, 0) ){.    r
22c80 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d  eturn;.  }.  v =
22c90 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
22ca0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
22cb0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
22cc0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
22cd0 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 69  AutoCommit, 1, i
22ce0 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d 0a  sRollback);.  }.
22cf0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
22d00 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
22d10 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
22d20 68 65 6e 20 69 74 20 70 61 72 73 65 73 20 61 20  hen it parses a 
22d30 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74  command to creat
22d40 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72  e,.** release or
22d50 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c   rollback an SQL
22d60 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a   savepoint. .*/.
22d70 76 6f 69 64 20 73 71 6c 69 74 65 33 53 61 76 65  void sqlite3Save
22d80 70 6f 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61  point(Parse *pPa
22d90 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b  rse, int op, Tok
22da0 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
22db0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ar *zName = sqli
22dc0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
22dd0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
22de0 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
22df0 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
22e00 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
22e10 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
22e20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
22e30 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
22e40 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
22e50 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d  r * const az[] =
22e60 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52 45 4c   { "BEGIN", "REL
22e70 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b  EASE", "ROLLBACK
22e80 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  " };.    assert(
22e90 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49   !SAVEPOINT_BEGI
22ea0 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52  N && SAVEPOINT_R
22eb0 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53 41 56  ELEASE==1 && SAV
22ec0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d  EPOINT_ROLLBACK=
22ed0 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  =2 );.#endif.   
22ee0 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c 69 74   if( !v || sqlit
22ef0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
22f00 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56 45 50  se, SQLITE_SAVEP
22f10 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e  OINT, az[op], zN
22f20 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ame, 0) ){.     
22f30 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
22f40 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
22f50 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
22f60 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
22f70 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
22f80 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70  OP_Savepoint, op
22f90 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50  , 0, 0, zName, P
22fa0 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
22fb0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
22fc0 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  re the TEMP data
22fd0 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64  base is open and
22fe0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
22ff0 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  se.  Return.** t
23000 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
23010 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20  ors.  Leave any 
23020 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
23030 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
23040 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
23050 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
23060 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50  tabase(Parse *pP
23070 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
23080 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
23090 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62  b;.  if( db->aDb
230a0 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70  [1].pBt==0 && !p
230b0 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
230c0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
230d0 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20    Btree *pBt;.  
230e0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
230f0 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20  nt flags = .    
23100 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
23110 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20  N_READWRITE |.  
23120 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
23130 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
23140 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
23150 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20  EN_EXCLUSIVE |. 
23160 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
23170 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
23180 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  SE |.          S
23190 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
231a0 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  DB;..    rc = sq
231b0 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64  lite3BtreeOpen(d
231c0 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20  b->pVfs, 0, db, 
231d0 26 70 42 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b  &pBt, 0, flags);
231e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
231f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23200 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
23210 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
23220 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
23230 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20  ary database ". 
23240 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72         "file for
23250 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61   storing tempora
23260 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ry tables");.   
23270 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
23280 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
23290 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62   1;.    }.    db
232a0 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70  ->aDb[1].pBt = p
232b0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
232c0 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
232d0 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51  ma );.    if( SQ
232e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69  LITE_NOMEM==sqli
232f0 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
23300 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78  ize(pBt, db->nex
23310 74 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30  tPagesize, -1, 0
23320 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
23330 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
23340 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
23350 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
23360 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
23370 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
23380 68 61 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  hat the schema c
23390 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e 65 65 64 20  ookie will need 
233a0 74 6f 20 62 65 20 76 65 72 69 66 69 65 64 0a 2a  to be verified.*
233b0 2a 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 69  * for database i
233c0 44 62 2e 20 20 54 68 65 20 63 6f 64 65 20 74 6f  Db.  The code to
233d0 20 61 63 74 75 61 6c 6c 79 20 76 65 72 69 66 79   actually verify
233e0 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
233f0 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63 63 75 72  ie.** will occur
23400 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
23410 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56 44 42  he top-level VDB
23420 45 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 67 65  E and will be ge
23430 6e 65 72 61 74 65 64 0a 2a 2a 20 6c 61 74 65 72  nerated.** later
23440 2c 20 62 79 20 73 71 6c 69 74 65 33 46 69 6e 69  , by sqlite3Fini
23450 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76  shCoding()..*/.v
23460 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56  oid sqlite3CodeV
23470 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73  erifySchema(Pars
23480 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
23490 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  Db){.  Parse *pT
234a0 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
234b0 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
234c0 50 61 72 73 65 29 3b 0a 0a 20 20 61 73 73 65 72  Parse);..  asser
234d0 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
234e0 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62  <pParse->db->nDb
234f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
23500 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
23510 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62  b].pBt!=0 || iDb
23520 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
23530 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f   iDb<SQLITE_MAX_
23540 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20  ATTACHED+2 );.  
23550 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
23560 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 70  chemaMutexHeld(p
23570 50 61 72 73 65 2d 3e 64 62 2c 20 69 44 62 2c 20  Parse->db, iDb, 
23580 30 29 20 29 3b 0a 20 20 69 66 28 20 44 62 4d 61  0) );.  if( DbMa
23590 73 6b 54 65 73 74 28 70 54 6f 70 6c 65 76 65 6c  skTest(pToplevel
235a0 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44  ->cookieMask, iD
235b0 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44 62 4d  b)==0 ){.    DbM
235c0 61 73 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c  askSet(pToplevel
235d0 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44  ->cookieMask, iD
235e0 62 29 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49  b);.    if( !OMI
235f0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
23600 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
23610 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
23620 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a  ase(pToplevel);.
23630 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
23640 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  ** If argument z
23650 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  Db is NULL, then
23660 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64   call sqlite3Cod
23670 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 29 20  eVerifySchema() 
23680 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 61 74 74  for each .** att
23690 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2e 20  ached database. 
236a0 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b  Otherwise, invok
236b0 65 20 69 74 20 66 6f 72 20 74 68 65 20 64 61 74  e it for the dat
236c0 61 62 61 73 65 20 6e 61 6d 65 64 20 7a 44 62 20  abase named zDb 
236d0 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
236e0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e  lite3CodeVerifyN
236f0 61 6d 65 64 53 63 68 65 6d 61 28 50 61 72 73 65  amedSchema(Parse
23700 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
23710 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71  char *zDb){.  sq
23720 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
23730 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b  se->db;.  int i;
23740 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
23750 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
23760 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
23770 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
23780 70 44 62 2d 3e 70 42 74 20 26 26 20 28 21 7a 44  pDb->pBt && (!zD
23790 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53  b || 0==sqlite3S
237a0 74 72 49 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d  trICmp(zDb, pDb-
237b0 3e 7a 44 62 53 4e 61 6d 65 29 29 20 29 7b 0a 20  >zDbSName)) ){. 
237c0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
237d0 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
237e0 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  rse, i);.    }. 
237f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
23800 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
23810 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72  hat prepares for
23820 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74   doing an operat
23830 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  ion that.** migh
23840 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74  t change the dat
23850 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abase..**.** Thi
23860 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
23870 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
23880 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  on if we are not
23890 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a   already within.
238a0 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
238b0 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72  .  If we are alr
238c0 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72  eady within a tr
238d0 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
238e0 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  a checkpoint.** 
238f0 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65  is set if the se
23900 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d  tStatement param
23910 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41  eter is true.  A
23920 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
23930 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72  ld.** be set for
23940 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74   operations that
23950 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65   might fail (due
23960 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   to a constraint
23970 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  ) part of.** the
23980 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64   way through and
23990 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64   which will need
239a0 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72   to undo some wr
239b0 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76  ites without hav
239c0 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61  ing to.** rollba
239d0 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ck the whole tra
239e0 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f  nsaction.  For o
239f0 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20  perations where 
23a00 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
23a10 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65  ** can be checke
23a20 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
23a30 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
23a40 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
23a50 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65  t is never.** ne
23a60 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
23a70 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20  a write and the 
23a80 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
23a90 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f  d not be set..*/
23aa0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
23ab0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
23ac0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
23ad0 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74  int setStatement
23ae0 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61  , int iDb){.  Pa
23af0 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
23b00 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
23b10 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
23b20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
23b30 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
23b40 20 69 44 62 29 3b 0a 20 20 44 62 4d 61 73 6b 53   iDb);.  DbMaskS
23b50 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72  et(pToplevel->wr
23b60 69 74 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20  iteMask, iDb);. 
23b70 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75   pToplevel->isMu
23b80 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65 74 53  ltiWrite |= setS
23b90 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a  tatement;.}../*.
23ba0 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
23bb0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63   the statement c
23bc0 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
23bd0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69 67 68  onstruction migh
23be0 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20  t write.** more 
23bf0 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28  than one entry (
23c00 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e  example: deletin
23c10 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20 69  g one row then i
23c20 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68 65 72  nserting another
23c30 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d  ,.** inserting m
23c40 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69 6e 20  ultiple rows in 
23c50 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65  a table, or inse
23c60 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e 64 20  rting a row and 
23c70 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e 29 0a  index entries.).
23c80 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74 20 6f  ** If an abort o
23c90 63 63 75 72 73 20 61 66 74 65 72 20 73 6f 6d 65  ccurs after some
23ca0 20 6f 66 20 74 68 65 73 65 20 77 72 69 74 65 73   of these writes
23cb0 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c   have completed,
23cc0 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a   then it will.**
23cd0 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
23ce0 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65   undo the comple
23cf0 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76  ted writes..*/.v
23d00 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69  oid sqlite3Multi
23d10 57 72 69 74 65 28 50 61 72 73 65 20 2a 70 50 61  Write(Parse *pPa
23d20 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  rse){.  Parse *p
23d30 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
23d40 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
23d50 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c  pParse);.  pTopl
23d60 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69  evel->isMultiWri
23d70 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  te = 1;.}../* .*
23d80 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
23d90 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ator calls this 
23da0 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20 64 69  routine if is di
23db0 73 63 6f 76 65 72 73 20 74 68 61 74 20 69 74 20  scovers that it 
23dc0 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74  is.** possible t
23dd0 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74 65 6d  o abort a statem
23de0 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d  ent prior to com
23df0 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64  pletion.  In ord
23e00 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72  er to .** perfor
23e10 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77 69 74  m this abort wit
23e20 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e 67 20  hout corrupting 
23e30 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 77 65  the database, we
23e40 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a   need to make.**
23e50 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73   sure that the s
23e60 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72 6f 74  tatement is prot
23e70 65 63 74 65 64 20 62 79 20 61 20 73 74 61 74 65  ected by a state
23e80 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
23e90 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61  ..**.** Technica
23ea0 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65  lly, we only nee
23eb0 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 79  d to set the may
23ec0 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20 74 68  Abort flag if th
23ed0 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69 74  e.** isMultiWrit
23ee0 65 20 66 6c 61 67 20 77 61 73 20 70 72 65 76 69  e flag was previ
23ef0 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68 65 72  ously set.  Ther
23f00 65 20 69 73 20 61 20 74 69 6d 65 20 64 65 70 65  e is a time depe
23f10 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74  ndency.** such t
23f20 68 61 74 20 74 68 65 20 61 62 6f 72 74 20 6d 75  hat the abort mu
23f30 73 74 20 6f 63 63 75 72 20 61 66 74 65 72 20 74  st occur after t
23f40 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e 20 20  he multiwrite.  
23f50 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f  This makes.** so
23f60 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  me statements in
23f70 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45 50 4c  volving the REPL
23f80 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  ACE conflict res
23f90 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
23fa0 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65  m.** go a little
23fb0 20 66 61 73 74 65 72 2e 20 20 42 75 74 20 74 61   faster.  But ta
23fc0 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65 20 6f  king advantage o
23fd0 66 20 74 68 69 73 20 74 69 6d 65 20 64 65 70 65  f this time depe
23fe0 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20  ndency.** makes 
23ff0 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c  it more difficul
24000 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20  t to prove that 
24010 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f 72 72  the code is corr
24020 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74  ect (in .** part
24030 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65 76 65  icular, it preve
24040 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72 69 74  nts us from writ
24050 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69 76 65  ing an effective
24060 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
24070 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41 73 73  on of sqlite3Ass
24080 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29 20 61  ertMayAbort()) a
24090 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20 63 68  nd so we have ch
240a0 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20  osen.** to take 
240b0 74 68 65 20 73 61 66 65 20 72 6f 75 74 65 20 61  the safe route a
240c0 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70 74 69  nd skip the opti
240d0 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  mization..*/.voi
240e0 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72  d sqlite3MayAbor
240f0 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  t(Parse *pParse)
24100 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
24110 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
24120 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
24130 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  se);.  pToplevel
24140 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a  ->mayAbort = 1;.
24150 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
24160 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20 63 61   OP_Halt that ca
24170 75 73 65 73 20 74 68 65 20 76 64 62 65 20 74 6f  uses the vdbe to
24180 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
24190 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20  E_CONSTRAINT.** 
241a0 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72  error. The onErr
241b0 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 74  or parameter det
241c0 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 28 69  ermines which (i
241d0 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20 73 74  f any) of the st
241e0 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f  atement.** and/o
241f0 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  r current transa
24200 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
24210 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  back..*/.void sq
24220 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
24230 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
24240 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
24250 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
24260 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 20 20   int errCode,   
24270 20 20 20 2f 2a 20 65 78 74 65 6e 64 65 64 20 65     /* extended e
24280 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69  rror code */.  i
24290 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
242a0 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74   /* Constraint t
242b0 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  ype */.  char *p
242c0 34 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72  4,         /* Er
242d0 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20  ror message */. 
242e0 20 69 38 20 70 34 74 79 70 65 2c 20 20 20 20 20   i8 p4type,     
242f0 20 20 20 2f 2a 20 50 34 5f 53 54 41 54 49 43 20     /* P4_STATIC 
24300 6f 72 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 20  or P4_TRANSIENT 
24310 2a 2f 0a 20 20 75 38 20 70 35 45 72 72 6d 73 67  */.  u8 p5Errmsg
24320 20 20 20 20 20 20 20 2f 2a 20 50 35 5f 45 72 72         /* P5_Err
24330 4d 73 67 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  Msg type */.){. 
24340 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
24350 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
24360 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65 72  );.  assert( (er
24370 72 43 6f 64 65 26 30 78 66 66 29 3d 3d 53 51 4c  rCode&0xff)==SQL
24380 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29  ITE_CONSTRAINT )
24390 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d  ;.  if( onError=
243a0 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
243b0 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
243c0 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20  (pParse);.  }.  
243d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
243e0 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72  4(v, OP_Halt, er
243f0 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20  rCode, onError, 
24400 30 2c 20 70 34 2c 20 70 34 74 79 70 65 29 3b 0a  0, p4, p4type);.
24410 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
24420 6e 67 65 50 35 28 76 2c 20 70 35 45 72 72 6d 73  ngeP5(v, p5Errms
24430 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64  g);.}../*.** Cod
24440 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65  e an OP_Halt due
24450 20 74 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52   to UNIQUE or PR
24460 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
24470 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a  aint violation..
24480 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55  */.void sqlite3U
24490 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28  niqueConstraint(
244a0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
244b0 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
244c0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
244d0 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
244e0 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70  * Constraint typ
244f0 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
24500 64 78 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  dx       /* The 
24510 69 6e 64 65 78 20 74 68 61 74 20 74 72 69 67 67  index that trigg
24520 65 72 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69  ers the constrai
24530 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
24540 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a  *zErr;.  int j;.
24550 20 20 53 74 72 41 63 63 75 6d 20 65 72 72 4d 73    StrAccum errMs
24560 67 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  g;.  Table *pTab
24570 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b   = pIdx->pTable;
24580 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ..  sqlite3StrAc
24590 63 75 6d 49 6e 69 74 28 26 65 72 72 4d 73 67 2c  cumInit(&errMsg,
245a0 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20   pParse->db, 0, 
245b0 30 2c 20 32 30 30 29 3b 0a 20 20 69 66 28 20 70  0, 200);.  if( p
245c0 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 7b  Idx->aColExpr ){
245d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72  .    sqlite3_str
245e0 5f 61 70 70 65 6e 64 66 28 26 65 72 72 4d 73 67  _appendf(&errMsg
245f0 2c 20 22 69 6e 64 65 78 20 27 25 71 27 22 2c 20  , "index '%q'", 
24600 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pIdx->zName);.  
24610 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 6a  }else{.    for(j
24620 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; j<pIdx->nKey
24630 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
24640 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
24650 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
24660 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20  >aiColumn[j]>=0 
24670 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  );.      zCol = 
24680 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d  pTab->aCol[pIdx-
24690 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  >aiColumn[j]].zN
246a0 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  ame;.      if( j
246b0 20 29 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61   ) sqlite3_str_a
246c0 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22  ppend(&errMsg, "
246d0 2c 20 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 73  , ", 2);.      s
246e0 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
246f0 64 61 6c 6c 28 26 65 72 72 4d 73 67 2c 20 70 54  dall(&errMsg, pT
24700 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
24710 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
24720 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2e  pend(&errMsg, ".
24730 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", 1);.      sql
24740 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61  ite3_str_appenda
24750 6c 6c 28 26 65 72 72 4d 73 67 2c 20 7a 43 6f 6c  ll(&errMsg, zCol
24760 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  );.    }.  }.  z
24770 45 72 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Err = sqlite3Str
24780 41 63 63 75 6d 46 69 6e 69 73 68 28 26 65 72 72  AccumFinish(&err
24790 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 48  Msg);.  sqlite3H
247a0 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  altConstraint(pP
247b0 61 72 73 65 2c 20 0a 20 20 20 20 49 73 50 72 69  arse, .    IsPri
247c0 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64  maryKeyIndex(pId
247d0 78 29 20 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53  x) ? SQLITE_CONS
247e0 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
247f0 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y .             
24800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
24810 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
24820 4e 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f  NT_UNIQUE,.    o
24830 6e 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34  nError, zErr, P4
24840 5f 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e  _DYNAMIC, P5_Con
24850 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a  straintUnique);.
24860 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  }.../*.** Code a
24870 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f  n OP_Halt due to
24880 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69   non-unique rowi
24890 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
248a0 65 33 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e  e3RowidConstrain
248b0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
248c0 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
248d0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
248e0 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
248f0 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73   /* Conflict res
24900 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
24910 6d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  m */.  Table *pT
24920 61 62 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ab       /* The 
24930 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6e  table with the n
24940 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 20  on-unique rowid 
24950 2a 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a  */ .){.  char *z
24960 4d 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Msg;.  int rc;. 
24970 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79   if( pTab->iPKey
24980 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20  >=0 ){.    zMsg 
24990 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
249a0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73  (pParse->db, "%s
249b0 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .%s", pTab->zNam
249c0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
249d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
249e0 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50  b->aCol[pTab->iP
249f0 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Key].zName);.   
24a00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e   rc = SQLITE_CON
24a10 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
24a20 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EY;.  }else{.   
24a30 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
24a40 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
24a50 62 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c 20 70  b, "%s.rowid", p
24a60 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
24a70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e   rc = SQLITE_CON
24a80 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20  STRAINT_ROWID;. 
24a90 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74   }.  sqlite3Halt
24aa0 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
24ab0 65 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20  e, rc, onError, 
24ac0 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
24ad0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24ae0 20 20 20 20 20 20 20 20 20 20 50 35 5f 43 6f 6e            P5_Con
24af0 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a  straintUnique);.
24b00 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
24b10 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20  o see if pIndex 
24b20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  uses the collati
24b30 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
24b40 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72  l.  Return.** tr
24b50 75 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e  ue if it does an
24b60 64 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f  d false if it do
24b70 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64  es not..*/.#ifnd
24b80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
24b90 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e  EINDEX.static in
24ba0 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  t collationMatch
24bb0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f  (const char *zCo
24bc0 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ll, Index *pInde
24bd0 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  x){.  int i;.  a
24be0 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20  ssert( zColl!=0 
24bf0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
24c00 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pIndex->nColumn;
24c10 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   i++){.    const
24c20 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65   char *z = pInde
24c30 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  x->azColl[i];.  
24c40 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 7c    assert( z!=0 |
24c50 7c 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  | pIndex->aiColu
24c60 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69  mn[i]<0 );.    i
24c70 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  f( pIndex->aiCol
24c80 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d  umn[i]>=0 && 0==
24c90 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
24ca0 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
24cb0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
24cc0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
24cd0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
24ce0 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  * Recompute all 
24cf0 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20  indices of pTab 
24d00 74 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c  that use the col
24d10 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
24d20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f  pColl..** If pCo
24d30 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
24d40 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
24d50 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66   of pTab..*/.#if
24d60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24d70 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
24d80 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c  void reindexTabl
24d90 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
24da0 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68   Table *pTab, ch
24db0 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29  ar const *zColl)
24dc0 7b 0a 20 20 69 66 28 20 21 49 73 56 69 72 74 75  {.  if( !IsVirtu
24dd0 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
24de0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
24df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
24e00 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  n index associat
24e10 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a  ed with pTab */.
24e20 0a 20 20 20 20 66 6f 72 28 70 49 6e 64 65 78 3d  .    for(pIndex=
24e30 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
24e40 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e  ndex; pIndex=pIn
24e50 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  dex->pNext){.   
24e60 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20     if( zColl==0 
24e70 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63  || collationMatc
24e80 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29  h(zColl, pIndex)
24e90 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
24ea0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
24eb0 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
24ec0 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
24ed0 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 73  hema);.        s
24ee0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
24ef0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
24f00 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  , 0, iDb);.     
24f10 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
24f20 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
24f30 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 20  ndex, -1);.     
24f40 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23   }.    }.  }.}.#
24f50 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
24f60 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
24f70 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  es of all tables
24f80 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
24f90 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69  s where the.** i
24fa0 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63  ndices use the c
24fb0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
24fc0 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f  e pColl.  If pCo
24fd0 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
24fe0 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69  pute.** all indi
24ff0 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a  ces everywhere..
25000 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
25010 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
25020 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64  tatic void reind
25030 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72 73  exDatabases(Pars
25040 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20  e *pParse, char 
25050 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20  const *zColl){. 
25060 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
25070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25080 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  A single databas
25090 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
250a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250b0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
250c0 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
250d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
250e0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
250f0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
25100 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
25110 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20   HashElem *k;   
25120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25130 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
25140 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a   tables in pDb *
25150 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
25160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25170 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
25180 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20  e database */.. 
25190 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
251a0 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
251b0 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f 2a 20  exes(db) );  /* 
251c0 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68 65 6d  Needed for schem
251d0 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f  a access */.  fo
251e0 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d  r(iDb=0, pDb=db-
251f0 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  >aDb; iDb<db->nD
25200 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29  b; iDb++, pDb++)
25210 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44  {.    assert( pD
25220 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  b!=0 );.    for(
25230 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  k=sqliteHashFirs
25240 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
25250 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b  >tblHash);  k; k
25260 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
25270 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  k)){.      pTab 
25280 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65  = (Table*)sqlite
25290 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20  HashData(k);.   
252a0 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
252b0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43  pParse, pTab, zC
252c0 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  oll);.    }.  }.
252d0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
252e0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
252f0 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f  r the REINDEX co
25300 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  mmand..**.**    
25310 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20      REINDEX     
25320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25330 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20         -- 1.**  
25340 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c        REINDEX  <
25350 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20  collation>      
25360 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a           -- 2.**
25370 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
25380 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74   ?<database>.?<t
25390 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a  ablename>  -- 3.
253a0 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
253b0 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
253c0 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20  <indexname>  -- 
253d0 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63  4.**.** Form 1 c
253e0 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65  auses all indice
253f0 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  s in all attache
25400 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62  d databases to b
25410 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f  e rebuilt..** Fo
25420 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c  rm 2 rebuilds al
25430 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
25440 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
25450 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a  use the named.**
25460 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
25470 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e  ion.  Forms 3 an
25480 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20  d 4 rebuild the 
25490 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61  named index or a
254a0 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73  ll.** indices as
254b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
254c0 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a  e named table..*
254d0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
254e0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f  _OMIT_REINDEX.vo
254f0 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65  id sqlite3Reinde
25500 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
25510 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
25520 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a  Token *pName2){.
25530 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
25540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
25550 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
25560 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65  nce to be reinde
25570 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  xed, or NULL */.
25580 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
25590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
255a0 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65   Name of a table
255b0 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63   or index */.  c
255c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20  onst char *zDb; 
255d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
255e0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
255f0 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  se */.  Table *p
25600 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
25610 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
25620 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
25630 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
25640 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
25650 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f  /* An index asso
25660 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62  ciated with pTab
25670 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25690 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
256a0 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
256b0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
256c0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
256d0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
256e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
256f0 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b  Token *pObjName;
25700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25710 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
25720 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20   or index to be 
25730 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20  reindexed */..  
25740 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
25750 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
25760 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
25770 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
25780 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
25790 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
257a0 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
257b0 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
257c0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
257d0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
257e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
257f0 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d  }..  if( pName1=
25800 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  =0 ){.    reinde
25810 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
25820 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  e, 0);.    retur
25830 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e  n;.  }else if( N
25840 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20  EVER(pName2==0) 
25850 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20  || pName2->z==0 
25860 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  ){.    char *zCo
25870 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ll;.    assert( 
25880 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20  pName1->z );.   
25890 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
258a0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
258b0 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31  arse->db, pName1
258c0 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c  );.    if( !zCol
258d0 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  l ) return;.    
258e0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
258f0 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
25900 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30  NC(db), zColl, 0
25910 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
25920 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65   ){.      reinde
25930 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
25940 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  e, zColl);.     
25950 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
25960 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  b, zColl);.     
25970 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
25980 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
25990 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
259a0 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
259b0 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
259c0 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
259d0 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a  e2, &pObjName);.
259e0 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
259f0 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  turn;.  z = sqli
25a00 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
25a10 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a  (db, pObjName);.
25a20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
25a30 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d  urn;.  zDb = db-
25a40 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
25a50 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  me;.  pTab = sql
25a60 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
25a70 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  , z, zDb);.  if(
25a80 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69   pTab ){.    rei
25a90 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
25aa0 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , pTab, 0);.    
25ab0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
25ac0 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , z);.    return
25ad0 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
25ae0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
25af0 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  x(db, z, zDb);. 
25b00 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
25b10 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e  b, z);.  if( pIn
25b20 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
25b30 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
25b40 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
25b50 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
25b60 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
25b70 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
25b80 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
25b90 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   }.  sqlite3Erro
25ba0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
25bb0 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79  able to identify
25bc0 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62   the object to b
25bd0 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d  e reindexed");.}
25be0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
25bf0 65 74 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20  eturn a KeyInfo 
25c00 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69  structure that i
25c10 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
25c20 72 20 74 68 65 20 67 69 76 65 6e 20 49 6e 64 65  r the given Inde
25c30 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  x..**.** The cal
25c40 6c 65 72 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b  ler should invok
25c50 65 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  e sqlite3KeyInfo
25c60 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 72  Unref() on the r
25c70 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 0a 2a  eturned object.*
25c80 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 66 69  * when it has fi
25c90 6e 69 73 68 65 64 20 75 73 69 6e 67 20 69 74 2e  nished using it.
25ca0 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c  .*/.KeyInfo *sql
25cb0 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
25cc0 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
25cd0 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
25ce0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
25cf0 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c  Col = pIdx->nCol
25d00 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20  umn;.  int nKey 
25d10 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  = pIdx->nKeyCol;
25d20 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
25d30 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
25d40 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b  nErr ) return 0;
25d50 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 75 6e 69  .  if( pIdx->uni
25d60 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  qNotNull ){.    
25d70 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65  pKey = sqlite3Ke
25d80 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73  yInfoAlloc(pPars
25d90 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f  e->db, nKey, nCo
25da0 6c 2d 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65  l-nKey);.  }else
25db0 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  {.    pKey = sql
25dc0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
25dd0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 43 6f  (pParse->db, nCo
25de0 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  l, 0);.  }.  if(
25df0 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73   pKey ){.    ass
25e00 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
25e10 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
25e20 4b 65 79 29 20 29 3b 0a 20 20 20 20 66 6f 72 28  Key) );.    for(
25e30 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
25e40 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
25e50 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64  har *zColl = pId
25e60 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  x->azColl[i];.  
25e70 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b      pKey->aColl[
25e80 69 5d 20 3d 20 7a 43 6f 6c 6c 3d 3d 73 71 6c 69  i] = zColl==sqli
25e90 74 65 33 53 74 72 42 49 4e 41 52 59 20 3f 20 30  te3StrBINARY ? 0
25ea0 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   :.             
25eb0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
25ec0 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
25ed0 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a  pParse, zColl);.
25ee0 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72        pKey->aSor
25ef0 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64 78  tOrder[i] = pIdx
25f00 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b  ->aSortOrder[i];
25f10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
25f20 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
25f30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
25f40 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  rse->rc==SQLITE_
25f50 45 52 52 4f 52 5f 4d 49 53 53 49 4e 47 5f 43 4f  ERROR_MISSING_CO
25f60 4c 4c 53 45 51 20 29 3b 0a 20 20 20 20 20 20 69  LLSEQ );.      i
25f70 66 28 20 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72  f( pIdx->bNoQuer
25f80 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
25f90 2f 2a 20 44 65 61 63 74 69 76 61 74 65 20 74 68  /* Deactivate th
25fa0 65 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  e index because 
25fb0 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 75  it contains an u
25fc0 6e 6b 6e 6f 77 6e 20 63 6f 6c 6c 61 74 69 6e 67  nknown collating
25fd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 71 75  .        ** sequ
25fe0 65 6e 63 65 2e 20 20 54 68 65 20 6f 6e 6c 79 20  ence.  The only 
25ff0 77 61 79 20 74 6f 20 72 65 61 63 74 69 76 65 20  way to reactive 
26000 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 6f 20  the index is to 
26010 72 65 6c 6f 61 64 20 74 68 65 0a 20 20 20 20 20  reload the.     
26020 20 20 20 2a 2a 20 73 63 68 65 6d 61 2e 20 20 41     ** schema.  A
26030 64 64 69 6e 67 20 74 68 65 20 6d 69 73 73 69 6e  dding the missin
26040 67 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  g collating sequ
26050 65 6e 63 65 20 6c 61 74 65 72 20 64 6f 65 73 20  ence later does 
26060 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  not.        ** r
26070 65 61 63 74 69 76 65 20 74 68 65 20 69 6e 64 65  eactive the inde
26080 78 2e 20 20 54 68 65 20 61 70 70 6c 69 63 61 74  x.  The applicat
26090 69 6f 6e 20 68 61 64 20 74 68 65 20 63 68 61 6e  ion had the chan
260a0 63 65 20 74 6f 20 72 65 67 69 73 74 65 72 0a 20  ce to register. 
260b0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 69         ** the mi
260c0 73 73 69 6e 67 20 69 6e 64 65 78 20 75 73 69 6e  ssing index usin
260d0 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d  g the collation-
260e0 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 63 6b 2e  needed callback.
260f0 20 20 46 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a    For.        **
26100 20 73 69 6d 70 6c 69 63 69 74 79 2c 20 53 51 4c   simplicity, SQL
26110 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 67 69 76  ite will not giv
26120 65 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  e the applicatio
26130 6e 20 61 20 73 65 63 6f 6e 64 20 63 68 61 6e 63  n a second chanc
26140 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
26150 20 20 20 20 20 20 70 49 64 78 2d 3e 62 4e 6f 51        pIdx->bNoQ
26160 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  uery = 1;.      
26170 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
26180 51 4c 49 54 45 5f 45 52 52 4f 52 5f 52 45 54 52  QLITE_ERROR_RETR
26190 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  Y;.      }.     
261a0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
261b0 6e 72 65 66 28 70 4b 65 79 29 3b 0a 20 20 20 20  nref(pKey);.    
261c0 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20    pKey = 0;.    
261d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
261e0 4b 65 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Key;.}..#ifndef 
261f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
26200 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  /* .** This rout
26210 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  ine is invoked o
26220 6e 63 65 20 70 65 72 20 43 54 45 20 62 79 20 74  nce per CTE by t
26230 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
26240 70 61 72 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49  parsing a .** WI
26250 54 48 20 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57  TH clause. .*/.W
26260 69 74 68 20 2a 73 71 6c 69 74 65 33 57 69 74 68  ith *sqlite3With
26270 41 64 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Add(.  Parse *pP
26280 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
26290 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
262a0 74 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69  t */.  With *pWi
262b0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  th,            /
262c0 2a 20 45 78 69 73 74 69 6e 67 20 57 49 54 48 20  * Existing WITH 
262d0 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20  clause, or NULL 
262e0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
262f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
26300 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d  Name of the comm
26310 6f 6e 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  on-table */.  Ex
26320 70 72 4c 69 73 74 20 2a 70 41 72 67 6c 69 73 74  prList *pArglist
26330 2c 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61  ,     /* Optiona
26340 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69  l column name li
26350 73 74 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  st for the table
26360 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 51   */.  Select *pQ
26370 75 65 72 79 20 20 20 20 20 20 20 20 20 20 2f 2a  uery          /*
26380 20 51 75 65 72 79 20 75 73 65 64 20 74 6f 20 69   Query used to i
26390 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61  nitialize the ta
263a0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ble */.){.  sqli
263b0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
263c0 2d 3e 64 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e  ->db;.  With *pN
263d0 65 77 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ew;.  char *zNam
263e0 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  e;..  /* Check t
263f0 68 61 74 20 74 68 65 20 43 54 45 20 6e 61 6d 65  hat the CTE name
26400 20 69 73 20 75 6e 69 71 75 65 20 77 69 74 68 69   is unique withi
26410 6e 20 74 68 69 73 20 57 49 54 48 20 63 6c 61 75  n this WITH clau
26420 73 65 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c  se. If.  ** not,
26430 20 73 74 6f 72 65 20 61 6e 20 65 72 72 6f 72 20   store an error 
26440 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72  in the Parse str
26450 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61  ucture. */.  zNa
26460 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
26470 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
26480 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  ->db, pName);.  
26490 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 70 57 69  if( zName && pWi
264a0 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  th ){.    int i;
264b0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
264c0 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b  pWith->nCte; i++
264d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
264e0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d  ite3StrICmp(zNam
264f0 65 2c 20 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a  e, pWith->a[i].z
26500 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
26510 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
26520 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70  Msg(pParse, "dup
26530 6c 69 63 61 74 65 20 57 49 54 48 20 74 61 62 6c  licate WITH tabl
26540 65 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61  e name: %s", zNa
26550 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
26560 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 57   }.  }..  if( pW
26570 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ith ){.    int n
26580 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
26590 57 69 74 68 29 20 2b 20 28 73 69 7a 65 6f 66 28  With) + (sizeof(
265a0 70 57 69 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70  pWith->a[1]) * p
265b0 57 69 74 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20  With->nCte);.   
265c0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
265d0 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69  bRealloc(db, pWi
265e0 74 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  th, nByte);.  }e
265f0 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  lse{.    pNew = 
26600 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
26610 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
26620 70 57 69 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61  pWith));.  }.  a
26630 73 73 65 72 74 28 20 28 70 4e 65 77 21 3d 30 20  ssert( (pNew!=0 
26640 26 26 20 7a 4e 61 6d 65 21 3d 30 29 20 7c 7c 20  && zName!=0) || 
26650 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
26660 20 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d   );..  if( db->m
26670 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
26680 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
26690 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 41 72  stDelete(db, pAr
266a0 67 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  glist);.    sqli
266b0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
266c0 64 62 2c 20 70 51 75 65 72 79 29 3b 0a 20 20 20  db, pQuery);.   
266d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
266e0 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  b, zName);.    p
266f0 4e 65 77 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d  New = pWith;.  }
26700 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
26710 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53  a[pNew->nCte].pS
26720 65 6c 65 63 74 20 3d 20 70 51 75 65 72 79 3b 0a  elect = pQuery;.
26730 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
26740 2d 3e 6e 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20  ->nCte].pCols = 
26750 70 41 72 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e  pArglist;.    pN
26760 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
26770 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ].zName = zName;
26780 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65  .    pNew->a[pNe
26790 77 2d 3e 6e 43 74 65 5d 2e 7a 43 74 65 45 72 72  w->nCte].zCteErr
267a0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
267b0 6e 43 74 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72  nCte++;.  }..  r
267c0 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
267d0 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 63 6f  *.** Free the co
267e0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 57 69  ntents of the Wi
267f0 74 68 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  th object passed
26800 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
26810 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  rgument..*/.void
26820 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65   sqlite3WithDele
26830 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
26840 57 69 74 68 20 2a 70 57 69 74 68 29 7b 0a 20 20  With *pWith){.  
26850 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20  if( pWith ){.   
26860 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
26870 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43  i=0; i<pWith->nC
26880 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
26890 73 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65  struct Cte *pCte
268a0 20 3d 20 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b   = &pWith->a[i];
268b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
268c0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
268d0 20 70 43 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20   pCte->pCols);. 
268e0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
268f0 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74  ctDelete(db, pCt
26900 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  e->pSelect);.   
26910 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
26920 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  (db, pCte->zName
26930 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
26940 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
26950 57 69 74 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  With);.  }.}.#en
26960 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
26970 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 29  SQLITE_OMIT_CTE)
26980 20 2a 2f 0a                                       */.