/ Hex Artifact Content
Login

Artifact 91d548027a54044851299e719d60d6a2b6eaf3e3274678098cb73a6ab8c0fa19:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c40: 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1c50: 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44 69  vel==0 );  /* Di
1c60: 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65 6e  sables and re-en
1c70: 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a 20  ables match */. 
1c80: 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d 20     /* A minimum 
1c90: 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69 73  of one cursor is
1ca0: 20 72 65 71 75 69 72 65 64 20 69 66 20 61 75 74   required if aut
1cb0: 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75 73  oincrement is us
1cc0: 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74 69  ed.    *  See ti
1cd0: 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31 66  cket [a696379c1f
1ce0: 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69 66  08866] */.    if
1cf0: 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 21  ( pParse->pAinc!
1d00: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54  =0 && pParse->nT
1d10: 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d 3e  ab==0 ) pParse->
1d20: 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73 71  nTab = 1;.    sq
1d30: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
1d40: 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a 20  dy(v, pParse);. 
1d50: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1d60: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1d70: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65  else{.    pParse
1d80: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
1d90: 52 4f 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ROR;.  }.}../*.*
1da0: 2a 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72  * Run the parser
1db0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1dc0: 74 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20  tor recursively 
1dd0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65  in order to gene
1de0: 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72  rate.** code for
1df0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
1e00: 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68  nt given onto th
1e10: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61  e end of the pPa
1e20: 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63  rse context.** c
1e30: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
1e40: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68  onstruction.  Wh
1e50: 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73  en the parser is
1e60: 20 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79   run recursively
1e70: 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68  .** this way, th
1e80: 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20  e final OP_Halt 
1e90: 69 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20  is not appended 
1ea0: 61 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61  and other initia
1eb0: 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  lization.** and 
1ec0: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65  finalization ste
1ed0: 70 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62  ps are omitted b
1ee0: 65 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65  ecause those are
1ef0: 20 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65   handling by the
1f00: 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61  .** outermost pa
1f10: 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20  rser..**.** Not 
1f20: 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65  everything is ne
1f30: 73 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61  stable.  This fa
1f40: 63 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e  cility is design
1f50: 65 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20  ed to permit.** 
1f60: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20  INSERT, UPDATE, 
1f70: 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61  and DELETE opera
1f80: 74 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51  tions against SQ
1f90: 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73  LITE_MASTER.  Us
1fa0: 65 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75  e.** care if you
1fb0: 20 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74   decide to try t
1fc0: 6f 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69  o use this routi
1fd0: 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ne for some othe
1fe0: 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76  r purposes..*/.v
1ff0: 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65  oid sqlite3Neste
2000: 64 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50  dParse(Parse *pP
2010: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
2020: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
2030: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
2040: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63   char *zSql;.  c
2050: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
2060: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2070: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2080: 63 68 61 72 20 73 61 76 65 42 75 66 5b 50 41 52  char saveBuf[PAR
2090: 53 45 5f 54 41 49 4c 5f 53 5a 5d 3b 0a 0a 20 20  SE_TAIL_SZ];..  
20a0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
20b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
20c0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73  ert( pParse->nes
20d0: 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65  ted<10 );  /* Ne
20e0: 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c  sting should onl
20f0: 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20  y be of limited 
2100: 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74  depth */.  va_st
2110: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
2120: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
2130: 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a  e3VMPrintf(db, z
2140: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2150: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
2160: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
2170: 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d  return;   /* A m
2180: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
2190: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
21a0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b  pParse->nested++
21b0: 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42  ;.  memcpy(saveB
21c0: 75 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 28 70  uf, PARSE_TAIL(p
21d0: 50 61 72 73 65 29 2c 20 50 41 52 53 45 5f 54 41  Parse), PARSE_TA
21e0: 49 4c 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74  IL_SZ);.  memset
21f0: 28 50 41 52 53 45 5f 54 41 49 4c 28 70 50 61 72  (PARSE_TAIL(pPar
2200: 73 65 29 2c 20 30 2c 20 50 41 52 53 45 5f 54 41  se), 0, PARSE_TA
2210: 49 4c 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  IL_SZ);.  sqlite
2220: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
2230: 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73  e, zSql, &zErrMs
2240: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
2250: 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
2260: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2270: 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d  e(db, zSql);.  m
2280: 65 6d 63 70 79 28 50 41 52 53 45 5f 54 41 49 4c  emcpy(PARSE_TAIL
2290: 28 70 50 61 72 73 65 29 2c 20 73 61 76 65 42 75  (pParse), saveBu
22a0: 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a  f, PARSE_TAIL_SZ
22b0: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73  );.  pParse->nes
22c0: 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51  ted--;.}..#if SQ
22d0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
22e0: 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52  TICATION./*.** R
22f0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54  eturn TRUE if zT
2300: 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65  able is the name
2310: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 74   of the system t
2320: 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73  able that stores
2330: 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20   the.** list of 
2340: 75 73 65 72 73 20 61 6e 64 20 74 68 65 69 72 20  users and their 
2350: 61 63 63 65 73 73 20 63 72 65 64 65 6e 74 69 61  access credentia
2360: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
2370: 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
2380: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2390: 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  le){.  return sq
23a0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
23b0: 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73  able, "sqlite_us
23c0: 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  er")==0;.}.#endi
23d0: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  f../*.** Locate 
23e0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
23f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
2400: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
2410: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
2420: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
2430: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
2440: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
2450: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
2460: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2470: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
2480: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
2490: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
24a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
24b0: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
24c0: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
24d0: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
24e0: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
24f0: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
2500: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
2510: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
2520: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
2530: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
2540: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
2550: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
2560: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2570: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
2580: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
2590: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
25a0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
25b0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
25c0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
25d0: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
25e0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
25f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
2600: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2610: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
2620: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
2630: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
2640: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  ;..  /* All mute
2650: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2660: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2670: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2680: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
2690: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
26a0: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
26b0: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
26c0: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66  texes(db) );.#if
26d0: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
26e0: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a  HENTICATION.  /*
26f0: 20 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20   Only the admin 
2700: 75 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20  user is allowed 
2710: 74 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  to know that the
2720: 20 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62   sqlite_user tab
2730: 6c 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a  le.  ** exists *
2740: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68  /.  if( db->auth
2750: 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48  .authLevel<UAUTH
2760: 5f 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65  _Admin && sqlite
2770: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a  3UserAuthTable(z
2780: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
2790: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
27a0: 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 31 29 7b  ndif.  while(1){
27b0: 0a 20 20 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  .    for(i=OMIT_
27c0: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
27d0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
27e0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
27f0: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
2800: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
2810: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 66  MAIN */.      if
2820: 28 20 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 7c  ( zDatabase==0 |
2830: 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  | sqlite3StrICmp
2840: 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e  (zDatabase, db->
2850: 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29  aDb[j].zDbSName)
2860: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
2870: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
2880: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
2890: 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  , j, 0) );.     
28a0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
28b0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
28c0: 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  j].pSchema->tblH
28d0: 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ash, zName);.   
28e0: 20 20 20 20 20 69 66 28 20 70 20 29 20 72 65 74       if( p ) ret
28f0: 75 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20  urn p;.      }. 
2900: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4e 6f 74 20     }.    /* Not 
2910: 66 6f 75 6e 64 2e 20 20 49 66 20 74 68 65 20 6e  found.  If the n
2920: 61 6d 65 20 77 65 20 77 65 72 65 20 6c 6f 6f 6b  ame we were look
2930: 69 6e 67 20 66 6f 72 20 77 61 73 20 74 65 6d 70  ing for was temp
2940: 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20  .sqlite_master. 
2950: 20 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67     ** then chang
2960: 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 73 71  e the name to sq
2970: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
2980: 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
2990: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
29a0: 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c  e3StrICmp(zName,
29b0: 20 4d 41 53 54 45 52 5f 4e 41 4d 45 29 21 3d 30   MASTER_NAME)!=0
29c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
29d0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
29e0: 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d  p(zDatabase, db-
29f0: 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[1].zDbSName
2a00: 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
2a10: 20 20 7a 4e 61 6d 65 20 3d 20 54 45 4d 50 5f 4d    zName = TEMP_M
2a20: 41 53 54 45 52 5f 4e 41 4d 45 3b 0a 20 20 7d 0a  ASTER_NAME;.  }.
2a30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2a40: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
2a50: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
2a60: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
2a70: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
2a80: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
2a90: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
2aa0: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
2ab0: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
2ac0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
2ad0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
2ae0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
2af0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
2b00: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c  f not found.  Al
2b10: 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65  so leave an.** e
2b20: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
2b30: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
2b40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
2b50: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
2b60: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73  is routine and s
2b70: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2b80: 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
2b90: 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73  * routine leaves
2ba0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2bb0: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
2bc0: 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71  rMsg where.** sq
2bd0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29  lite3FindTable()
2be0: 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61   does not..*/.Ta
2bf0: 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  ble *sqlite3Loca
2c00: 74 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  teTable(.  Parse
2c10: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2c20: 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20    /* context in 
2c30: 77 68 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20  which to report 
2c40: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 33 32 20  errors */.  u32 
2c50: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2c60: 20 20 20 2f 2a 20 4c 4f 43 41 54 45 5f 56 49 45     /* LOCATE_VIE
2c70: 57 20 6f 72 20 4c 4f 43 41 54 45 5f 4e 4f 45 52  W or LOCATE_NOER
2c80: 52 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  R */.  const cha
2c90: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  r *zName,     /*
2ca0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
2cb0: 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  le we are lookin
2cc0: 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  g for */.  const
2cd0: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20   char *zDbase   
2ce0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2cf0: 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68   database.  Migh
2d00: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
2d10: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f    Table *p;..  /
2d20: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
2d30: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
2d40: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2d50: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
2d60: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
2d70: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
2d80: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
2d90: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
2da0: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
2db0: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
2dc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2dd0: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
2de0: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
2df0: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  e->db, zName, zD
2e00: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
2e10: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
2e20: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 66 6c 61 67  har *zMsg = flag
2e30: 73 20 26 20 4c 4f 43 41 54 45 5f 56 49 45 57 20  s & LOCATE_VIEW 
2e40: 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22  ? "no such view"
2e50: 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c   : "no such tabl
2e60: 65 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e";.#ifndef SQLI
2e70: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2e80: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 73 71 6c  ABLE.    if( sql
2e90: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 70  ite3FindDbName(p
2ea0: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 44 62 61 73  Parse->db, zDbas
2eb0: 65 29 3c 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  e)<1 ){.      /*
2ec0: 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 74 68 65   If zName is the
2ed0: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
2ee0: 20 61 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   a table in the 
2ef0: 73 63 68 65 6d 61 20 63 72 65 61 74 65 64 20 75  schema created u
2f00: 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 43 52  sing.      ** CR
2f10: 45 41 54 45 2c 20 74 68 65 6e 20 63 68 65 63 6b  EATE, then check
2f20: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 69 73   to see if it is
2f30: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
2f40: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
2f50: 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20  at.      ** can 
2f60: 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20  be an eponymous 
2f70: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 2a  virtual table. *
2f80: 2f 0a 20 20 20 20 20 20 4d 6f 64 75 6c 65 20 2a  /.      Module *
2f90: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29  pMod = (Module*)
2fa0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2fb0: 26 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4d 6f  &pParse->db->aMo
2fc0: 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  dule, zName);.  
2fd0: 20 20 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20      if( pMod==0 
2fe0: 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  && sqlite3_strni
2ff0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67  cmp(zName, "prag
3000: 6d 61 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20  ma_", 7)==0 ){. 
3010: 20 20 20 20 20 20 20 70 4d 6f 64 20 3d 20 73 71         pMod = sq
3020: 6c 69 74 65 33 50 72 61 67 6d 61 56 74 61 62 52  lite3PragmaVtabR
3030: 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2d 3e  egister(pParse->
3040: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
3050: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4d    }.      if( pM
3060: 6f 64 20 26 26 20 73 71 6c 69 74 65 33 56 74 61  od && sqlite3Vta
3070: 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 49  bEponymousTableI
3080: 6e 69 74 28 70 50 61 72 73 65 2c 20 70 4d 6f 64  nit(pParse, pMod
3090: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
30a0: 75 72 6e 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61  urn pMod->pEpoTa
30b0: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
30c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
30d0: 28 66 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f  (flags & LOCATE_
30e0: 4e 4f 45 52 52 29 3d 3d 30 20 29 7b 0a 20 20 20  NOERR)==0 ){.   
30f0: 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b     if( zDbase ){
3100: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3110: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3120: 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d   "%s: %s.%s", zM
3130: 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d  sg, zDbase, zNam
3140: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
3150: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3160: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3170: 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c   "%s: %s", zMsg,
3180: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
3190: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
31a0: 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
31b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
31c0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
31d0: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
31e0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 2a   identified by *
31f0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
3200: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
3210: 64 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  d sqlite3LocateT
3220: 61 62 6c 65 28 29 2e 20 54 68 65 20 64 69 66 66  able(). The diff
3230: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a  erence between.*
3240: 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  * sqlite3LocateT
3250: 61 62 6c 65 28 29 20 61 6e 64 20 74 68 69 73 20  able() and this 
3260: 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 61 74  function is that
3270: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
3280: 65 73 74 72 69 63 74 73 0a 2a 2a 20 74 68 65 20  estricts.** the 
3290: 73 65 61 72 63 68 20 74 6f 20 73 63 68 65 6d 61  search to schema
32a0: 20 28 70 2d 3e 70 53 63 68 65 6d 61 29 20 69 66   (p->pSchema) if
32b0: 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e   it is not NULL.
32c0: 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79 20   p->pSchema may 
32d0: 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  be.** non-NULL i
32e0: 66 20 69 74 20 69 73 20 70 61 72 74 20 6f 66 20  f it is part of 
32f0: 61 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65  a view or trigge
3300: 72 20 70 72 6f 67 72 61 6d 20 64 65 66 69 6e 69  r program defini
3310: 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c  tion. See.** sql
3320: 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 29  ite3FixSrcList()
3330: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
3340: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c  .Table *sqlite3L
3350: 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 0a  ocateTableItem(.
3360: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3370: 20 0a 20 20 75 33 32 20 66 6c 61 67 73 2c 0a 20   .  u32 flags,. 
3380: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
3390: 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e  item *p.){.  con
33a0: 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  st char *zDb;.  
33b0: 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65  assert( p->pSche
33c0: 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74  ma==0 || p->zDat
33d0: 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66  abase==0 );.  if
33e0: 28 20 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  ( p->pSchema ){.
33f0: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
3400: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
3410: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
3420: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
3430: 7a 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  zDb = pParse->db
3440: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
3450: 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ame;.  }else{.  
3460: 20 20 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61    zDb = p->zData
3470: 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  base;.  }.  retu
3480: 72 6e 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  rn sqlite3Locate
3490: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 66 6c  Table(pParse, fl
34a0: 61 67 73 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a  ags, p->zName, z
34b0: 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  Db);.}../*.** Lo
34c0: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
34d0: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
34e0: 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20  t describes .** 
34f0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
3500: 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  ex given the nam
3510: 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a  e of that index.
3520: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20  ** and the name 
3530: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
3540: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
3550: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75  e index..** Retu
3560: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
3570: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
3580: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
3590: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
35a0: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
35b0: 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74  e.** table and t
35c0: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
35d0: 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72  g index is retur
35e0: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
35f0: 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63  ng.** for duplic
3600: 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  ate index names 
3610: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
3620: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a  earch order is.*
3630: 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  * TEMP first, th
3640: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
3650: 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  y auxiliary data
3660: 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75  bases added.** u
3670: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
3680: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65  command..*/.Inde
3690: 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  x *sqlite3FindIn
36a0: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
36b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
36c0: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
36d0: 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  zDb){.  Index *p
36e0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
36f0: 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20   /* All mutexes 
3700: 61 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  are required for
3710: 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20   schema access. 
3720: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f   Make sure we ho
3730: 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73  ld them. */.  as
3740: 73 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20  sert( zDb!=0 || 
3750: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
3760: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
3770: 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  );.  for(i=OMIT_
3780: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
3790: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  b; i++){.    int
37a0: 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31   j = (i<2) ? i^1
37b0: 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68   : i;  /* Search
37c0: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
37d0: 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20  N */.    Schema 
37e0: 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  *pSchema = db->a
37f0: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  Db[j].pSchema;. 
3800: 20 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65     assert( pSche
3810: 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44  ma );.    if( zD
3820: 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  b && sqlite3StrI
3830: 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62  Cmp(zDb, db->aDb
3840: 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29 20 29 20  [j].zDbSName) ) 
3850: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
3860: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
3870: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
3880: 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20   j, 0) );.    p 
3890: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
38a0: 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  d(&pSchema->idxH
38b0: 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ash, zName);.   
38c0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
38d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
38e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d  }../*.** Reclaim
38f0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64   the memory used
3900: 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a   by an index.*/.
3910: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
3920: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
3930: 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23 69  b, Index *p){.#i
3940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3950: 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69  T_ANALYZE.  sqli
3960: 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61  te3DeleteIndexSa
3970: 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23 65  mples(db, p);.#e
3980: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78  ndif.  sqlite3Ex
3990: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
39a0: 70 50 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a  pPartIdxWhere);.
39b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
39c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 61  tDelete(db, p->a
39d0: 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  ColExpr);.  sqli
39e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
39f0: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66 28  >zColAff);.  if(
3a00: 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20 29 20   p->isResized ) 
3a10: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3a20: 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e 61 7a 43  , (void *)p->azC
3a30: 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  oll);.#ifdef SQL
3a40: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
3a50: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71 6c 69  _OR_STAT4.  sqli
3a60: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f  te3_free(p->aiRo
3a70: 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  wEst);.#endif.  
3a80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3a90: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  , p);.}../*.** F
3aa0: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c  or the index cal
3ab0: 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69  led zIdxName whi
3ac0: 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  ch is found in t
3ad0: 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c  he database iDb,
3ae0: 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20  .** unlike that 
3af0: 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54  index from its T
3b00: 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65  able then remove
3b10: 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a   the index from.
3b20: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  ** the index has
3b30: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
3b40: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75   all memory stru
3b50: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
3b60: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  d.** with the in
3b70: 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
3b80: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
3b90: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  eteIndex(sqlite3
3ba0: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
3bb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e  onst char *zIdxN
3bc0: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
3bd0: 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20 2a 70  Index;.  Hash *p
3be0: 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28  Hash;..  assert(
3bf0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3c00: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3c10: 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d   0) );.  pHash =
3c20: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70   &db->aDb[iDb].p
3c30: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b  Schema->idxHash;
3c40: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
3c50: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  te3HashInsert(pH
3c60: 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30  ash, zIdxName, 0
3c70: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
3c80: 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69  pIndex) ){.    i
3c90: 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  f( pIndex->pTabl
3ca0: 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65  e->pIndex==pInde
3cb0: 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  x ){.      pInde
3cc0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
3cd0: 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  x = pIndex->pNex
3ce0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
3cf0: 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
3d00: 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61      /* Justifica
3d10: 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29  tion of ALWAYS()
3d20: 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75 73  ;  The index mus
3d30: 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73 74  t be on the list
3d40: 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64   of.      ** ind
3d50: 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ices. */.      p
3d60: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
3d70: 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  e->pIndex;.     
3d80: 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
3d90: 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70  ) && p->pNext!=p
3da0: 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e  Index ){ p = p->
3db0: 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20 69  pNext; }.      i
3dc0: 66 28 20 41 4c 57 41 59 53 28 70 20 26 26 20 70  f( ALWAYS(p && p
3dd0: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29  ->pNext==pIndex)
3de0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   ){.        p->p
3df0: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
3e00: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
3e10: 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65    }.    freeInde
3e20: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
3e30: 20 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67   }.  db->mDbFlag
3e40: 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65  s |= DBFLAG_Sche
3e50: 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  maChange;.}../*.
3e60: 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20  ** Look through 
3e70: 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e  the list of open
3e80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
3e90: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64  in db->aDb[] and
3ea0: 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20   if.** any have 
3eb0: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d  been closed, rem
3ec0: 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
3ed0: 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63  e list.  Realloc
3ee0: 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61  ate the.** db->a
3ef0: 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74  Db[] structure t
3f00: 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65  o a smaller size
3f10: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  , if possible..*
3f20: 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68  *.** Entry 0 (th
3f30: 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73  e "main" databas
3f40: 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28  e) and entry 1 (
3f50: 74 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62  the "temp" datab
3f60: 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65  ase).** are neve
3f70: 72 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  r candidates for
3f80: 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64   being collapsed
3f90: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3fa0: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
3fb0: 65 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  eArray(sqlite3 *
3fc0: 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  db){.  int i, j;
3fd0: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
3fe0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3ff0: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
4000: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
4010: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
4020: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
4030: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4040: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a  pDb->zDbSName);.
4050: 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e        pDb->zDbSN
4060: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ame = 0;.      c
4070: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
4080: 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20     if( j<i ){.  
4090: 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d      db->aDb[j] =
40a0: 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20   db->aDb[i];.   
40b0: 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a   }.    j++;.  }.
40c0: 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20    db->nDb = j;. 
40d0: 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20   if( db->nDb<=2 
40e0: 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e  && db->aDb!=db->
40f0: 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20  aDbStatic ){.   
4100: 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53   memcpy(db->aDbS
4110: 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20  tatic, db->aDb, 
4120: 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62  2*sizeof(db->aDb
4130: 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  [0]));.    sqlit
4140: 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d  e3DbFree(db, db-
4150: 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61  >aDb);.    db->a
4160: 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74  Db = db->aDbStat
4170: 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ic;.  }.}../*.**
4180: 20 52 65 73 65 74 20 74 68 65 20 73 63 68 65 6d   Reset the schem
4190: 61 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  a for the databa
41a0: 73 65 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e  se at index iDb.
41b0: 20 20 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65    Also reset the
41c0: 0a 2a 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e  .** TEMP schema.
41d0: 20 20 54 68 65 20 72 65 73 65 74 20 69 73 20 64    The reset is d
41e0: 65 66 65 72 72 65 64 20 69 66 20 64 62 2d 3e 6e  eferred if db->n
41f0: 53 63 68 65 6d 61 4c 6f 63 6b 20 69 73 20 6e 6f  SchemaLock is no
4200: 74 20 7a 65 72 6f 2e 0a 2a 2a 20 44 65 66 65 72  t zero..** Defer
4210: 72 65 64 20 72 65 73 65 74 73 20 6d 61 79 20 62  red resets may b
4220: 65 20 72 75 6e 20 62 79 20 63 61 6c 6c 69 6e 67  e run by calling
4230: 20 77 69 74 68 20 69 44 62 3c 30 2e 0a 2a 2f 0a   with iDb<0..*/.
4240: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
4250: 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74  tOneSchema(sqlit
4260: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29  e3 *db, int iDb)
4270: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
4280: 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
4290: 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62 3e 3d   );..  if( iDb>=
42a0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
42b0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
42c0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
42d0: 20 30 29 20 29 3b 0a 20 20 20 20 44 62 53 65 74   0) );.    DbSet
42e0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62  Property(db, iDb
42f0: 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64  , DB_ResetWanted
4300: 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70  );.    DbSetProp
4310: 65 72 74 79 28 64 62 2c 20 31 2c 20 44 42 5f 52  erty(db, 1, DB_R
4320: 65 73 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 7d  esetWanted);.  }
4330: 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68  ..  if( db->nSch
4340: 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  emaLock==0 ){.  
4350: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
4360: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
4370: 20 20 69 66 28 20 44 62 48 61 73 50 72 6f 70 65    if( DbHasPrope
4380: 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 52 65  rty(db, i, DB_Re
4390: 73 65 74 57 61 6e 74 65 64 29 20 29 7b 0a 20 20  setWanted) ){.  
43a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68        sqlite3Sch
43b0: 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62  emaClear(db->aDb
43c0: 5b 69 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20  [i].pSchema);.  
43d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
43e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61  }../*.** Erase a
43f0: 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d  ll schema inform
4400: 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20 61  ation from all a
4410: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
4420: 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20  s (including.** 
4430: 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d 70  "main" and "temp
4440: 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ") for a single 
4450: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
4460: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
4470: 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65  ite3ResetAllSche
4480: 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28  masOfConnection(
4490: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
44a0: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
44b0: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
44c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
44d0: 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20  >nSchemaLock==0 
44e0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
44f0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
4500: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
4510: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
4520: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 29  ( pDb->pSchema )
4530: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
4540: 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e  chemaClear(pDb->
4550: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
4560: 20 20 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61    }.  db->mDbFla
4570: 67 73 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63  gs &= ~DBFLAG_Sc
4580: 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 73 71  hemaChange;.  sq
4590: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
45a0: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
45b0: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
45c0: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  db);.  sqlite3Co
45d0: 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72  llapseDatabaseAr
45e0: 72 61 79 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ray(db);.}../*.*
45f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4600: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4610: 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a  commit occurs..*
4620: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
4630: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
4640: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
4650: 7b 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73  {.  db->mDbFlags
4660: 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63 68 65   &= ~DBFLAG_Sche
4670: 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  maChange;.}../*.
4680: 2a 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79  ** Delete memory
4690: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
46a0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
46b0: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
46c0: 65 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65  ew (the.** Table
46d0: 2e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a  .aCol[] array)..
46e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
46f0: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
4700: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
4710: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
4720: 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20  int i;.  Column 
4730: 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28  *pCol;.  assert(
4740: 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20   pTable!=0 );.  
4750: 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62  if( (pCol = pTab
4760: 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a  le->aCol)!=0 ){.
4770: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
4780: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
4790: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
47a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
47b0: 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  b, pCol->zName);
47c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
47d0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  prDelete(db, pCo
47e0: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->pDflt);.     
47f0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4800: 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b  b, pCol->zColl);
4810: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4820: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
4830: 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a  ble->aCol);.  }.
4840: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
4850: 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20  the memory data 
4860: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
4870: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
4880: 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20  iven.** Table.  
4890: 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
48a0: 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74  ade to disk by t
48b0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
48c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
48d0: 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65  just deletes the
48e0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e   data structure.
48f0: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e    It does not un
4900: 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c  link.** the tabl
4910: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
4920: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
4930: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
4940: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
4950: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
4960: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
4970: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
4980: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4990: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
49a0: 2a 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61  *.** The db para
49b0: 6d 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61  meter is optiona
49c0: 6c 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65 64  l.  It is needed
49d0: 20 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62   if the Table ob
49e0: 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  ject .** contain
49f0: 73 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  s lookaside memo
4a00: 72 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65  ry.  (Table obje
4a10: 63 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d  cts in the schem
4a20: 61 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  a do not use.** 
4a30: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
4a40: 2c 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d  , but some ephem
4a50: 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63  eral Table objec
4a60: 74 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a  ts do.)  Or the.
4a70: 2a 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72 20  ** db parameter 
4a80: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
4a90: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4aa0: 64 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65  d to measure the
4ab0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20   memory.** used 
4ac0: 62 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  by the Table obj
4ad0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
4ae0: 6f 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  oid SQLITE_NOINL
4af0: 49 4e 45 20 64 65 6c 65 74 65 54 61 62 6c 65 28  INE deleteTable(
4b00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
4b10: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49  le *pTable){.  I
4b20: 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70  ndex *pIndex, *p
4b30: 4e 65 78 74 3b 0a 0a 23 69 66 64 65 66 20 53 51  Next;..#ifdef SQ
4b40: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
4b50: 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  Record the numbe
4b60: 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
4b70: 20 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f 63   lookaside alloc
4b80: 61 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d 61  ations in schema
4b90: 20 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72 69   Tables.  ** pri
4ba0: 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20  or to doing any 
4bb0: 66 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f 6e  free() operation
4bc0: 73 2e 20 20 53 69 6e 63 65 20 73 63 68 65 6d 61  s.  Since schema
4bd0: 20 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 75   Tables do not u
4be0: 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64  se.  ** lookasid
4bf0: 65 2c 20 74 68 69 73 20 6e 75 6d 62 65 72 20 73  e, this number s
4c00: 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65  hould not change
4c10: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b  . */.  int nLook
4c20: 61 73 69 64 65 20 3d 20 30 3b 0a 20 20 69 66 28  aside = 0;.  if(
4c30: 20 64 62 20 26 26 20 28 70 54 61 62 6c 65 2d 3e   db && (pTable->
4c40: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
4c50: 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20  hemeral)==0 ){. 
4c60: 20 20 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20     nLookaside = 
4c70: 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65  sqlite3Lookaside
4c80: 55 73 65 64 28 64 62 2c 20 30 29 3b 0a 20 20 7d  Used(db, 0);.  }
4c90: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65  .#endif..  /* De
4ca0: 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  lete all indices
4cb0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4cc0: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a   this table. */.
4cd0: 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70    for(pIndex = p
4ce0: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
4cf0: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e  Index; pIndex=pN
4d00: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
4d10: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
4d20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
4d30: 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  dex->pSchema==pT
4d40: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 0a 20 20  able->pSchema.  
4d50: 20 20 20 20 20 20 20 7c 7c 20 28 49 73 56 69 72         || (IsVir
4d60: 74 75 61 6c 28 70 54 61 62 6c 65 29 20 26 26 20  tual(pTable) && 
4d70: 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 21  pIndex->idxType!
4d80: 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
4d90: 41 50 50 44 45 46 29 20 29 3b 0a 20 20 20 20 69  APPDEF) );.    i
4da0: 66 28 20 28 64 62 3d 3d 30 20 7c 7c 20 64 62 2d  f( (db==0 || db-
4db0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4dc0: 29 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  ) && !IsVirtual(
4dd0: 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20  pTable) ){.     
4de0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
4df0: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20  Index->zName; . 
4e00: 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20       TESTONLY ( 
4e10: 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20  Index *pOld = ) 
4e20: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
4e30: 74 28 0a 20 20 20 20 20 20 20 20 20 26 70 49 6e  t(.         &pIn
4e40: 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  dex->pSchema->id
4e50: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a  xHash, zName, 0.
4e60: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
4e70: 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20  ssert( db==0 || 
4e80: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
4e90: 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49  exHeld(db, 0, pI
4ea0: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29  ndex->pSchema) )
4eb0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4ec0: 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20  pOld==pIndex || 
4ed0: 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  pOld==0 );.    }
4ee0: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
4ef0: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
4f00: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
4f10: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74   foreign keys at
4f20: 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74  tached to this t
4f30: 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  able. */.  sqlit
4f40: 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70  e3FkDelete(db, p
4f50: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65  Table);..  /* De
4f60: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
4f70: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
4f80: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
4f90: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
4fa0: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
4fb0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4fc0: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
4fd0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
4fe0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43  e(db, pTable->zC
4ff0: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
5000: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
5010: 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
5020: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
5030: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
5040: 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b  pTable->pCheck);
5050: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5060: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
5070: 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43  E.  sqlite3VtabC
5080: 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29  lear(db, pTable)
5090: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
50a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
50b0: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  ble);..  /* Veri
50c0: 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61  fy that no looka
50d0: 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20  side memory was 
50e0: 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74  used by schema t
50f0: 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  ables */.  asser
5100: 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30  t( nLookaside==0
5110: 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d   || nLookaside==
5120: 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65  sqlite3Lookaside
5130: 55 73 65 64 28 64 62 2c 30 29 20 29 3b 0a 7d 0a  Used(db,0) );.}.
5140: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
5150: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
5160: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
5170: 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  le){.  /* Do not
5180: 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c   delete the tabl
5190: 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65  e until the refe
51a0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
51b0: 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69  hes zero. */.  i
51c0: 66 28 20 21 70 54 61 62 6c 65 20 29 20 72 65 74  f( !pTable ) ret
51d0: 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62  urn;.  if( ((!db
51e0: 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   || db->pnBytesF
51f0: 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70  reed==0) && (--p
5200: 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 29 3e  Table->nTabRef)>
5210: 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
5220: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
5230: 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Table);.}.../*.*
5240: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
5250: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
5260: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
5270: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
5280: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
5290: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
52a0: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
52b0: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
52c0: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
52d0: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
52e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
52f0: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
5300: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
5310: 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44  ble *p;.  Db *pD
5320: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  b;..  assert( db
5330: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
5340: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
5350: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
5360: 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a  rt( zTabName );.
5370: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5380: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
5390: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
53a0: 20 20 74 65 73 74 63 61 73 65 28 20 7a 54 61 62    testcase( zTab
53b0: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f  Name[0]==0 );  /
53c0: 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61  * Zero-length ta
53d0: 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c  ble names are al
53e0: 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d  lowed */.  pDb =
53f0: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
5400: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
5410: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
5420: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
5430: 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  zTabName, 0);.  
5440: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
5450: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
5460: 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46  >mDbFlags |= DBF
5470: 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
5480: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
5490: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
54a0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
54b0: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
54c0: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
54d0: 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  oken.  Space to 
54e0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
54f0: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f  d string.** is o
5500: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
5510: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
5520: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
5530: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
5540: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
5550: 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61  Any quotation ma
5560: 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22  rks (ex:  "name"
5570: 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d  , 'name', [name]
5580: 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61  , or `name`) tha
5590: 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68  t.** surround th
55a0: 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f  e body of the to
55b0: 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e  ken are removed.
55c0: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
55d0: 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69  e often just poi
55e0: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
55f0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
5600: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
5610: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
5620: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
5630: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
5640: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
5650: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
5660: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
5670: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
5680: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
5690: 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a  mToken(sqlite3 *
56a0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
56b0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
56c0: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  ;.  if( pName ){
56d0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
56e0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
56f0: 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e  , (char*)pName->
5700: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
5710: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
5720: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (zName);.  }else
5730: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
5740: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
5750: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
5760: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
5770: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
5780: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
5790: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
57a0: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
57b0: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
57c0: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
57d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
57e0: 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73  MasterTable(Pars
57f0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *p, int iDb){.
5800: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
5810: 74 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20  te3GetVdbe(p);. 
5820: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
5830: 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52  k(p, iDb, MASTER
5840: 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53 54 45 52  _ROOT, 1, MASTER
5850: 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c 69 74 65  _NAME);.  sqlite
5860: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
5870: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
5880: 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  0, MASTER_ROOT, 
5890: 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70  iDb, 5);.  if( p
58a0: 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ->nTab==0 ){.   
58b0: 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20   p->nTab = 1;.  
58c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  }.}../*.** Param
58d0: 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74  eter zName point
58e0: 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69  s to a nul-termi
58f0: 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e  nated buffer con
5900: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
5910: 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73  .** of a databas
5920: 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  e ("main", "temp
5930: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
5940: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
5950: 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
5960: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69  on returns the i
5970: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
5980: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
5990: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d  ->aDb[], or.** -
59a0: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
59b0: 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  b cannot be foun
59c0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
59d0: 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69  3FindDbName(sqli
59e0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
59f0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
5a00: 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20  nt i = -1;      
5a10: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
5a20: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a  umber */.  if( z
5a30: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a  Name ){.    Db *
5a40: 70 44 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28  pDb;.    for(i=(
5a50: 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d  db->nDb-1), pDb=
5a60: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d  &db->aDb[i]; i>=
5a70: 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a  0; i--, pDb--){.
5a80: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
5a90: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 44 62  ite3_stricmp(pDb
5aa0: 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4e 61 6d  ->zDbSName, zNam
5ab0: 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  e) ) break;.    
5ac0: 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69 73 20 61    /* "main" is a
5ad0: 6c 77 61 79 73 20 61 6e 20 61 63 63 65 70 74 61  lways an accepta
5ae0: 62 6c 65 20 61 6c 69 61 73 20 66 6f 72 20 74 68  ble alias for th
5af0: 65 20 70 72 69 6d 61 72 79 20 64 61 74 61 62 61  e primary databa
5b00: 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  se.      ** even
5b10: 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20   if it has been 
5b20: 72 65 6e 61 6d 65 64 20 75 73 69 6e 67 20 53 51  renamed using SQ
5b30: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41  LITE_DBCONFIG_MA
5b40: 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a 20 20 20  INDBNAME. */.   
5b50: 20 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20 30     if( i==0 && 0
5b60: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
5b70: 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65 29  p("main", zName)
5b80: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
5b90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
5ba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
5bb0: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
5bc0: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
5bd0: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
5be0: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
5bf0: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
5c00: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
5c10: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
5c20: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
5c30: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
5c40: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
5c50: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
5c60: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
5c70: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
5c80: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  xist..*/.int sql
5c90: 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74  ite3FindDb(sqlit
5ca0: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
5cb0: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Name){.  int i; 
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ce0: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
5cf0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
5d00: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
5d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
5d20: 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68  me we are search
5d30: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61  ing for */.  zNa
5d40: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
5d50: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
5d60: 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69  ame);.  i = sqli
5d70: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
5d80: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
5d90: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
5da0: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ame);.  return i
5db0: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c  ;.}../* The tabl
5dc0: 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69  e or view or tri
5dd0: 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73  gger name is pas
5de0: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
5df0: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a  ine via tokens.*
5e00: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
5e10: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
5e20: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
5e30: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
5e40: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43  example:.**.** C
5e50: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
5e60: 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a  yyy (...);.** .*
5e70: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
5e80: 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e   set to "xxx" an
5e90: 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20  d pName2 "yyy". 
5ea0: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
5eb0: 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d if.** the tabl
5ec0: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
5ed0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
5ee0: 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  .e.:.**.** CREAT
5ef0: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
5f00: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  ;.**.** Then pNa
5f10: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
5f20: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
5f30: 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  s ""..**.** This
5f40: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
5f50: 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e  e *ppUnqual poin
5f60: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
5f70: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
5f80: 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20  1 or.** pName2) 
5f90: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
5fa0: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
5fb0: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64  e name.  The ind
5fc0: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ex of the.** dat
5fd0: 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72  abase "xxx" is r
5fe0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
5ff0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
6000: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
6010: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
6020: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
6030: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
6040: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
6050: 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me1,      /* The
6060: 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61   "xxx" in the na
6070: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20  me "xxx.yyy" or 
6080: 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  "xxx" */.  Token
6090: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f   *pName2,      /
60a0: 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74  * The "yyy" in t
60b0: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
60c0: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70  " */.  Token **p
60d0: 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72  Unqual     /* Wr
60e0: 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66  ite the unqualif
60f0: 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ied object name 
6100: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
6110: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
6120: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
6130: 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
6140: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
6150: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
6160: 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  e->db;..  assert
6170: 28 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a 20  ( pName2!=0 );. 
6180: 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30   if( pName2->n>0
6190: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
61a0: 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20  init.busy ) {.  
61b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
61c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72  Msg(pParse, "cor
61d0: 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b  rupt database");
61e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
61f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e  ;.    }.    *pUn
6200: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20  qual = pName2;. 
6210: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
6220: 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65  FindDb(db, pName
6230: 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  1);.    if( iDb<
6240: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
6250: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6260: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  e, "unknown data
6270: 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31  base %T", pName1
6280: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6290: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
62a0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
62b0: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c  b->init.iDb==0 |
62c0: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 0a  | db->init.busy.
62d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
62e0: 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20  (db->mDbFlags & 
62f0: 44 42 46 4c 41 47 5f 56 61 63 75 75 6d 29 21 3d  DBFLAG_Vacuum)!=
6300: 30 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62  0);.    iDb = db
6310: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
6320: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
6330: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
6340: 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  iDb;.}../*.** Th
6350: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
6360: 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
6370: 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  he UTF-8 string 
6380: 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c  zName is a legal
6390: 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20  .** unqualified 
63a0: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73  name for a new s
63b0: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61  chema object (ta
63c0: 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77  ble, index, view
63d0: 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e   or.** trigger).
63e0: 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c   All names are l
63f0: 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73  egal except thos
6400: 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  e that begin wit
6410: 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  h the string.** 
6420: 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70  "sqlite_" (in up
6430: 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69  per, lower or mi
6440: 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20  xed case). This 
6450: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  portion of the n
6460: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72  amespace.** is r
6470: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
6480: 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74  rnal use..*/.int
6490: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a   sqlite3CheckObj
64a0: 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70  ectName(Parse *p
64b0: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
64c0: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
64d0: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
64e0: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
64f0: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20  e->nested==0 .  
6500: 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72          && (pPar
6510: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
6520: 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
6530: 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ma)==0.         
6540: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
6550: 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  rNICmp(zName, "s
6560: 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20  qlite_", 7) ){. 
6570: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6580: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65  sg(pParse, "obje
6590: 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64  ct name reserved
65a0: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73   for internal us
65b0: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
65c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
65d0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
65e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
65f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6600: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
6610: 20 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62 6c   index of a tabl
6620: 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  e.*/.Index *sqli
6630: 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
6640: 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  ex(Table *pTab){
6650: 0a 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 66  .  Index *p;.  f
6660: 6f 72 28 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65  or(p=pTab->pInde
6670: 78 3b 20 70 20 26 26 20 21 49 73 50 72 69 6d 61  x; p && !IsPrima
6680: 72 79 4b 65 79 49 6e 64 65 78 28 70 29 3b 20 70  ryKeyIndex(p); p
6690: 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 72  =p->pNext){}.  r
66a0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
66b0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6c  * Return the col
66c0: 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64  umn of index pId
66d0: 78 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  x that correspon
66e0: 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a 2a 20 63  ds to table.** c
66f0: 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20 52 65 74  olumn iCol.  Ret
6700: 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74 20 66 6f  urn -1 if not fo
6710: 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c 69  und..*/.i16 sqli
6720: 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
6730: 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 31  (Index *pIdx, i1
6740: 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69  6 iCol){.  int i
6750: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
6760: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
6770: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  +){.    if( iCol
6780: 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
6790: 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  [i] ) return i;.
67a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
67b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
67c0: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e  constructing a n
67d0: 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65  ew table represe
67e0: 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72  ntation in memor
67f0: 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74  y.  This is.** t
6800: 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65  he first of seve
6810: 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  ral action routi
6820: 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c  nes that get cal
6830: 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a  led in response.
6840: 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54  ** to a CREATE T
6850: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
6860: 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20   In particular, 
6870: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
6880: 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20  called.** after 
6890: 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43  seeing tokens "C
68a0: 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c  REATE" and "TABL
68b0: 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  E" and the table
68c0: 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d   name. The isTem
68d0: 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  p.** flag is tru
68e0: 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  e if the table s
68f0: 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
6900: 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
6910: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
6920: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20  e instead of in 
6930: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
6940: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  e file.  This is
6950: 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61   normally the ca
6960: 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22  se.** when the "
6970: 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52  TEMP" or "TEMPOR
6980: 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63  ARY" keyword occ
6990: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a  urs in between.*
69a0: 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42  * CREATE and TAB
69b0: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  LE..**.** The ne
69c0: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  w table record i
69d0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  s initialized an
69e0: 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d  d put in pParse-
69f0: 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41  >pNewTable..** A
6a00: 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52  s more of the CR
6a10: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
6a20: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20  ment is parsed, 
6a30: 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f  additional actio
6a40: 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69  n.** routines wi
6a50: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  ll be called to 
6a60: 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  add more informa
6a70: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63  tion to this rec
6a80: 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ord..** At the e
6a90: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
6aa0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
6ab0: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64  , the sqlite3End
6ac0: 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a  Table() routine.
6ad0: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ** is called to 
6ae0: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e  complete the con
6af0: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65  struction of the
6b00: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
6b10: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
6b20: 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20  e3StartTable(.  
6b30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
6b40: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
6b50: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
6b60: 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73  Name1,   /* Firs
6b70: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  t part of the na
6b80: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
6b90: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  or view */.  Tok
6ba0: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a  en *pName2,   /*
6bb0: 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
6bc0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
6bd0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
6be0: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
6bf0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
6c00: 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61  his is a TEMP ta
6c10: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ble */.  int isV
6c20: 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  iew,      /* Tru
6c30: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
6c40: 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  IEW */.  int isV
6c50: 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75  irtual,   /* Tru
6c60: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
6c70: 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a  IRTUAL table */.
6c80: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
6c90: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
6ca0: 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64   if table alread
6cb0: 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
6cc0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a   Table *pTable;.
6cd0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
6ce0: 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f  0; /* The name o
6cf0: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
6d00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
6d10: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
6d20: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
6d30: 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
6d40: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
6d50: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
6d60: 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ble in */.  Toke
6d70: 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  n *pName;    /* 
6d80: 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
6d90: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
6da0: 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66   create */..  if
6db0: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
6dc0: 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  && db->init.newT
6dd0: 6e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  num==1 ){.    /*
6de0: 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20   Special case:  
6df0: 50 61 72 73 69 6e 67 20 74 68 65 20 73 71 6c 69  Parsing the sqli
6e00: 74 65 5f 6d 61 73 74 65 72 20 6f 72 20 73 71 6c  te_master or sql
6e10: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
6e20: 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69 44  schema */.    iD
6e30: 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  b = db->init.iDb
6e40: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  ;.    zName = sq
6e50: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
6e60: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
6e70: 44 62 29 29 3b 0a 20 20 20 20 70 4e 61 6d 65 20  Db));.    pName 
6e80: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 65 6c 73  = pName1;.  }els
6e90: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  e{.    /* The co
6ea0: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20  mmon case */.   
6eb0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
6ec0: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
6ed0: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
6ee0: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
6ef0: 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
6f00: 6e 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  n;.    if( !OMIT
6f10: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
6f20: 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  p && pName2->n>0
6f30: 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20   && iDb!=1 ){.  
6f40: 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69      /* If creati
6f50: 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c  ng a temp table,
6f60: 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f   the name may no
6f70: 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20  t be qualified. 
6f80: 55 6e 6c 65 73 73 20 0a 20 20 20 20 20 20 2a 2a  Unless .      **
6f90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
6fa0: 6d 65 20 69 73 20 22 74 65 6d 70 22 20 61 6e 79  me is "temp" any
6fb0: 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73  way.  */.      s
6fc0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6fd0: 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72  Parse, "temporar
6fe0: 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73  y table name mus
6ff0: 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64  t be unqualified
7000: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
7010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7020: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
7030: 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31  isTemp ) iDb = 1
7040: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  ;.    zName = sq
7050: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
7060: 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
7070: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61   }.  pParse->sNa
7080: 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65  meToken = *pName
7090: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
70a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
70b0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
70c0: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
70d0: 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
70e0: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65  ) ){.    goto be
70f0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7100: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69  .  }.  if( db->i
7110: 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54  nit.iDb==1 ) isT
7120: 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  emp = 1;.#ifndef
7130: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
7140: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73  HORIZATION.  ass
7150: 65 72 74 28 20 69 73 54 65 6d 70 3d 3d 30 20 7c  ert( isTemp==0 |
7160: 7c 20 69 73 54 65 6d 70 3d 3d 31 20 29 3b 0a 20  | isTemp==1 );. 
7170: 20 61 73 73 65 72 74 28 20 69 73 56 69 65 77 3d   assert( isView=
7180: 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 31 20  =0 || isView==1 
7190: 29 3b 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69  );.  {.    stati
71a0: 63 20 63 6f 6e 73 74 20 75 38 20 61 43 6f 64 65  c const u8 aCode
71b0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 53 51  [] = {.       SQ
71c0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
71d0: 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45  E,.       SQLITE
71e0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  _CREATE_TEMP_TAB
71f0: 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54  LE,.       SQLIT
7200: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 2c 0a 20  E_CREATE_VIEW,. 
7210: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45        SQLITE_CRE
7220: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 0a 20 20  ATE_TEMP_VIEW.  
7230: 20 20 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a    };.    char *z
7240: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
7250: 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
7260: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
7270: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
7280: 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
7290: 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29  MA_TABLE(isTemp)
72a0: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
72b0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
72c0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
72d0: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74  .    if( !isVirt
72e0: 75 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75  ual && sqlite3Au
72f0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
7300: 28 69 6e 74 29 61 43 6f 64 65 5b 69 73 54 65 6d  (int)aCode[isTem
7310: 70 2b 32 2a 69 73 56 69 65 77 5d 2c 0a 20 20 20  p+2*isView],.   
7320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7340: 20 20 20 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44      zName, 0, zD
7350: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
7360: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
7370: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  or;.    }.  }.#e
7380: 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
7390: 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62  sure the new tab
73a0: 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74  le name does not
73b0: 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e   collide with an
73c0: 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69   existing.  ** i
73d0: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61  ndex or table na
73e0: 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  me in the same d
73f0: 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65 20  atabase.  Issue 
7400: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
7410: 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73   if.  ** it does
7420: 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20  . The exception 
7430: 69 73 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  is if the statem
7440: 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65 64  ent being parsed
7450: 20 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a   was passed.  **
7460: 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64   to an sqlite3_d
7470: 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61  eclare_vtab() ca
7480: 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ll. In that case
7490: 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   only the column
74a0: 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20   names.  ** and 
74b0: 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73  types will be us
74c0: 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20  ed, so there is 
74d0: 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20  no need to test 
74e0: 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20  for namespace.  
74f0: 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20  ** collisions.. 
7500: 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44 45   */.  if( !IN_DE
7510: 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20  CLARE_VTAB ){.  
7520: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
7530: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
7540: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  ame;.    if( SQL
7550: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
7560: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
7570: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
7580: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
7590: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  r;.    }.    pTa
75a0: 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ble = sqlite3Fin
75b0: 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
75c0: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
75d0: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  pTable ){.      
75e0: 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20  if( !noErr ){.  
75f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7600: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
7610: 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20  able %T already 
7620: 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b  exists", pName);
7630: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7640: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
7650: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
7660: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
7670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
7680: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
7690: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
76a0: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62    }.      goto b
76b0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
76c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
76d0: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
76e0: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29  (db, zName, zDb)
76f0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
7700: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7710: 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
7720: 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20  lready an index 
7730: 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
7740: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  );.      goto be
7750: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7760: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54  .    }.  }..  pT
7770: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62  able = sqlite3Db
7780: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
7790: 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
77a0: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
77b0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
77c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
77d0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
77e0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
77f0: 42 4b 50 54 3b 0a 20 20 20 20 70 50 61 72 73 65  BKPT;.    pParse
7800: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
7810: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7820: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
7830: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
7840: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b  e;.  pTable->iPK
7850: 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c  ey = -1;.  pTabl
7860: 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  e->pSchema = db-
7870: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
7880: 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 54 61  a;.  pTable->nTa
7890: 62 52 65 66 20 3d 20 31 3b 0a 23 69 66 64 65 66  bRef = 1;.#ifdef
78a0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
78b0: 52 4f 57 45 53 54 0a 20 20 70 54 61 62 6c 65 2d  ROWEST.  pTable-
78c0: 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71  >nRowLogEst = sq
78d0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 53 51 4c 49  lite3LogEst(SQLI
78e0: 54 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45 53  TE_DEFAULT_ROWES
78f0: 54 29 3b 0a 23 65 6c 73 65 0a 20 20 70 54 61 62  T);.#else.  pTab
7900: 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  le->nRowLogEst =
7910: 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
7920: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
7930: 28 31 30 34 38 35 37 36 29 20 29 3b 0a 23 65 6e  (1048576) );.#en
7940: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 50  dif.  assert( pP
7950: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
7960: 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =0 );.  pParse->
7970: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
7980: 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  le;..  /* If thi
7990: 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73  s is the magic s
79a0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
79b0: 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74  able used by aut
79c0: 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a  oincrement,.  **
79d0: 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70   then record a p
79e0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74  ointer to this t
79f0: 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  able in the main
7a00: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
7a10: 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ure.  ** so that
7a20: 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64   INSERT can find
7a30: 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c   the table easil
7a40: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
7a50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
7a60: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20  INCREMENT.  if( 
7a70: 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20  !pParse->nested 
7a80: 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  && strcmp(zName,
7a90: 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
7aa0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  e")==0 ){.    as
7ab0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
7ac0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
7ad0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
7ae0: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
7af0: 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c  >pSeqTab = pTabl
7b00: 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
7b10: 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
7b20: 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68  ting the code th
7b30: 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74  at will insert t
7b40: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
7b50: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51  into.  ** the SQ
7b60: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
7b70: 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74  e.  Note in part
7b80: 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d  icular that we m
7b90: 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a  ust go ahead.  *
7ba0: 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74  * and allocate t
7bb0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
7bc0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65   for the table e
7bd0: 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72  ntry now.  Befor
7be0: 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41  e any.  ** PRIMA
7bf0: 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
7c00: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61   keywords are pa
7c10: 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79  rsed.  Those key
7c20: 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65  words will cause
7c30: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f  .  ** indices to
7c40: 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20   be created and 
7c50: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
7c60: 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72   must come befor
7c70: 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69  e the .  ** indi
7c80: 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ces.  Hence, the
7c90: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
7ca0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73  or the table mus
7cb0: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20  t be allocated. 
7cc0: 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   ** now..  */.  
7cd0: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
7ce0: 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74  sy && (v = sqlit
7cf0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
7d00: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))!=0 ){.    int
7d10: 20 61 64 64 72 31 3b 0a 20 20 20 20 69 6e 74 20   addr1;.    int 
7d20: 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20  fileFormat;.    
7d30: 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20  int reg1, reg2, 
7d40: 72 65 67 33 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c  reg3;.    /* nul
7d50: 6c 52 6f 77 5b 5d 20 69 73 20 61 6e 20 4f 50 5f  lRow[] is an OP_
7d60: 52 65 63 6f 72 64 20 65 6e 63 6f 64 69 6e 67 20  Record encoding 
7d70: 6f 66 20 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e  of a row contain
7d80: 69 6e 67 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20  ing 5 NULLs */. 
7d90: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
7da0: 63 68 61 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d  char nullRow[] =
7db0: 20 7b 20 36 2c 20 30 2c 20 30 2c 20 30 2c 20 30   { 6, 0, 0, 0, 0
7dc0: 2c 20 30 20 7d 3b 0a 20 20 20 20 73 71 6c 69 74  , 0 };.    sqlit
7dd0: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
7de0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
7df0: 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
7e00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
7e10: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
7e20: 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20   isVirtual ){.  
7e30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7e40: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67  ddOp0(v, OP_VBeg
7e50: 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  in);.    }.#endi
7e60: 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  f..    /* If the
7e70: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64   file format and
7e80: 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65   encoding in the
7e90: 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20 6e   database have n
7ea0: 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20  ot been set, .  
7eb0: 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f    ** set them no
7ec0: 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  w..    */.    re
7ed0: 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67  g1 = pParse->reg
7ee0: 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
7ef0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32  ->nMem;.    reg2
7f00: 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f   = pParse->regRo
7f10: 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ot = ++pParse->n
7f20: 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20  Mem;.    reg3 = 
7f30: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
7f40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7f50: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64  ddOp3(v, OP_Read
7f60: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67  Cookie, iDb, reg
7f70: 33 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  3, BTREE_FILE_FO
7f80: 52 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  RMAT);.    sqlit
7f90: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
7fa0: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 61 64 64  v, iDb);.    add
7fb0: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
7fc0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
7fd0: 20 72 65 67 33 29 3b 20 56 64 62 65 43 6f 76 65   reg3); VdbeCove
7fe0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 66 69 6c  rage(v);.    fil
7ff0: 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66  eFormat = (db->f
8000: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65  lags & SQLITE_Le
8010: 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20  gacyFileFmt)!=0 
8020: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
8030: 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d      1 : SQLITE_M
8040: 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a  AX_FILE_FORMAT;.
8050: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8060: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
8070: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45  ookie, iDb, BTRE
8080: 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 66  E_FILE_FORMAT, f
8090: 69 6c 65 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  ileFormat);.    
80a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
80b0: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
80c0: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 54 45  e, iDb, BTREE_TE
80d0: 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 45 4e 43  XT_ENCODING, ENC
80e0: 28 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  (db));.    sqlit
80f0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
8100: 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 20 20 2f  , addr1);..    /
8110: 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65 61  * This just crea
8120: 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64  tes a place-hold
8130: 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  er record in the
8140: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
8150: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  able..    ** The
8160: 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64 20   record created 
8170: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
8180: 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20   anything yet.  
8190: 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61  It will be repla
81a0: 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ced.    ** by th
81b0: 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20  e real entry in 
81c0: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 61  code generated a
81d0: 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  t sqlite3EndTabl
81e0: 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
81f0: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
8200: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
8210: 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74  s left in regist
8220: 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  er pParse->regRo
8230: 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  wid..    ** The 
8240: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
8250: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
8260: 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  e is left in reg
8270: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
8280: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  ..    ** The row
8290: 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  id and root page
82a0: 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20 61   number values a
82b0: 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  re needed by the
82c0: 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 2a   code that.    *
82d0: 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  * sqlite3EndTabl
82e0: 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e  e will generate.
82f0: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  .    */.#if !def
8300: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
8310: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
8320: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
8330: 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
8340: 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69   if( isView || i
8350: 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20  sVirtual ){.    
8360: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8370: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
8380: 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20 20  r, 0, reg2);.   
8390: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
83a0: 20 20 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65    {.      pParse
83b0: 2d 3e 61 64 64 72 43 72 54 61 62 20 3d 0a 20 20  ->addrCrTab =.  
83c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
83d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
83e0: 72 65 61 74 65 42 74 72 65 65 2c 20 69 44 62 2c  reateBtree, iDb,
83f0: 20 72 65 67 32 2c 20 42 54 52 45 45 5f 49 4e 54   reg2, BTREE_INT
8400: 4b 45 59 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  KEY);.    }.    
8410: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
8420: 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  rTable(pParse, i
8430: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
8440: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8450: 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 72 65  _NewRowid, 0, re
8460: 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g1);.    sqlite3
8470: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
8480: 5f 42 6c 6f 62 2c 20 36 2c 20 72 65 67 33 2c 20  _Blob, 6, reg3, 
8490: 30 2c 20 6e 75 6c 6c 52 6f 77 2c 20 50 34 5f 53  0, nullRow, P4_S
84a0: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
84b0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
84c0: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72   OP_Insert, 0, r
84d0: 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  eg3, reg1);.    
84e0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
84f0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
8500: 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74  PEND);.    sqlit
8510: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
8520: 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a  OP_Close);.  }..
8530: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e    /* Normal (non
8540: 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20  -error) return. 
8550: 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  */.  return;..  
8560: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
8570: 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68  ccurs, we jump h
8580: 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62  ere */.begin_tab
8590: 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  le_error:.  sqli
85a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
85b0: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
85c0: 7d 0a 0a 2f 2a 20 53 65 74 20 70 72 6f 70 65 72  }../* Set proper
85d0: 74 69 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20  ties of a table 
85e0: 63 6f 6c 75 6d 6e 20 62 61 73 65 64 20 6f 6e 20  column based on 
85f0: 74 68 65 20 28 6d 61 67 69 63 61 6c 29 0a 2a 2a  the (magical).**
8600: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   name of the col
8610: 75 6d 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  umn..*/.#if SQLI
8620: 54 45 5f 45 4e 41 42 4c 45 5f 48 49 44 44 45 4e  TE_ENABLE_HIDDEN
8630: 5f 43 4f 4c 55 4d 4e 53 0a 76 6f 69 64 20 73 71  _COLUMNS.void sq
8640: 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65  lite3ColumnPrope
8650: 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 54 61  rtiesFromName(Ta
8660: 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f 6c 75 6d  ble *pTab, Colum
8670: 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20 69 66 28 20  n *pCol){.  if( 
8680: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
8690: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 5f  (pCol->zName, "_
86a0: 5f 68 69 64 64 65 6e 5f 5f 22 2c 20 31 30 29 3d  _hidden__", 10)=
86b0: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e  =0 ){.    pCol->
86c0: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
86d0: 4c 41 47 5f 48 49 44 44 45 4e 3b 0a 20 20 7d 65  LAG_HIDDEN;.  }e
86e0: 6c 73 65 20 69 66 28 20 70 54 61 62 20 26 26 20  lse if( pTab && 
86f0: 70 43 6f 6c 21 3d 70 54 61 62 2d 3e 61 43 6f 6c  pCol!=pTab->aCol
8700: 20 26 26 20 28 70 43 6f 6c 5b 2d 31 5d 2e 63 6f   && (pCol[-1].co
8710: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
8720: 5f 48 49 44 44 45 4e 29 20 29 7b 0a 20 20 20 20  _HIDDEN) ){.    
8730: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
8740: 3d 20 54 46 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a  = TF_OOOHidden;.
8750: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
8760: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63  *.** Add a new c
8770: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62  olumn to the tab
8780: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
8790: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a  ng constructed..
87a0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
87b0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
87c0: 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ine once for eac
87d0: 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  h column declara
87e0: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45  tion.** in a CRE
87f0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
8800: 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61  ent.  sqlite3Sta
8810: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
8820: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
8830: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
8840: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
8850: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8860: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
8870: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
8880: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61  ite3AddColumn(Pa
8890: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
88a0: 65 6e 20 2a 70 4e 61 6d 65 2c 20 54 6f 6b 65 6e  en *pName, Token
88b0: 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c   *pType){.  Tabl
88c0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
88d0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72   char *z;.  char
88e0: 20 2a 7a 54 79 70 65 3b 0a 20 20 43 6f 6c 75 6d   *zType;.  Colum
88f0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74  n *pCol;.  sqlit
8900: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
8910: 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  >db;.  if( (p = 
8920: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
8930: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
8940: 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e    if( p->nCol+1>
8950: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
8960: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
8970: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
8980: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8990: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
89a0: 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d   on %s", p->zNam
89b0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
89c0: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
89d0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
89e0: 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 70 54 79 70   pName->n + pTyp
89f0: 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20 20 69 66 28  e->n + 2);.  if(
8a00: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
8a10: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d    memcpy(z, pNam
8a20: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
8a30: 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20 3d  .  z[pName->n] =
8a40: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71   0;.  sqlite3Deq
8a50: 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69  uote(z);.  for(i
8a60: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
8a70: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
8a80: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c 20  ite3_stricmp(z, 
8a90: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
8aa0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
8ab0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8ac0: 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65  arse, "duplicate
8ad0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73   column name: %s
8ae0: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", z);.      sql
8af0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
8b00: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
8b10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
8b20: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
8b30: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
8b40: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
8b50: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
8b60: 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c  lloc(db,p->aCol,
8b70: 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65  (p->nCol+8)*size
8b80: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
8b90: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
8ba0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8bb0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
8bc0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
8bd0: 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20    }.    p->aCol 
8be0: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43  = aNew;.  }.  pC
8bf0: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
8c00: 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCol];.  memset
8c10: 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCol, 0, sizeof
8c20: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
8c30: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
8c40: 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  ;.  sqlite3Colum
8c50: 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e  nPropertiesFromN
8c60: 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a 20 0a  ame(p, pCol);. .
8c70: 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d    if( pType->n==
8c80: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
8c90: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
8ca0: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
8cb0: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
8cc0: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 20  ult affinity.   
8cd0: 20 2a 2a 20 27 42 4c 4f 42 27 20 77 69 74 68 20   ** 'BLOB' with 
8ce0: 61 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f  a default size o
8cf0: 66 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  f 4 bytes. */.  
8d00: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
8d10: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
8d20: 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a  OB;.    pCol->sz
8d30: 45 73 74 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  Est = 1;.#ifdef 
8d40: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
8d50: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
8d60: 20 20 20 20 69 66 28 20 34 3e 3d 73 71 6c 69 74      if( 4>=sqlit
8d70: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
8d80: 7a 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20  zSorterRef ){.  
8d90: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
8da0: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53 4f  gs |= COLFLAG_SO
8db0: 52 54 45 52 52 45 46 3b 0a 20 20 20 20 7d 0a 23  RTERREF;.    }.#
8dc0: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
8dd0: 20 20 20 7a 54 79 70 65 20 3d 20 7a 20 2b 20 73     zType = z + s
8de0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
8df0: 29 20 2b 20 31 3b 0a 20 20 20 20 6d 65 6d 63 70  ) + 1;.    memcp
8e00: 79 28 7a 54 79 70 65 2c 20 70 54 79 70 65 2d 3e  y(zType, pType->
8e10: 7a 2c 20 70 54 79 70 65 2d 3e 6e 29 3b 0a 20 20  z, pType->n);.  
8e20: 20 20 7a 54 79 70 65 5b 70 54 79 70 65 2d 3e 6e    zType[pType->n
8e30: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
8e40: 65 33 44 65 71 75 6f 74 65 28 7a 54 79 70 65 29  e3Dequote(zType)
8e50: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  ;.    pCol->affi
8e60: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66  nity = sqlite3Af
8e70: 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65  finityType(zType
8e80: 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 70 43 6f  , pCol);.    pCo
8e90: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
8ea0: 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a  OLFLAG_HASTYPE;.
8eb0: 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b    }.  p->nCol++;
8ec0: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  .  pParse->const
8ed0: 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b  raintName.n = 0;
8ee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
8ef0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8f00: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
8f10: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
8f20: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
8f30: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
8f40: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e  statement.  A "N
8f50: 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
8f60: 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  int has.** been 
8f70: 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  seen on a column
8f80: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
8f90: 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c  sets the notNull
8fa0: 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20   flag on.** the 
8fb0: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
8fc0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
8fd0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
8fe0: 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50  ite3AddNotNull(P
8ff0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
9000: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
9010: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
9020: 20 2a 70 43 6f 6c 3b 0a 20 20 70 20 3d 20 70 50   *pCol;.  p = pP
9030: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
9040: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e  .  if( p==0 || N
9050: 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20  EVER(p->nCol<1) 
9060: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
9070: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
9080: 43 6f 6c 2d 31 5d 3b 0a 20 20 70 43 6f 6c 2d 3e  Col-1];.  pCol->
9090: 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e  notNull = (u8)on
90a0: 45 72 72 6f 72 3b 0a 20 20 70 2d 3e 74 61 62 46  Error;.  p->tabF
90b0: 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 4e 6f  lags |= TF_HasNo
90c0: 74 4e 75 6c 6c 3b 0a 0a 20 20 2f 2a 20 53 65 74  tNull;..  /* Set
90d0: 20 74 68 65 20 75 6e 69 71 4e 6f 74 4e 75 6c 6c   the uniqNotNull
90e0: 20 66 6c 61 67 20 6f 6e 20 61 6e 79 20 55 4e 49   flag on any UNI
90f0: 51 55 45 20 6f 72 20 50 4b 20 69 6e 64 65 78 65  QUE or PK indexe
9100: 73 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65  s already create
9110: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 63  d.  ** on this c
9120: 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  olumn.  */.  if(
9130: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
9140: 26 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45  & COLFLAG_UNIQUE
9150: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
9160: 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
9170: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
9180: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
9190: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
91a0: 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  rt( pIdx->nKeyCo
91b0: 6c 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e  l==1 && pIdx->on
91c0: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
91d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
91e0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 70  ->aiColumn[0]==p
91f0: 2d 3e 6e 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20  ->nCol-1 ){.    
9200: 20 20 20 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f      pIdx->uniqNo
9210: 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20  tNull = 1;.     
9220: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
9230: 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63  /*.** Scan the c
9240: 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20  olumn type name 
9250: 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54  zType (length nT
9260: 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ype) and return 
9270: 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  the.** associate
9280: 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e  d affinity type.
9290: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
92a0: 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d  ine does a case-
92b0: 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72  independent sear
92c0: 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20  ch of zType for 
92d0: 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e  the .** substrin
92e0: 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  gs in the follow
92f0: 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e  ing table. If on
9300: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
9310: 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c  ngs is.** found,
9320: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
9330: 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72  ng affinity is r
9340: 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70  eturned. If zTyp
9350: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f  e contains.** mo
9360: 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74  re than one of t
9370: 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65  he substrings, e
9380: 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68  ntries toward th
9390: 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65  e top of .** the
93a0: 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f   table take prio
93b0: 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c  rity. For exampl
93c0: 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27  e, if zType is '
93d0: 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51  BLOBINT', .** SQ
93e0: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
93f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
9400: 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20  .** Substring   
9410: 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20    | Affinity.** 
9420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9440: 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20  .** 'INT'       
9450: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49    | SQLITE_AFF_I
9460: 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27  NTEGER.** 'CHAR'
9470: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
9480: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c  _AFF_TEXT.** 'CL
9490: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
94a0: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
94b0: 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20  'TEXT'        | 
94c0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
94d0: 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20  ** 'BLOB'       
94e0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   | SQLITE_AFF_BL
94f0: 4f 42 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20  OB.** 'REAL'    
9500: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
9510: 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20  _REAL.** 'FLOA' 
9520: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
9530: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55  AFF_REAL.** 'DOU
9540: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
9550: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a  TE_AFF_REAL.**.*
9560: 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
9570: 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74   substrings in t
9580: 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61  he above table a
9590: 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c  re found,.** SQL
95a0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
95b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
95c0: 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69  char sqlite3Affi
95d0: 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63  nityType(const c
95e0: 68 61 72 20 2a 7a 49 6e 2c 20 43 6f 6c 75 6d 6e  har *zIn, Column
95f0: 20 2a 70 43 6f 6c 29 7b 0a 20 20 75 33 32 20 68   *pCol){.  u32 h
9600: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66   = 0;.  char aff
9610: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55   = SQLITE_AFF_NU
9620: 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63  MERIC;.  const c
9630: 68 61 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a  har *zChar = 0;.
9640: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 6e 21 3d  .  assert( zIn!=
9650: 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49  0 );.  while( zI
9660: 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20  n[0] ){.    h = 
9670: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
9680: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a  UpperToLower[(*z
9690: 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a  In)&0xff];.    z
96a0: 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d  In++;.    if( h=
96b0: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27  =(('c'<<24)+('h'
96c0: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
96d0: 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  r') ){          
96e0: 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20     /* CHAR */.  
96f0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9700: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20  _AFF_TEXT;.     
9710: 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20   zChar = zIn;.  
9720: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
9730: 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('c'<<24)+('l'<<
9740: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
9750: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c  ) ){       /* CL
9760: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  OB */.      aff 
9770: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
9780: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
9790: 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28   h==(('t'<<24)+(
97a0: 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38  'e'<<16)+('x'<<8
97b0: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20  )+'t') ){       
97c0: 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20  /* TEXT */.     
97d0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
97e0: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
97f0: 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c  e if( h==(('b'<<
9800: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
9810: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  o'<<8)+'b')     
9820: 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a       /* BLOB */.
9830: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
9840: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
9850: 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  RIC || aff==SQLI
9860: 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a  TE_AFF_REAL) ){.
9870: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9880: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
9890: 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27     if( zIn[0]=='
98a0: 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e  (' ) zChar = zIn
98b0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
98c0: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
98d0: 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69  OINT.    }else i
98e0: 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29  f( h==(('r'<<24)
98f0: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c  +('e'<<16)+('a'<
9900: 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20  <8)+'l')        
9910: 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20    /* REAL */.   
9920: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
9930: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9940: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
9950: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
9960: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9970: 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('f'<<24)+('l'
9980: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
9990: 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a')          /* 
99a0: 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20  FLOA */.        
99b0: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
99c0: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
99d0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
99e0: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
99f0: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64  else if( h==(('d
9a00: 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29  '<<24)+('o'<<16)
9a10: 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20  +('u'<<8)+'b')  
9a20: 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20          /* DOUB 
9a30: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
9a40: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
9a50: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
9a60: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9a70: 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  REAL;.#endif.   
9a80: 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78   }else if( (h&0x
9a90: 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27  00FFFFFF)==(('i'
9aa0: 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27  <<16)+('n'<<8)+'
9ab0: 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54  t') ){    /* INT
9ac0: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
9ad0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
9ae0: 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ER;.      break;
9af0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9b00: 20 49 66 20 70 43 6f 6c 20 69 73 20 6e 6f 74 20   If pCol is not 
9b10: 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65  NULL, store an e
9b20: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66  stimate of the f
9b30: 69 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a  ield size.  The.
9b40: 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73    ** estimate is
9b50: 20 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20   scaled so that 
9b60: 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69  the size of an i
9b70: 6e 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f  nteger is 1.  */
9b80: 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20  .  if( pCol ){. 
9b90: 20 20 20 69 6e 74 20 76 20 3d 20 30 3b 20 20 20     int v = 0;   
9ba0: 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20  /* default size 
9bb0: 69 73 20 61 70 70 72 6f 78 20 34 20 62 79 74 65  is approx 4 byte
9bc0: 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66  s */.    if( aff
9bd0: 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  <SQLITE_AFF_NUME
9be0: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28  RIC ){.      if(
9bf0: 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20   zChar ){.      
9c00: 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30    while( zChar[0
9c10: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ] ){.          i
9c20: 66 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  f( sqlite3Isdigi
9c30: 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20  t(zChar[0]) ){. 
9c40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c             /* BL
9c50: 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28 6b  OB(k), VARCHAR(k
9c60: 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d  ), CHAR(k) -> r=
9c70: 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20  (k/4+1) */.     
9c80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65         sqlite3Ge
9c90: 74 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76  tInt32(zChar, &v
9ca0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
9cb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
9cc0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68 61  }.          zCha
9cd0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  r++;.        }. 
9ce0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9cf0: 20 20 20 20 76 20 3d 20 31 36 3b 20 20 20 2f 2a      v = 16;   /*
9d00: 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f   BLOB, TEXT, CLO
9d10: 42 20 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f  B -> r=5  (appro
9d20: 78 20 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20  x 20 bytes)*/.  
9d30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64      }.    }.#ifd
9d40: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
9d50: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
9d60: 45 53 0a 20 20 20 20 69 66 28 20 76 3e 3d 73 71  ES.    if( v>=sq
9d70: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
9d80: 67 2e 73 7a 53 6f 72 74 65 72 52 65 66 20 29 7b  g.szSorterRef ){
9d90: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c  .      pCol->col
9da0: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
9db0: 5f 53 4f 52 54 45 52 52 45 46 3b 0a 20 20 20 20  _SORTERREF;.    
9dc0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 76 20 3d  }.#endif.    v =
9dd0: 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 69 66   v/4 + 1;.    if
9de0: 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32 35  ( v>255 ) v = 25
9df0: 35 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45  5;.    pCol->szE
9e00: 73 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65  st = v;.  }.  re
9e10: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
9e20: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
9e30: 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  n is the default
9e40: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d   value for the m
9e50: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
9e60: 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20  ed column.** of 
9e70: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
9e80: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
9e90: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65  uction..**.** De
9ea0: 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72  fault value expr
9eb0: 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  essions must be 
9ec0: 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65  constant.  Raise
9ed0: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66   an exception if
9ee0: 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20   this.** is not 
9ef0: 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  the case..**.** 
9f00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
9f10: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
9f20: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
9f30: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
9f40: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
9f50: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
9f60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9f70: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
9f80: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9f90: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
9fa0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
9fb0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9fd0: 54 68 65 20 70 61 72 73 65 64 20 65 78 70 72 65  The parsed expre
9fe0: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 64 65 66  ssion of the def
9ff0: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20  ault value */.  
a000: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61  const char *zSta
a010: 72 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 61 72  rt,      /* Star
a020: 74 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  t of the default
a030: 20 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 20   value text */. 
a040: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e   const char *zEn
a050: 64 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  d         /* Fir
a060: 73 74 20 63 68 61 72 61 63 74 65 72 20 70 61 73  st character pas
a070: 74 20 65 6e 64 20 6f 66 20 64 65 66 61 75 74 20  t end of defaut 
a080: 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 29 7b  value text */.){
a090: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
a0a0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73  olumn *pCol;.  s
a0b0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
a0c0: 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70  rse->db;.  p = p
a0d0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
a0e0: 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a  ;.  if( p!=0 ){.
a0f0: 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e      pCol = &(p->
a100: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29  aCol[p->nCol-1])
a110: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
a120: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
a130: 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70 72  OrFunction(pExpr
a140: 2c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29  , db->init.busy)
a150: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a160: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a170: 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65  , "default value
a180: 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20   of column [%s] 
a190: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22  is not constant"
a1a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  ,.          pCol
a1b0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ->zName);.    }e
a1c0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
a1d0: 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73  copy of pExpr is
a1e0: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
a1f0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61   the original, a
a200: 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73  s pExpr contains
a210: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73  .      ** tokens
a220: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76   that point to v
a230: 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 0a  olatile memory..
a240: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45        */.      E
a250: 78 70 72 20 78 3b 0a 20 20 20 20 20 20 73 71 6c  xpr x;.      sql
a260: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
a270: 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b  b, pCol->pDflt);
a280: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 78  .      memset(&x
a290: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b  , 0, sizeof(x));
a2a0: 0a 20 20 20 20 20 20 78 2e 6f 70 20 3d 20 54 4b  .      x.op = TK
a2b0: 5f 53 50 41 4e 3b 0a 20 20 20 20 20 20 78 2e 75  _SPAN;.      x.u
a2c0: 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65  .zToken = sqlite
a2d0: 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a  3DbSpanDup(db, z
a2e0: 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20  Start, zEnd);.  
a2f0: 20 20 20 20 78 2e 70 4c 65 66 74 20 3d 20 70 45      x.pLeft = pE
a300: 78 70 72 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61  xpr;.      x.fla
a310: 67 73 20 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20  gs = EP_Skip;.  
a320: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
a330: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a340: 28 64 62 2c 20 26 78 2c 20 45 58 50 52 44 55 50  (db, &x, EXPRDUP
a350: 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20  _REDUCE);.      
a360: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a370: 2c 20 78 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  , x.u.zToken);. 
a380: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
a390: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
a3a0: 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
a3b0: 2a 20 42 61 63 6b 77 61 72 64 73 20 43 6f 6d 70  * Backwards Comp
a3c0: 61 74 69 62 69 6c 69 74 79 20 48 61 63 6b 3a 0a  atibility Hack:.
a3d0: 2a 2a 20 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61  ** .** Historica
a3e0: 6c 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  l versions of SQ
a3f0: 4c 69 74 65 20 61 63 63 65 70 74 65 64 20 73 74  Lite accepted st
a400: 72 69 6e 67 73 20 61 73 20 63 6f 6c 75 6d 6e 20  rings as column 
a410: 6e 61 6d 65 73 20 69 6e 0a 2a 2a 20 69 6e 64 65  names in.** inde
a420: 78 65 73 20 61 6e 64 20 50 52 49 4d 41 52 59 20  xes and PRIMARY 
a430: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  KEY constraints 
a440: 61 6e 64 20 69 6e 20 55 4e 49 51 55 45 20 63 6f  and in UNIQUE co
a450: 6e 73 74 72 61 69 6e 74 73 2e 20 20 45 78 61 6d  nstraints.  Exam
a460: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43  ple:.**.**     C
a470: 52 45 41 54 45 20 54 41 42 4c 45 20 78 79 7a 28  REATE TABLE xyz(
a480: 61 2c 62 2c 63 2c 64 2c 65 2c 50 52 49 4d 41 52  a,b,c,d,e,PRIMAR
a490: 59 20 4b 45 59 28 27 61 27 29 2c 55 4e 49 51 55  Y KEY('a'),UNIQU
a4a0: 45 28 27 62 27 2c 27 63 27 20 43 4f 4c 4c 41 54  E('b','c' COLLAT
a4b0: 45 20 74 72 69 6d 29 0a 2a 2a 20 20 20 20 20 43  E trim).**     C
a4c0: 52 45 41 54 45 20 49 4e 44 45 58 20 61 62 63 20  REATE INDEX abc 
a4d0: 4f 4e 20 78 79 7a 28 27 63 27 2c 27 64 27 20 44  ON xyz('c','d' D
a4e0: 45 53 43 2c 27 65 27 20 43 4f 4c 4c 41 54 45 20  ESC,'e' COLLATE 
a4f0: 6e 6f 63 61 73 65 20 44 45 53 43 29 3b 0a 2a 2a  nocase DESC);.**
a500: 0a 2a 2a 20 54 68 69 73 20 69 73 20 67 6f 6f 66  .** This is goof
a510: 79 2e 20 20 42 75 74 20 74 6f 20 70 72 65 73 65  y.  But to prese
a520: 72 76 65 20 62 61 63 6b 77 61 72 64 73 20 63 6f  rve backwards co
a530: 6d 70 61 74 69 62 69 6c 69 74 79 20 77 65 20 63  mpatibility we c
a540: 6f 6e 74 69 6e 75 65 20 74 6f 0a 2a 2a 20 61 63  ontinue to.** ac
a550: 63 65 70 74 20 69 74 2e 20 20 54 68 69 73 20 72  cept it.  This r
a560: 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
a570: 6e 65 63 65 73 73 61 72 79 20 63 6f 6e 76 65 72  necessary conver
a580: 73 69 6f 6e 2e 20 20 49 74 20 63 6f 6e 76 65 72  sion.  It conver
a590: 74 73 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  ts.** the expres
a5a0: 73 69 6f 6e 20 67 69 76 65 6e 20 69 6e 20 69 74  sion given in it
a5b0: 73 20 61 72 67 75 6d 65 6e 74 20 66 72 6f 6d 20  s argument from 
a5c0: 61 20 54 4b 5f 53 54 52 49 4e 47 20 69 6e 74 6f  a TK_STRING into
a5d0: 20 61 20 54 4b 5f 49 44 0a 2a 2a 20 69 66 20 74   a TK_ID.** if t
a5e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
a5f0: 20 6a 75 73 74 20 61 20 54 4b 5f 53 54 52 49 4e   just a TK_STRIN
a600: 47 20 77 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e  G with an option
a610: 61 6c 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73  al COLLATE claus
a620: 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 70 78  e..** If the epx
a630: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 79 74 68  ression is anyth
a640: 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 54  ing other than T
a650: 4b 5f 53 54 52 49 4e 47 2c 20 74 68 65 20 65 78  K_STRING, the ex
a660: 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 75  pression is.** u
a670: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61  nchanged..*/.sta
a680: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
a690: 53 74 72 69 6e 67 54 6f 49 64 28 45 78 70 72 20  StringToId(Expr 
a6a0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  *p){.  if( p->op
a6b0: 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20  ==TK_STRING ){. 
a6c0: 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44     p->op = TK_ID
a6d0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
a6e0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
a6f0: 26 26 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  && p->pLeft->op=
a700: 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20  =TK_STRING ){.  
a710: 20 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d    p->pLeft->op =
a720: 20 54 4b 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f   TK_ID;.  }.}../
a730: 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74  *.** Designate t
a740: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66  he PRIMARY KEY f
a750: 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70  or the table.  p
a760: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
a770: 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63  f names .** of c
a780: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d  olumns that form
a790: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
a7a0: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e  .  If pList is N
a7b0: 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ULL, then the.**
a7c0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
a7d0: 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  dded column of t
a7e0: 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  he table is the 
a7f0: 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a  primary key..**.
a800: 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68  ** A table can h
a810: 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
a820: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
a830: 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
a840: 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d  dy has.** a prim
a850: 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69  ary key (and thi
a860: 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  s is the second 
a870: 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65  primary key) the
a880: 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65  n create an.** e
a890: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
a8a0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
a8b0: 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f  s on a single co
a8c0: 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74  lumn whose datat
a8d0: 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a  ype is INTEGER,.
a8e0: 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  ** then we will 
a8f0: 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20  try to use that 
a900: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f  column as the ro
a910: 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61  wid.  Set the Ta
a920: 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65  ble.iPKey.** fie
a930: 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ld of the table 
a940: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
a950: 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64  on to be the ind
a960: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54  ex of the.** INT
a970: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
a980: 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e   column.  Table.
a990: 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20  iPKey is set to 
a9a0: 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a  -1 if there is.*
a9b0: 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  * no INTEGER PRI
a9c0: 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20  MARY KEY..**.** 
a9d0: 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f  If the key is no
a9e0: 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
a9f0: 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63  MARY KEY, then c
aa00: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a  reate a unique.*
aa10: 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  * index for the 
aa20: 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69  key.  No index i
aa30: 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e  s created for IN
aa40: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
aa50: 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Ys..*/.void sqli
aa60: 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
aa70: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
aa80: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
aa90: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
aaa0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
aab0: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64  /* List of field
aac0: 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64   names to be ind
aad0: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
aae0: 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57  Error,      /* W
aaf0: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61  hat to do with a
ab00: 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66   uniqueness conf
ab10: 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75  lict */.  int au
ab20: 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54  toInc,      /* T
ab30: 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49  rue if the AUTOI
ab40: 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64  NCREMENT keyword
ab50: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
ab60: 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20   int sortOrder  
ab70: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f     /* SQLITE_SO_
ab80: 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f  ASC or SQLITE_SO
ab90: 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61  _DESC */.){.  Ta
aba0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
abb0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
abc0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20   Column *pCol = 
abd0: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
abe0: 2d 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65  -1, i;.  int nTe
abf0: 72 6d 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  rm;.  if( pTab==
ac00: 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79  0 ) goto primary
ac10: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28  _key_exit;.  if(
ac20: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
ac30: 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b  & TF_HasPrimaryK
ac40: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
ac50: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
ac60: 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20  , .      "table 
ac70: 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20  \"%s\" has more 
ac80: 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79  than one primary
ac90: 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61   key", pTab->zNa
aca0: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72  me);.    goto pr
acb0: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
acc0: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62 46    }.  pTab->tabF
acd0: 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50 72  lags |= TF_HasPr
ace0: 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28 20  imaryKey;.  if( 
acf0: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
ad00: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  iCol = pTab->nCo
ad10: 6c 20 2d 20 31 3b 0a 20 20 20 20 70 43 6f 6c 20  l - 1;.    pCol 
ad20: 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
ad30: 6f 6c 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63  ol];.    pCol->c
ad40: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
ad50: 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20  AG_PRIMKEY;.    
ad60: 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c  nTerm = 1;.  }el
ad70: 73 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20  se{.    nTerm = 
ad80: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
ad90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65    for(i=0; i<nTe
ada0: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
adb0: 45 78 70 72 20 2a 70 43 45 78 70 72 20 3d 20 73  Expr *pCExpr = s
adc0: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
add0: 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  llate(pList->a[i
ade0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
adf0: 61 73 73 65 72 74 28 20 70 43 45 78 70 72 21 3d  assert( pCExpr!=
ae00: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
ae10: 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70 43 45  e3StringToId(pCE
ae20: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
ae30: 70 43 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  pCExpr->op==TK_I
ae40: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  D ){.        con
ae50: 73 74 20 63 68 61 72 20 2a 7a 43 4e 61 6d 65 20  st char *zCName 
ae60: 3d 20 70 43 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  = pCExpr->u.zTok
ae70: 65 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  en;.        for(
ae80: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
ae90: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
aea0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
aeb0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
aec0: 43 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  CName, pTab->aCo
aed0: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d  l[iCol].zName)==
aee0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
aef0: 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61   pCol = &pTab->a
af00: 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  Col[iCol];.     
af10: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c         pCol->col
af20: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
af30: 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20  _PRIMKEY;.      
af40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
af50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
af60: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
af70: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d  .  }.  if( nTerm
af80: 3d 3d 31 0a 20 20 20 26 26 20 70 43 6f 6c 0a 20  ==1.   && pCol. 
af90: 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49    && sqlite3StrI
afa0: 43 6d 70 28 73 71 6c 69 74 65 33 43 6f 6c 75 6d  Cmp(sqlite3Colum
afb0: 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c 20  nType(pCol,""), 
afc0: 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20  "INTEGER")==0.  
afd0: 20 26 26 20 73 6f 72 74 4f 72 64 65 72 21 3d 53   && sortOrder!=S
afe0: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 0a 20 20  QLITE_SO_DESC.  
aff0: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  ){.    pTab->iPK
b000: 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70  ey = iCol;.    p
b010: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28  Tab->keyConf = (
b020: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  u8)onError;.    
b030: 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d  assert( autoInc=
b040: 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31  =0 || autoInc==1
b050: 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61   );.    pTab->ta
b060: 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e  bFlags |= autoIn
b070: 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  c*TF_Autoincreme
b080: 6e 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  nt;.    if( pLis
b090: 74 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b 53  t ) pParse->iPkS
b0a0: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74  ortOrder = pList
b0b0: 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
b0c0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75  ;.  }else if( au
b0d0: 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66  toInc ){.#ifndef
b0e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
b0f0: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73  OINCREMENT.    s
b100: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
b110: 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52  Parse, "AUTOINCR
b120: 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c  EMENT is only al
b130: 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20  lowed on an ".  
b140: 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52       "INTEGER PR
b150: 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e  IMARY KEY");.#en
b160: 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
b170: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
b180: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
b190: 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72  , 0, pList, onEr
b1a0: 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ror, 0,.        
b1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1c0: 20 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c     0, sortOrder,
b1d0: 20 30 2c 20 53 51 4c 49 54 45 5f 49 44 58 54 59   0, SQLITE_IDXTY
b1e0: 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a  PE_PRIMARYKEY);.
b1f0: 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
b200: 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f   }..primary_key_
b210: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45  exit:.  sqlite3E
b220: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
b230: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29  arse->db, pList)
b240: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
b250: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43  *.** Add a new C
b260: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
b270: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
b280: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
b290: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
b2a0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65  id sqlite3AddChe
b2b0: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ckConstraint(.  
b2c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b2d0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
b2e0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
b2f0: 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54  pCheckExpr  /* T
b300: 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73  he check express
b310: 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  ion */.){.#ifnde
b320: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
b330: 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ECK.  Table *pTa
b340: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
b350: 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33  Table;.  sqlite3
b360: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b370: 62 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26  b;.  if( pTab &&
b380: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
b390: 42 0a 20 20 20 26 26 20 21 73 71 6c 69 74 65 33  B.   && !sqlite3
b3a0: 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28  BtreeIsReadonly(
b3b0: 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e 69 74  db->aDb[db->init
b3c0: 2e 69 44 62 5d 2e 70 42 74 29 0a 20 20 29 7b 0a  .iDb].pBt).  ){.
b3d0: 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b      pTab->pCheck
b3e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
b3f0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
b400: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70   pTab->pCheck, p
b410: 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20 20  CheckExpr);.    
b420: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73  if( pParse->cons
b430: 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a  traintName.n ){.
b440: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b450: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
b460: 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63  rse, pTab->pChec
b470: 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73  k, &pParse->cons
b480: 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a  traintName, 1);.
b490: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65      }.  }else.#e
b4a0: 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
b4b0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
b4c0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65 63  Parse->db, pChec
b4d0: 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  kExpr);.  }.}../
b4e0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c  *.** Set the col
b4f0: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
b500: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
b510: 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c  ntly parsed tabl
b520: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74  e column.** to t
b530: 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e  he CollSeq given
b540: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b550: 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28  3AddCollateType(
b560: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
b570: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
b580: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
b590: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   i;.  char *zCol
b5a0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
b5b0: 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65  /* Dequoted name
b5c0: 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   of collation se
b5d0: 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69  quence */.  sqli
b5e0: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
b5f0: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
b600: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
b610: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
b620: 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61  ol-1;.  db = pPa
b630: 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c  rse->db;.  zColl
b640: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
b650: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
b660: 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c  en);.  if( !zCol
b670: 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  l ) return;..  i
b680: 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  f( sqlite3Locate
b690: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
b6a0: 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e  zColl) ){.    In
b6b0: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 73  dex *pIdx;.    s
b6c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
b6d0: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
b6e0: 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b  l);.    p->aCol[
b6f0: 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c  i].zColl = zColl
b700: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  ;.  .    /* If t
b710: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63  he column is dec
b720: 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e  lared as "<name>
b730: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c   PRIMARY KEY COL
b740: 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20  LATE <type>",.  
b750: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64    ** then an ind
b760: 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ex may have been
b770: 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73   created on this
b780: 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74   column before t
b790: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  he.    ** collat
b7a0: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64  ion type was add
b7b0: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73  ed. Correct this
b7c0: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61   if it is the ca
b7d0: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  se..    */.    f
b7e0: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65  or(pIdx=p->pInde
b7f0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
b800: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
b810: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
b820: 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  nKeyCol==1 );.  
b830: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
b840: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a  Column[0]==i ){.
b850: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
b860: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f  Coll[0] = p->aCo
b870: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[i].zColl;.    
b880: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
b890: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  e{.    sqlite3Db
b8a0: 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
b8b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
b8c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
b8d0: 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  rns the collatio
b8e0: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64  n sequence for d
b8f0: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74  atabase native t
b900: 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  ext.** encoding 
b910: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
b920: 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20  e string zName, 
b930: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a  length nName..**
b940: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
b950: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  sted collation s
b960: 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61  equence is not a
b970: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74  vailable, or not
b980: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e   available.** in
b990: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
b9a0: 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74  tive encoding, t
b9b0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
b9c0: 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20  tory is invoked 
b9d0: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74  to.** request it
b9e0: 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  . If the collati
b9f0: 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20  on factory does 
ba00: 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20  not supply such 
ba10: 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61  a sequence,.** a
ba20: 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  nd the sequence 
ba30: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
ba40: 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  another text enc
ba50: 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74  oding, then that
ba60: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
ba70: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
ba80: 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66  f no versions of
ba90: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
baa0: 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e  ollations sequen
bab0: 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ce are available
bac0: 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  , or.** another 
bad0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
bae0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
baf0: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
bb00: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
bb10: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a  .** pParse..**.*
bb20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
bb30: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
bb40: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  nd sqlite3FindCo
bb50: 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72  llSeq().  This r
bb60: 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65  outine.** invoke
bb70: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
bb80: 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e  factory if the n
bb90: 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63  amed collation c
bba0: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a  annot be found.*
bbb0: 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20  * and generates 
bbc0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
bbd0: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
bbe0: 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  : sqlite3FindCol
bbf0: 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47  lSeq(), sqlite3G
bc00: 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43  etCollSeq().*/.C
bc10: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
bc20: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
bc30: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
bc40: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
bc50: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
bc60: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38  pParse->db;.  u8
bc70: 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
bc80: 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20    u8 initbusy = 
bc90: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20  db->init.busy;. 
bca0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
bcb0: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
bcc0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
bcd0: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69  b, enc, zName, i
bce0: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20  nitbusy);.  if( 
bcf0: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70  !initbusy && (!p
bd00: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
bd10: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f  xCmp) ){.    pCo
bd20: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
bd30: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 65  ollSeq(pParse, e
bd40: 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65  nc, pColl, zName
bd50: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
bd60: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pColl;.}.../*.*
bd70: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
bd80: 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d  that will increm
bd90: 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  ent the schema c
bda0: 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ookie..**.** The
bdb0: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69   schema cookie i
bdc0: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
bdd0: 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68  ine when the sch
bde0: 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64  ema for the.** d
bdf0: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
be00: 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68    After each sch
be10: 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20  ema change, the 
be20: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20  cookie value.** 
be30: 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61  changes.  When a
be40: 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72   process first r
be50: 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20  eads the schema 
be60: 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a  it records the.*
be70: 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65  * cookie.  There
be80: 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20  after, whenever 
be90: 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73  it goes to acces
bea0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  s the database,.
beb0: 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65  ** it checks the
bec0: 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20   cookie to make 
bed0: 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20  sure the schema 
bee0: 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a  has not changed.
bef0: 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ** since it was 
bf00: 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  last read..**.**
bf10: 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f   This plan is no
bf20: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c  t completely bul
bf30: 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69  let-proof.  It i
bf40: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a  s possible for.*
bf50: 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20  * the schema to 
bf60: 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20  change multiple 
bf70: 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68  times and for th
bf80: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a  e cookie to be.*
bf90: 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72  * set back to pr
bfa0: 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20  ior value.  But 
bfb0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61  schema changes a
bfc0: 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a  re infrequent.**
bfd0: 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69   and the probabi
bfe0: 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20  lity of hitting 
bff0: 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20  the same cookie 
c000: 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a  value is only.**
c010: 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33   1 chance in 2^3
c020: 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66  2.  So we're saf
c030: 65 20 65 6e 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20  e enough..**.** 
c040: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
c050: 46 3a 20 52 2d 33 34 32 33 30 2d 35 36 30 34 39  F: R-34230-56049
c060: 20 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 69   SQLite automati
c070: 63 61 6c 6c 79 20 69 6e 63 72 65 6d 65 6e 74 73  cally increments
c080: 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76  .** the schema-v
c090: 65 72 73 69 6f 6e 20 77 68 65 6e 65 76 65 72 20  ersion whenever 
c0a0: 74 68 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  the schema chang
c0b0: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
c0c0: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
c0d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
c0e0: 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74  nt iDb){.  sqlit
c0f0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
c100: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  >db;.  Vdbe *v =
c110: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
c120: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c130: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
c140: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
c150: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c160: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
c170: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f  kie, iDb, BTREE_
c180: 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20  SCHEMA_VERSION, 
c190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c1a0: 20 20 20 20 28 69 6e 74 29 28 31 2b 28 75 6e 73      (int)(1+(uns
c1b0: 69 67 6e 65 64 29 64 62 2d 3e 61 44 62 5b 69 44  igned)db->aDb[iD
c1c0: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  b].pSchema->sche
c1d0: 6d 61 5f 63 6f 6f 6b 69 65 29 29 3b 0a 7d 0a 0a  ma_cookie));.}..
c1e0: 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68  /*.** Measure th
c1f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
c200: 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f  acters needed to
c210: 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   output the give
c220: 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e  n.** identifier.
c230: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74    The number ret
c240: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61  urned includes a
c250: 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a  ny quotes used.*
c260: 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69  * but does not i
c270: 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20  nclude the null 
c280: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a  terminator..**.*
c290: 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69  * The estimate i
c2a0: 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20  s conservative. 
c2b0: 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72   It might be lar
c2c0: 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73  ger that what is
c2d0: 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65  .** really neede
c2e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
c2f0: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e   identLength(con
c300: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
c310: 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b  nt n;.  for(n=0;
c320: 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a   *z; n++, z++){.
c330: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20      if( *z=='"' 
c340: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  ){ n++; }.  }.  
c350: 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a  return n + 2;.}.
c360: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
c370: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
c380: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75  pointer to an ou
c390: 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 65  tput buffer. The
c3a0: 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61   second .** para
c3b0: 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
c3c0: 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  er to an integer
c3d0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
c3e0: 68 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20  he offset at.** 
c3f0: 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 69  which to write i
c400: 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62  nto the output b
c410: 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63  uffer. This func
c420: 74 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a  tion copies the.
c430: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  ** nul-terminate
c440: 64 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64  d string pointed
c450: 20 74 6f 20 62 79 20 74 68 65 20 74 68 69 72 64   to by the third
c460: 20 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67   parameter, zSig
c470: 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20  nedIdent,.** to 
c480: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 66  the specified of
c490: 66 73 65 74 20 69 6e 20 74 68 65 20 62 75 66 66  fset in the buff
c4a0: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a  er and updates *
c4b0: 70 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a  pIdx to refer.**
c4c0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
c4d0: 74 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  te after the las
c4e0: 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 62  t byte written b
c4f0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
c500: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73  .** .** If the s
c510: 74 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65  tring zSignedIde
c520: 6e 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  nt consists enti
c530: 72 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75  rely of alpha-nu
c540: 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74  meric.** charact
c550: 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65  ers, does not be
c560: 67 69 6e 20 77 69 74 68 20 61 20 64 69 67 69 74  gin with a digit
c570: 20 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53   and is not an S
c580: 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74  QL keyword,.** t
c590: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
c5a0: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62   to the output b
c5b0: 75 66 66 65 72 20 65 78 61 63 74 6c 79 20 61 73  uffer exactly as
c5c0: 20 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73   it is. Otherwis
c5d0: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74  e,.** it is quot
c5e0: 65 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d  ed using double-
c5f0: 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  quotes..*/.stati
c600: 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28  c void identPut(
c610: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49  char *z, int *pI
c620: 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65  dx, char *zSigne
c630: 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67  dIdent){.  unsig
c640: 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74  ned char *zIdent
c650: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
c660: 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b  r*)zSignedIdent;
c670: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65  .  int i, j, nee
c680: 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70  dQuote;.  i = *p
c690: 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b  Idx;..  for(j=0;
c6a0: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
c6b0: 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  {.    if( !sqlit
c6c0: 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74  e3Isalnum(zIdent
c6d0: 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a  [j]) && zIdent[j
c6e0: 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a  ]!='_' ) break;.
c6f0: 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20    }.  needQuote 
c700: 3d 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  = sqlite3Isdigit
c710: 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20  (zIdent[0]).    
c720: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
c730: 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49  e3KeywordCode(zI
c740: 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a  dent, j)!=TK_ID.
c750: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 7a              || z
c760: 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20  Ident[j]!=0.    
c770: 20 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b          || j==0;
c780: 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  ..  if( needQuot
c790: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
c7a0: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
c7b0: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
c7c0: 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e    z[i++] = zIden
c7d0: 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49  t[j];.    if( zI
c7e0: 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a  dent[j]=='"' ) z
c7f0: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d  [i++] = '"';.  }
c800: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
c810: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
c820: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a  .  z[i] = 0;.  *
c830: 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a  pIdx = i;.}../*.
c840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52  ** Generate a CR
c850: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
c860: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
c870: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
c880: 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79  * table.  Memory
c890: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78   to hold the tex
c8a0: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
c8b0: 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  nt is obtained.*
c8c0: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  * from sqliteMal
c8d0: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
c8e0: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
c8f0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
c900: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
c910: 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74  *createTableStmt
c920: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
c930: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
c940: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
c950: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
c960: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
c970: 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  nd;.  Column *pC
c980: 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66  ol;.  n = 0;.  f
c990: 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f  or(pCol = p->aCo
c9a0: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
c9b0: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
c9c0: 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c  .    n += identL
c9d0: 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  ength(pCol->zNam
c9e0: 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20  e) + 5;.  }.  n 
c9f0: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
ca00: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
ca10: 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65  n<50 ){ .    zSe
ca20: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
ca30: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
ca40: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
ca50: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
ca60: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
ca70: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
ca80: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
ca90: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d    n += 35 + 6*p-
caa0: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
cab0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
cac0: 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28  Raw(0, n);.  if(
cad0: 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20   zStmt==0 ){.   
cae0: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
caf0: 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (db);.    return
cb00: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
cb10: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53  3_snprintf(n, zS
cb20: 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42  tmt, "CREATE TAB
cb30: 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c  LE ");.  k = sql
cb40: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74  ite3Strlen30(zSt
cb50: 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28  mt);.  identPut(
cb60: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e  zStmt, &k, p->zN
cb70: 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b  ame);.  zStmt[k+
cb80: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28  +] = '(';.  for(
cb90: 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d  pCol=p->aCol, i=
cba0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
cbb0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
cbc0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
cbd0: 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65  r * const azType
cbe0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f  [] = {.        /
cbf0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  * SQLITE_AFF_BLO
cc00: 42 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20  B    */ "",.    
cc10: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
cc20: 46 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20 54  F_TEXT    */ " T
cc30: 45 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  EXT",.        /*
cc40: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
cc50: 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20  RIC */ " NUM",. 
cc60: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
cc70: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20  _AFF_INTEGER */ 
cc80: 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20  " INT",.        
cc90: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  /* SQLITE_AFF_RE
cca0: 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22  AL    */ " REAL"
ccb0: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
ccc0: 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  len;.    const c
ccd0: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20  har *zType;..   
cce0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
ccf0: 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d  f(n-k, &zStmt[k]
cd00: 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b  , zSep);.    k +
cd10: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
cd20: 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20  0(&zStmt[k]);.  
cd30: 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a    zSep = zSep2;.
cd40: 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74      identPut(zSt
cd50: 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e  mt, &k, pCol->zN
cd60: 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ame);.    assert
cd70: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
cd80: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  -SQLITE_AFF_BLOB
cd90: 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73   >= 0 );.    ass
cda0: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
cdb0: 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ity-SQLITE_AFF_B
cdc0: 4c 4f 42 20 3c 20 41 72 72 61 79 53 69 7a 65 28  LOB < ArraySize(
cdd0: 61 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74  azType) );.    t
cde0: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
cdf0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
ce00: 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20  AFF_BLOB );.    
ce10: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
ce20: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
ce30: 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20  _AFF_TEXT );.   
ce40: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
ce50: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
ce60: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b  E_AFF_NUMERIC );
ce70: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
ce80: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
ce90: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
cea0: 52 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  R );.    testcas
ceb0: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
cec0: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
ced0: 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a  AL );.    .    z
cee0: 54 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43  Type = azType[pC
cef0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53  ol->affinity - S
cf00: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b  QLITE_AFF_BLOB];
cf10: 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  .    len = sqlit
cf20: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65  e3Strlen30(zType
cf30: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
cf40: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
cf50: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a  QLITE_AFF_BLOB .
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
cf70: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73  Col->affinity==s
cf80: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
cf90: 70 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a  pe(zType, 0) );.
cfa0: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d      memcpy(&zStm
cfb0: 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e  t[k], zType, len
cfc0: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b  );.    k += len;
cfd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d  .    assert( k<=
cfe0: 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n );.  }.  sqlit
cff0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c  e3_snprintf(n-k,
d000: 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22   &zStmt[k], "%s"
d010: 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72  , zEnd);.  retur
d020: 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zStmt;.}../*.*
d030: 2a 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65  * Resize an Inde
d040: 78 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64  x object to hold
d050: 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c   N columns total
d060: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
d070: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
d080: 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d  s and SQLITE_NOM
d090: 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72  EM on an OOM err
d0a0: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
d0b0: 74 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a  t resizeIndexObj
d0c0: 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ect(sqlite3 *db,
d0d0: 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e   Index *pIdx, in
d0e0: 74 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  t N){.  char *zE
d0f0: 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74  xtra;.  int nByt
d100: 65 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e  e;.  if( pIdx->n
d110: 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75  Column>=N ) retu
d120: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
d130: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73  assert( pIdx->is
d140: 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20  Resized==0 );.  
d150: 6e 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28  nByte = (sizeof(
d160: 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28  char*) + sizeof(
d170: 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a  i16) + 1)*N;.  z
d180: 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44  Extra = sqlite3D
d190: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
d1a0: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45  nByte);.  if( zE
d1b0: 78 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e  xtra==0 ) return
d1c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
d1d0: 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  PT;.  memcpy(zEx
d1e0: 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  tra, pIdx->azCol
d1f0: 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  l, sizeof(char*)
d200: 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b  *pIdx->nColumn);
d210: 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20  .  pIdx->azColl 
d220: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  = (const char**)
d230: 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61  zExtra;.  zExtra
d240: 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 2a   += sizeof(char*
d250: 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45  )*N;.  memcpy(zE
d260: 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f  xtra, pIdx->aiCo
d270: 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36  lumn, sizeof(i16
d280: 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  )*pIdx->nColumn)
d290: 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ;.  pIdx->aiColu
d2a0: 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78 74 72  mn = (i16*)zExtr
d2b0: 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73  a;.  zExtra += s
d2c0: 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20  izeof(i16)*N;.  
d2d0: 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70  memcpy(zExtra, p
d2e0: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  Idx->aSortOrder,
d2f0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b   pIdx->nColumn);
d300: 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  .  pIdx->aSortOr
d310: 64 65 72 20 3d 20 28 75 38 2a 29 7a 45 78 74 72  der = (u8*)zExtr
d320: 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  a;.  pIdx->nColu
d330: 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e  mn = N;.  pIdx->
d340: 69 73 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20  isResized = 1;. 
d350: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d360: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  K;.}../*.** Esti
d370: 6d 61 74 65 20 74 68 65 20 74 6f 74 61 6c 20 72  mate the total r
d380: 6f 77 20 77 69 64 74 68 20 66 6f 72 20 61 20 74  ow width for a t
d390: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
d3a0: 76 6f 69 64 20 65 73 74 69 6d 61 74 65 54 61 62  void estimateTab
d3b0: 6c 65 57 69 64 74 68 28 54 61 62 6c 65 20 2a 70  leWidth(Table *p
d3c0: 54 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Tab){.  unsigned
d3d0: 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63   wTable = 0;.  c
d3e0: 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61  onst Column *pTa
d3f0: 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  bCol;.  int i;. 
d400: 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f   for(i=pTab->nCo
d410: 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d  l, pTabCol=pTab-
d420: 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c  >aCol; i>0; i--,
d430: 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20   pTabCol++){.   
d440: 20 77 54 61 62 6c 65 20 2b 3d 20 70 54 61 62 43   wTable += pTabC
d450: 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20  ol->szEst;.  }. 
d460: 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79   if( pTab->iPKey
d470: 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20  <0 ) wTable++;. 
d480: 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
d490: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
d4a0: 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a  wTable*4);.}../*
d4b0: 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
d4c0: 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66   average size of
d4d0: 20 61 20 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e   a row for an in
d4e0: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
d4f0: 6f 69 64 20 65 73 74 69 6d 61 74 65 49 6e 64 65  oid estimateInde
d500: 78 57 69 64 74 68 28 49 6e 64 65 78 20 2a 70 49  xWidth(Index *pI
d510: 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  dx){.  unsigned 
d520: 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e  wIndex = 0;.  in
d530: 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  t i;.  const Col
d540: 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78  umn *aCol = pIdx
d550: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a  ->pTable->aCol;.
d560: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
d570: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
d580: 7b 0a 20 20 20 20 69 31 36 20 78 20 3d 20 70 49  {.    i16 x = pI
d590: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
d5a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 78 3c 70  .    assert( x<p
d5b0: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f  Idx->pTable->nCo
d5c0: 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78 20  l );.    wIndex 
d5d0: 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f  += x<0 ? 1 : aCo
d5e0: 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  l[pIdx->aiColumn
d5f0: 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a  [i]].szEst;.  }.
d600: 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77    pIdx->szIdxRow
d610: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
d620: 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f  (wIndex*4);.}../
d630: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
d640: 20 76 61 6c 75 65 20 78 20 69 73 20 66 6f 75 6e   value x is foun
d650: 64 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72  d any of the fir
d660: 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20  st nCol entries 
d670: 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74  of aiCol[].*/.st
d680: 61 74 69 63 20 69 6e 74 20 68 61 73 43 6f 6c 75  atic int hasColu
d690: 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a 61 69  mn(const i16 *ai
d6a0: 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69  Col, int nCol, i
d6b0: 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c 65 28 20  nt x){.  while( 
d6c0: 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28  nCol-- > 0 ) if(
d6d0: 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29   x==*(aiCol++) )
d6e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
d6f0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
d700: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  This routine run
d710: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
d720: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
d730: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
d740: 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 20 57   that.** has a W
d750: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 63 6c 61  ITHOUT ROWID cla
d760: 75 73 65 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66  use.  The job of
d770: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
d780: 20 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f 74 68   to convert both
d790: 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  .** internal sch
d7a0: 65 6d 61 20 64 61 74 61 20 73 74 72 75 63 74 75  ema data structu
d7b0: 72 65 73 20 61 6e 64 20 74 68 65 20 67 65 6e 65  res and the gene
d7c0: 72 61 74 65 64 20 56 44 42 45 20 63 6f 64 65 20  rated VDBE code 
d7d0: 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  so that they.** 
d7e0: 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  are appropriate 
d7f0: 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f  for a WITHOUT RO
d800: 57 49 44 20 74 61 62 6c 65 20 69 6e 73 74 65 61  WID table instea
d810: 64 20 6f 66 20 61 20 72 6f 77 69 64 20 74 61 62  d of a rowid tab
d820: 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73 20 69  le..** Changes i
d830: 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  nclude:.**.**   
d840: 20 20 28 31 29 20 20 53 65 74 20 61 6c 6c 20 63    (1)  Set all c
d850: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52  olumns of the PR
d860: 49 4d 41 52 59 20 4b 45 59 20 73 63 68 65 6d 61  IMARY KEY schema
d870: 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 4e 4f   object to be NO
d880: 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20 20 28  T NULL..**     (
d890: 32 29 20 20 43 6f 6e 76 65 72 74 20 50 33 20 70  2)  Convert P3 p
d8a0: 61 72 61 6d 65 74 65 72 20 6f 66 20 74 68 65 20  arameter of the 
d8b0: 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 20 66  OP_CreateBtree f
d8c0: 72 6f 6d 20 42 54 52 45 45 5f 49 4e 54 4b 45 59  rom BTREE_INTKEY
d8d0: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e   .**          in
d8e0: 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59  to BTREE_BLOBKEY
d8f0: 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 42 79  ..**     (3)  By
d900: 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69 6f  pass the creatio
d910: 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  n of the sqlite_
d920: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74  master table ent
d930: 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ry.**          f
d940: 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  or the PRIMARY K
d950: 45 59 20 61 73 20 74 68 65 20 70 72 69 6d 61 72  EY as the primar
d960: 79 20 6b 65 79 20 69 6e 64 65 78 20 69 73 20 6e  y key index is n
d970: 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  ow.**          i
d980: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
d990: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
d9a0: 61 62 6c 65 20 65 6e 74 72 79 20 6f 66 20 74 68  able entry of th
d9b0: 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 0a  e table itself..
d9c0: 2a 2a 20 20 20 20 20 28 34 29 20 20 53 65 74 20  **     (4)  Set 
d9d0: 74 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d 20 6f  the Index.tnum o
d9e0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
d9f0: 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  Y Index object i
da00: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
da10: 20 20 73 63 68 65 6d 61 20 74 6f 20 74 68 65 20    schema to the 
da20: 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20 74 68  rootpage from th
da30: 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a  e main table..**
da40: 20 20 20 20 20 28 35 29 20 20 41 64 64 20 61 6c       (5)  Add al
da50: 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  l table columns 
da60: 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  to the PRIMARY K
da70: 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 0a  EY Index object.
da80: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 20 74  **          so t
da90: 68 61 74 20 74 68 65 20 50 52 49 4d 41 52 59 20  hat the PRIMARY 
daa0: 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72 69 6e  KEY is a coverin
dab0: 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20 73 75  g index.  The su
dac0: 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20 20 20  rplus.**        
dad0: 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 61    columns are pa
dae0: 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e 6e 41  rt of KeyInfo.nA
daf0: 6c 6c 46 69 65 6c 64 20 61 6e 64 20 61 72 65 20  llField and are 
db00: 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  not used for.** 
db10: 20 20 20 20 20 20 20 20 20 73 6f 72 74 69 6e 67           sorting
db20: 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e   or lookup or un
db30: 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b 73 2e  iqueness checks.
db40: 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52 65 70  .**     (6)  Rep
db50: 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64 20 74  lace the rowid t
db60: 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d  ail on all autom
db70: 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74  atically generat
db80: 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20  ed UNIQUE.**    
db90: 20 20 20 20 20 20 69 6e 64 69 63 65 73 20 77 69        indices wi
dba0: 74 68 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  th the PRIMARY K
dbb0: 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a  EY columns..**.*
dbc0: 2a 20 46 6f 72 20 76 69 72 74 75 61 6c 20 74 61  * For virtual ta
dbd0: 62 6c 65 73 2c 20 6f 6e 6c 79 20 28 31 29 20 69  bles, only (1) i
dbe0: 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2f 0a  s performed..*/.
dbf0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 76  static void conv
dc00: 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69  ertToWithoutRowi
dc10: 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  dTable(Parse *pP
dc20: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
dc30: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  b){.  Index *pId
dc40: 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b  x;.  Index *pPk;
dc50: 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e  .  int nPk;.  in
dc60: 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65  t i, j;.  sqlite
dc70: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
dc80: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  db;.  Vdbe *v = 
dc90: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a  pParse->pVdbe;..
dca0: 20 20 2f 2a 20 4d 61 72 6b 20 65 76 65 72 79 20    /* Mark every 
dcb0: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
dcc0: 6d 6e 20 61 73 20 4e 4f 54 20 4e 55 4c 4c 20 28  mn as NOT NULL (
dcd0: 65 78 63 65 70 74 20 66 6f 72 20 69 6d 70 6f 73  except for impos
dce0: 74 65 72 20 74 61 62 6c 65 73 29 0a 20 20 2a 2f  ter tables).  */
dcf0: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
dd00: 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29  .imposterTable )
dd10: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
dd20: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
dd30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  ){.      if( (pT
dd40: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46  ab->aCol[i].colF
dd50: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50  lags & COLFLAG_P
dd60: 52 49 4d 4b 45 59 29 21 3d 30 20 29 7b 0a 20 20  RIMKEY)!=0 ){.  
dd70: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
dd80: 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 4f 45  [i].notNull = OE
dd90: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
dda0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
ddb0: 54 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 72  The remaining tr
ddc0: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 20 6f 6e  ansformations on
ddd0: 6c 79 20 61 70 70 6c 79 20 74 6f 20 62 2d 74 72  ly apply to b-tr
dde0: 65 65 20 74 61 62 6c 65 73 2c 20 6e 6f 74 20 74  ee tables, not t
ddf0: 6f 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74  o.  ** virtual t
de00: 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 49  ables */.  if( I
de10: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
de20: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 43   return;..  /* C
de30: 6f 6e 76 65 72 74 20 74 68 65 20 50 33 20 6f 70  onvert the P3 op
de40: 65 72 61 6e 64 20 6f 66 20 74 68 65 20 4f 50 5f  erand of the OP_
de50: 43 72 65 61 74 65 42 74 72 65 65 20 6f 70 63 6f  CreateBtree opco
de60: 64 65 20 66 72 6f 6d 20 42 54 52 45 45 5f 49 4e  de from BTREE_IN
de70: 54 4b 45 59 0a 20 20 2a 2a 20 69 6e 74 6f 20 42  TKEY.  ** into B
de80: 54 52 45 45 5f 42 4c 4f 42 4b 45 59 2e 0a 20 20  TREE_BLOBKEY..  
de90: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
dea0: 3e 61 64 64 72 43 72 54 61 62 20 29 7b 0a 20 20  >addrCrTab ){.  
deb0: 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20    assert( v );. 
dec0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
ded0: 61 6e 67 65 50 33 28 76 2c 20 70 50 61 72 73 65  angeP3(v, pParse
dee0: 2d 3e 61 64 64 72 43 72 54 61 62 2c 20 42 54 52  ->addrCrTab, BTR
def0: 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a 20 20 7d  EE_BLOBKEY);.  }
df00: 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
df10: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
df20: 64 65 78 2e 20 20 4f 72 2c 20 69 66 20 74 68 69  dex.  Or, if thi
df30: 73 20 74 61 62 6c 65 20 77 61 73 20 6f 72 69 67  s table was orig
df40: 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61 6e 20 49  inally.  ** an I
df50: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
df60: 45 59 20 74 61 62 6c 65 2c 20 63 72 65 61 74 65  EY table, create
df70: 20 61 20 6e 65 77 20 50 52 49 4d 41 52 59 20 4b   a new PRIMARY K
df80: 45 59 20 69 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a  EY index. .  */.
df90: 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
dfa0: 79 3e 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72  y>=0 ){.    Expr
dfb0: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20  List *pList;.   
dfc0: 20 54 6f 6b 65 6e 20 69 70 6b 54 6f 6b 65 6e 3b   Token ipkToken;
dfd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65  .    sqlite3Toke
dfe0: 6e 49 6e 69 74 28 26 69 70 6b 54 6f 6b 65 6e 2c  nInit(&ipkToken,
dff0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
e000: 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b  ->iPKey].zName);
e010: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
e020: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
e030: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 0a 20  nd(pParse, 0, . 
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e050: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
e060: 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 69 70  c(db, TK_ID, &ip
e070: 6b 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20  kToken, 0));.   
e080: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
e090: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 69 73  return;.    pLis
e0a0: 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  t->a[0].sortOrde
e0b0: 72 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 6b 53  r = pParse->iPkS
e0c0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 61 73  ortOrder;.    as
e0d0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e  sert( pParse->pN
e0e0: 65 77 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b  ewTable==pTab );
e0f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65 61  .    sqlite3Crea
e100: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
e110: 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20  0, 0, 0, pList, 
e120: 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30  pTab->keyConf, 0
e130: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  , 0, 0, 0,.     
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45    SQLITE_IDXTYPE
e160: 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20  _PRIMARYKEY);.  
e170: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
e180: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
e190: 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74  .    pPk = sqlit
e1a0: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
e1b0: 78 28 70 54 61 62 29 3b 0a 20 20 20 20 70 54 61  x(pTab);.    pTa
e1c0: 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
e1d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 20   }else{.    pPk 
e1e0: 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
e1f0: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
e200: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52  .    /*.    ** R
e210: 65 6d 6f 76 65 20 61 6c 6c 20 72 65 64 75 6e 64  emove all redund
e220: 61 6e 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  ant columns from
e230: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
e240: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
e250: 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 22 50  change.    ** "P
e260: 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 61  RIMARY KEY(a,b,a
e270: 2c 62 2c 63 2c 62 2c 63 2c 64 29 22 20 69 6e 74  ,b,c,b,c,d)" int
e280: 6f 20 6a 75 73 74 20 22 50 52 49 4d 41 52 59 20  o just "PRIMARY 
e290: 4b 45 59 28 61 2c 62 2c 63 2c 64 29 22 2e 20 20  KEY(a,b,c,d)".  
e2a0: 4c 61 74 65 72 0a 20 20 20 20 2a 2a 20 63 6f 64  Later.    ** cod
e2b0: 65 20 61 73 73 75 6d 65 73 20 74 68 65 20 50 52  e assumes the PR
e2c0: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 74 61 69  IMARY KEY contai
e2d0: 6e 73 20 6e 6f 20 72 65 70 65 61 74 65 64 20 63  ns no repeated c
e2e0: 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20  olumns..    */. 
e2f0: 20 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c     for(i=j=1; i<
e300: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b  pPk->nKeyCol; i+
e310: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61  +){.      if( ha
e320: 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43  sColumn(pPk->aiC
e330: 6f 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61  olumn, j, pPk->a
e340: 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20  iColumn[i]) ){. 
e350: 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c         pPk->nCol
e360: 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c  umn--;.      }el
e370: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d  se{.        pPk-
e380: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d  >aiColumn[j++] =
e390: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
e3a0: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
e3b0: 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  .    pPk->nKeyCo
e3c0: 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20 61 73 73  l = j;.  }.  ass
e3d0: 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20  ert( pPk!=0 );. 
e3e0: 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72 69 6e 67   pPk->isCovering
e3f0: 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 64 62 2d   = 1;.  if( !db-
e400: 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61  >init.imposterTa
e410: 62 6c 65 20 29 20 70 50 6b 2d 3e 75 6e 69 71 4e  ble ) pPk->uniqN
e420: 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 6e 50  otNull = 1;.  nP
e430: 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  k = pPk->nKeyCol
e440: 3b 0a 0a 20 20 2f 2a 20 42 79 70 61 73 73 20 74  ;..  /* Bypass t
e450: 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74  he creation of t
e460: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 62  he PRIMARY KEY b
e470: 74 72 65 65 20 61 6e 64 20 74 68 65 20 73 71 6c  tree and the sql
e480: 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20  ite_master.  ** 
e490: 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 54 68 69  table entry. Thi
e4a0: 73 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72  s is only requir
e4b0: 65 64 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20  ed if currently 
e4c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 0a  generating VDBE.
e4d0: 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72 20 61 20    ** code for a 
e4e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 28 6e 6f  CREATE TABLE (no
e4f0: 74 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 6f  t when parsing o
e500: 6e 65 20 61 73 20 70 61 72 74 20 6f 66 20 72 65  ne as part of re
e510: 61 64 69 6e 67 0a 20 20 2a 2a 20 61 20 64 61 74  ading.  ** a dat
e520: 61 62 61 73 65 20 73 63 68 65 6d 61 29 2e 20 20  abase schema).  
e530: 2a 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70 50  */.  if( v && pP
e540: 6b 2d 3e 74 6e 75 6d 3e 30 20 29 7b 0a 20 20 20  k->tnum>0 ){.   
e550: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69   assert( db->ini
e560: 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20  t.busy==0 );.   
e570: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
e580: 67 65 4f 70 63 6f 64 65 28 76 2c 20 70 50 6b 2d  geOpcode(v, pPk-
e590: 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74 6f 29 3b  >tnum, OP_Goto);
e5a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
e5b0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
e5c0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 74  PRIMARY KEY is t
e5d0: 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61  he table root pa
e5e0: 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75  ge */.  pPk->tnu
e5f0: 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a  m = pTab->tnum;.
e600: 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
e610: 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
e620: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  sentation of all
e630: 20 55 4e 49 51 55 45 20 69 6e 64 69 63 65 73 20   UNIQUE indices 
e640: 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20  by converting.  
e650: 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  ** the final row
e660: 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f  id column into o
e670: 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d  ne or more colum
e680: 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  ns of the PRIMAR
e690: 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f  Y KEY..  */.  fo
e6a0: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
e6b0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
e6c0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
e6d0: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28    int n;.    if(
e6e0: 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64   IsPrimaryKeyInd
e6f0: 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69  ex(pIdx) ) conti
e700: 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e  nue;.    for(i=n
e710: 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b  =0; i<nPk; i++){
e720: 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43  .      if( !hasC
e730: 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f  olumn(pIdx->aiCo
e740: 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  lumn, pIdx->nKey
e750: 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  Col, pPk->aiColu
e760: 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20  mn[i]) ) n++;.  
e770: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30    }.    if( n==0
e780: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
e790: 73 20 69 6e 64 65 78 20 69 73 20 61 20 73 75 70  s index is a sup
e7a0: 65 72 73 65 74 20 6f 66 20 74 68 65 20 70 72 69  erset of the pri
e7b0: 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20  mary key */.    
e7c0: 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20    pIdx->nColumn 
e7d0: 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  = pIdx->nKeyCol;
e7e0: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
e7f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
e800: 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74  esizeIndexObject
e810: 28 64 62 2c 20 70 49 64 78 2c 20 70 49 64 78 2d  (db, pIdx, pIdx-
e820: 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65  >nKeyCol+n) ) re
e830: 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  turn;.    for(i=
e840: 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  0, j=pIdx->nKeyC
e850: 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b  ol; i<nPk; i++){
e860: 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43  .      if( !hasC
e870: 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f  olumn(pIdx->aiCo
e880: 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  lumn, pIdx->nKey
e890: 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  Col, pPk->aiColu
e8a0: 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  mn[i]) ){.      
e8b0: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
e8c0: 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c  [j] = pPk->aiCol
e8d0: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  umn[i];.        
e8e0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20  pIdx->azColl[j] 
e8f0: 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  = pPk->azColl[i]
e900: 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  ;.        j++;. 
e910: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e920: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
e930: 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b  Column>=pIdx->nK
e940: 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61  eyCol+n );.    a
e950: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
e960: 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a  lumn>=j );.  }..
e970: 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61 62    /* Add all tab
e980: 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  le columns to th
e990: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
e9a0: 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  dex.  */.  if( n
e9b0: 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  Pk<pTab->nCol ){
e9c0: 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49  .    if( resizeI
e9d0: 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70  ndexObject(db, p
e9e0: 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Pk, pTab->nCol) 
e9f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f  ) return;.    fo
ea00: 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c  r(i=0, j=nPk; i<
ea10: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
ea20: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73  {.      if( !has
ea30: 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f  Column(pPk->aiCo
ea40: 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20  lumn, j, i) ){. 
ea50: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
ea60: 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  <pPk->nColumn );
ea70: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69  .        pPk->ai
ea80: 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20  Column[j] = i;. 
ea90: 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f         pPk->azCo
eaa0: 6c 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53  ll[j] = sqlite3S
eab0: 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20  trBINARY;.      
eac0: 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    j++;.      }. 
ead0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
eae0: 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a   pPk->nColumn==j
eaf0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
eb00: 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b  pTab->nCol==j );
eb10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
eb20: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61  k->nColumn = pTa
eb30: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a  b->nCol;.  }.}..
eb40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
eb50: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
eb60: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
eb70: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
eb80: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
eb90: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
eba0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
ebb0: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
ebc0: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
ebd0: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
ebe0: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
ebf0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
ec00: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
ec10: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
ec20: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
ec30: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
ec40: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
ec50: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
ec60: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
ec70: 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73   on disk, unless
ec80: 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65  .** this is a te
ec90: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
eca0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
ecb0: 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69  1.  When db->ini
ecc0: 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20  t.busy==1.** it 
ecd0: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
ece0: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
ecf0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
ed00: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
ed10: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
ed20: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
ed30: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
ed40: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
ed50: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
ed60: 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74  nged, so the ent
ed70: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
ed80: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
ed90: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
eda0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
edb0: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
edc0: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
edd0: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
ede0: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
edf0: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
ee00: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
ee10: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
ee20: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
ee30: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
ee40: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
ee50: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
ee60: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
ee70: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
ee80: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
ee90: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
eea0: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
eeb0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
eec0: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
eed0: 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  d sqlite3EndTabl
eee0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
eef0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
ef00: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
ef10: 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c  .  Token *pCons,
ef20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
ef30: 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65  e ',' token afte
ef40: 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  r the last colum
ef50: 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  n defn. */.  Tok
ef60: 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  en *pEnd,       
ef70: 20 20 20 20 20 2f 2a 20 54 68 65 20 27 29 27 20       /* The ')' 
ef80: 62 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69  before options i
ef90: 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
efa0: 4c 45 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70  LE */.  u8 tabOp
efb0: 74 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ts,             
efc0: 2f 2a 20 45 78 74 72 61 20 74 61 62 6c 65 20 6f  /* Extra table o
efd0: 70 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20  ptions. Usually 
efe0: 30 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  0. */.  Select *
eff0: 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20  pSelect         
f000: 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61  /* Select from a
f010: 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20   "CREATE ... AS 
f020: 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20  SELECT" */.){.  
f030: 54 61 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20  Table *p;       
f040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
f050: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
f060: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
f070: 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65  arse->db; /* The
f080: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
f090: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  tion */.  int iD
f0a0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
f0b0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
f0c0: 69 6e 20 77 68 69 63 68 20 74 68 65 20 74 61 62  in which the tab
f0d0: 6c 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e  le lives */.  In
f0e0: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
f0f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d          /* An im
f100: 70 6c 69 65 64 20 69 6e 64 65 78 20 6f 66 20 74  plied index of t
f110: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69  he table */..  i
f120: 66 28 20 70 45 6e 64 3d 3d 30 20 26 26 20 70 53  f( pEnd==0 && pS
f130: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
f140: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
f150: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
f160: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 70 20 3d  cFailed );.  p =
f170: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
f180: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  le;.  if( p==0 )
f190: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49   return;..  /* I
f1a0: 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
f1b0: 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e  usy is 1 it mean
f1c0: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
f1d0: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
f1e0: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
f1f0: 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65  ster" or "sqlite
f200: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61  _temp_master" ta
f210: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
f220: 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20  .  ** So do not 
f230: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73  write to the dis
f240: 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  k again.  Extrac
f250: 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
f260: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
f270: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
f280: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  he db->init.newT
f290: 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65  num field.  (The
f2a0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
f2b0: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  * should have be
f2c0: 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20  en put there by 
f2d0: 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62  the sqliteOpenCb
f2e0: 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2a 0a   routine.).  **.
f2f0: 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74    ** If the root
f300: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
f310: 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  1, that means th
f320: 69 73 20 69 73 20 74 68 65 20 73 71 6c 69 74 65  is is the sqlite
f330: 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62  _master.  ** tab
f340: 6c 65 20 69 74 73 65 6c 66 2e 20 20 53 6f 20 6d  le itself.  So m
f350: 61 72 6b 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79  ark it read-only
f360: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
f370: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
f380: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
f390: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
f3a0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
f3b0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
f3c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74  ;.    }.    p->t
f3d0: 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
f3e0: 65 77 54 6e 75 6d 3b 0a 20 20 20 20 69 66 28 20  ewTnum;.    if( 
f3f0: 70 2d 3e 74 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e  p->tnum==1 ) p->
f400: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 52  tabFlags |= TF_R
f410: 65 61 64 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20  eadonly;.  }..  
f420: 2f 2a 20 53 70 65 63 69 61 6c 20 70 72 6f 63 65  /* Special proce
f430: 73 73 69 6e 67 20 66 6f 72 20 57 49 54 48 4f 55  ssing for WITHOU
f440: 54 20 52 4f 57 49 44 20 54 61 62 6c 65 73 20 2a  T ROWID Tables *
f450: 2f 0a 20 20 69 66 28 20 74 61 62 4f 70 74 73 20  /.  if( tabOpts 
f460: 26 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69  & TF_WithoutRowi
f470: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  d ){.    if( (p-
f480: 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
f490: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b  utoincrement) ){
f4a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
f4b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
f4c0: 20 20 20 20 20 20 20 20 20 22 41 55 54 4f 49 4e           "AUTOIN
f4d0: 43 52 45 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f  CREMENT not allo
f4e0: 77 65 64 20 6f 6e 20 57 49 54 48 4f 55 54 20 52  wed on WITHOUT R
f4f0: 4f 57 49 44 20 74 61 62 6c 65 73 22 29 3b 0a 20  OWID tables");. 
f500: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
f510: 20 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74   }.    if( (p->t
f520: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
f530: 50 72 69 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29  PrimaryKey)==0 )
f540: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
f550: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
f560: 22 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 69 73  "PRIMARY KEY mis
f570: 73 69 6e 67 20 6f 6e 20 74 61 62 6c 65 20 25 73  sing on table %s
f580: 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  ", p->zName);.  
f590: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
f5a0: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
f5b0: 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 7c 20  _WithoutRowid | 
f5c0: 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69  TF_NoVisibleRowi
f5d0: 64 3b 0a 20 20 20 20 20 20 63 6f 6e 76 65 72 74  d;.      convert
f5e0: 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61  ToWithoutRowidTa
f5f0: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ble(pParse, p);.
f600: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62      }.  }..  iDb
f610: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
f620: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
f630: 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
f640: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
f650: 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  ECK.  /* Resolve
f660: 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48   names in all CH
f670: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65  ECK constraint e
f680: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
f690: 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b  .  if( p->pCheck
f6a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
f6b0: 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65  esolveSelfRefere
f6c0: 6e 63 65 28 70 50 61 72 73 65 2c 20 70 2c 20 4e  nce(pParse, p, N
f6d0: 43 5f 49 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d  C_IsCheck, 0, p-
f6e0: 3e 70 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65  >pCheck);.  }.#e
f6f0: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
f700: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45  (SQLITE_OMIT_CHE
f710: 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74  CK) */..  /* Est
f720: 69 6d 61 74 65 20 74 68 65 20 61 76 65 72 61 67  imate the averag
f730: 65 20 72 6f 77 20 73 69 7a 65 20 66 6f 72 20 74  e row size for t
f740: 68 65 20 74 61 62 6c 65 20 61 6e 64 20 66 6f 72  he table and for
f750: 20 61 6c 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64   all implied ind
f760: 69 63 65 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61  ices */.  estima
f770: 74 65 54 61 62 6c 65 57 69 64 74 68 28 70 29 3b  teTableWidth(p);
f780: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70  .  for(pIdx=p->p
f790: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
f7a0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
f7b0: 20 20 20 20 65 73 74 69 6d 61 74 65 49 6e 64 65      estimateInde
f7c0: 78 57 69 64 74 68 28 70 49 64 78 29 3b 0a 20 20  xWidth(pIdx);.  
f7d0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69  }..  /* If not i
f7e0: 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65  nitializing, the
f7f0: 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72  n create a recor
f800: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  d for the new ta
f810: 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ble.  ** in the 
f820: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
f830: 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ble of the datab
f840: 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ase..  **.  ** I
f850: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
f860: 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69  ORARY table, wri
f870: 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74  te the entry int
f880: 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a  o the auxiliary.
f890: 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61    ** file instea
f8a0: 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61  d of into the ma
f8b0: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
f8c0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
f8d0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
f8e0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64     int n;.    Vd
f8f0: 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
f900: 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76  *zType;    /* "v
f910: 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20  iew" or "table" 
f920: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  */.    char *zTy
f930: 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22  pe2;   /* "VIEW"
f940: 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20   or "TABLE" */. 
f950: 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20     char *zStmt; 
f960: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68     /* Text of th
f970: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f  e CREATE TABLE o
f980: 72 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  r CREATE VIEW st
f990: 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20  atement */..    
f9a0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
f9b0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
f9c0: 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
f9d0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73  ) return;..    s
f9e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
f9f0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29  (v, OP_Close, 0)
fa00: 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a  ;..    /* .    *
fa10: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79  * Initialize zTy
fa20: 70 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76  pe for the new v
fa30: 69 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20  iew or table..  
fa40: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
fa50: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
fa60: 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72      /* A regular
fa70: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
fa80: 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b  zType = "table";
fa90: 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20  .      zType2 = 
faa0: 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66  "TABLE";.#ifndef
fab0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
fac0: 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  W.    }else{.   
fad0: 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a     /* A view */.
fae0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76        zType = "v
faf0: 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70  iew";.      zTyp
fb00: 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e  e2 = "VIEW";.#en
fb10: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
fb20: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43  * If this is a C
fb30: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41  REATE TABLE xx A
fb40: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78  S SELECT ..., ex
fb50: 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54  ecute the SELECT
fb60: 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
fb70: 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  t to populate th
fb80: 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65  e new table. The
fb90: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
fba0: 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  r for the.    **
fbb0: 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e   new table is in
fbc0: 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65   register pParse
fbd0: 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a  ->regRoot..    *
fbe0: 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68  *.    ** Once th
fbf0: 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65  e SELECT has bee
fc00: 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74  n coded by sqlit
fc10: 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69  e3Select(), it i
fc20: 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75  s in a.    ** su
fc30: 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20  itable state to 
fc40: 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f  query for the co
fc50: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74  lumn names and t
fc60: 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a  ypes to be used.
fc70: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65      ** by the ne
fc80: 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a  w table..    **.
fc90: 20 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d      ** A shared-
fca0: 63 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  cache write-lock
fcb0: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
fcc0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
fcd0: 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20   new table,.    
fce0: 2a 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c  ** as a schema-l
fcf0: 6f 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c  ock must have al
fd00: 72 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69  ready been obtai
fd10: 6e 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74  ned to create it
fd20: 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61  . Since.    ** a
fd30: 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63   schema-lock exc
fd40: 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20  ludes all other 
fd50: 64 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20  database users, 
fd60: 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  the write-lock w
fd70: 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72  ould.    ** be r
fd80: 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f  edundant..    */
fd90: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
fda0: 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   ){.      Select
fdb0: 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 2f 2a  Dest dest;    /*
fdc0: 20 57 68 65 72 65 20 74 68 65 20 53 45 4c 45 43   Where the SELEC
fdd0: 54 20 73 68 6f 75 6c 64 20 73 74 6f 72 65 20 72  T should store r
fde0: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20  esults */.      
fdf0: 69 6e 74 20 72 65 67 59 69 65 6c 64 3b 20 20 20  int regYield;   
fe00: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
fe10: 68 6f 6c 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69  holding co-routi
fe20: 6e 65 20 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a  ne entry-point *
fe30: 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
fe40: 54 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  Top;        /* T
fe50: 6f 70 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75  op of the co-rou
fe60: 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tine */.      in
fe70: 74 20 72 65 67 52 65 63 3b 20 20 20 20 20 20 20  t regRec;       
fe80: 20 20 2f 2a 20 41 20 72 65 63 6f 72 64 20 74 6f    /* A record to
fe90: 20 62 65 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   be insert into 
fea0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f  the new table */
feb0: 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 6f  .      int regRo
fec0: 77 69 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f  wid;       /* Ro
fed0: 77 69 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20  wid of the next 
fee0: 72 6f 77 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f  row to insert */
fef0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49  .      int addrI
ff00: 6e 73 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 6f  nsLoop;    /* To
ff10: 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  p of the loop fo
ff20: 72 20 69 6e 73 65 72 74 69 6e 67 20 72 6f 77 73  r inserting rows
ff30: 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
ff40: 2a 70 53 65 6c 54 61 62 3b 20 20 20 20 20 2f 2a  *pSelTab;     /*
ff50: 20 41 20 74 61 62 6c 65 20 74 68 61 74 20 64 65   A table that de
ff60: 73 63 72 69 62 65 73 20 74 68 65 20 53 45 4c 45  scribes the SELE
ff70: 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20  CT results */.. 
ff80: 20 20 20 20 20 72 65 67 59 69 65 6c 64 20 3d 20       regYield = 
ff90: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
ffa0: 20 20 20 20 20 20 72 65 67 52 65 63 20 3d 20 2b        regRec = +
ffb0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
ffc0: 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20       regRowid = 
ffd0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
ffe0: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
fff0: 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20  rse->nTab==1);. 
10000 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41       sqlite3MayA
10010 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
10020 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10030 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
10040 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65  Write, 1, pParse
10050 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b  ->regRoot, iDb);
10060 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10070 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
10080 46 4c 41 47 5f 50 32 49 53 52 45 47 29 3b 0a 20  FLAG_P2ISREG);. 
10090 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
100a0 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 61 64 64  b = 2;.      add
100b0 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
100c0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
100d0 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   + 1;.      sqli
100e0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
100f0 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
10100 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20  e, regYield, 0, 
10110 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20  addrTop);.      
10120 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
10130 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
10140 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
10150 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
10160 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
10170 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ect);.      if( 
10180 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74  pSelTab==0 ) ret
10190 75 72 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  urn;.      asser
101a0 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  t( p->aCol==0 );
101b0 0a 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d  .      p->nCol =
101c0 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
101d0 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20        p->aCol = 
101e0 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
101f0 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
10200 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ol = 0;.      pS
10210 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
10220 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
10230 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53  leteTable(db, pS
10240 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 73 71  elTab);.      sq
10250 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
10260 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43  nit(&dest, SRT_C
10270 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
10280 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ld);.      sqlit
10290 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
102a0 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29   pSelect, &dest)
102b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
102c0 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
102d0 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  n;.      sqlite3
102e0 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
102f0 28 76 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20  (v, regYield);. 
10300 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10310 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
10320 54 6f 70 20 2d 20 31 29 3b 0a 20 20 20 20 20 20  Top - 1);.      
10330 61 64 64 72 49 6e 73 4c 6f 6f 70 20 3d 20 73 71  addrInsLoop = sq
10340 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
10350 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73  v, OP_Yield, des
10360 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  t.iSDParm);.    
10370 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
10380 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10390 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
103a0 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 64 65 73  _MakeRecord, des
103b0 74 2e 69 53 64 73 74 2c 20 64 65 73 74 2e 6e 53  t.iSdst, dest.nS
103c0 64 73 74 2c 20 72 65 67 52 65 63 29 3b 0a 20 20  dst, regRec);.  
103d0 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
103e0 41 66 66 69 6e 69 74 79 28 76 2c 20 70 2c 20 30  Affinity(v, p, 0
103f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10400 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10410 5f 4e 65 77 52 6f 77 69 64 2c 20 31 2c 20 72 65  _NewRowid, 1, re
10420 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
10430 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10440 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 31  (v, OP_Insert, 1
10450 2c 20 72 65 67 52 65 63 2c 20 72 65 67 52 6f 77  , regRec, regRow
10460 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
10470 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
10480 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20  drInsLoop);.    
10490 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
104a0 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 73  pHere(v, addrIns
104b0 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Loop);.      sql
104c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
104d0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a  , OP_Close, 1);.
104e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
104f0 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65  mpute the comple
10500 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
10510 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
10520 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  */.    if( pSele
10530 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d  ct ){.      zStm
10540 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53  t = createTableS
10550 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  tmt(db, p);.    
10560 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b  }else{.      Tok
10570 65 6e 20 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f  en *pEnd2 = tabO
10580 70 74 73 20 3f 20 26 70 50 61 72 73 65 2d 3e 73  pts ? &pParse->s
10590 4c 61 73 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64  LastToken : pEnd
105a0 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74  ;.      n = (int
105b0 29 28 70 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61  )(pEnd2->z - pPa
105c0 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
105d0 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  z);.      if( pE
105e0 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29  nd2->z[0]!=';' )
105f0 20 6e 20 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a   n += pEnd2->n;.
10600 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
10610 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
10620 20 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45   .          "CRE
10630 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54  ATE %s %.*s", zT
10640 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d  ype2, n, pParse-
10650 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20  >sNameToken.z.  
10660 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
10670 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20    /* A slot for 
10680 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20 61  the record has a
10690 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
106a0 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20  cated in the .  
106b0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54    ** SQLITE_MAST
106c0 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75  ER table.  We ju
106d0 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74  st need to updat
106e0 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68  e that slot with
106f0 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20   all.    ** the 
10700 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76  information we'v
10710 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20  e collected..   
10720 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
10730 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
10740 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45  e,.      "UPDATE
10750 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20   %Q.%s ".       
10760 20 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27    "SET type='%s'
10770 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e  , name=%Q, tbl_n
10780 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65  ame=%Q, rootpage
10790 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20  =#%d, sql=%Q ". 
107a0 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77        "WHERE row
107b0 69 64 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64  id=#%d",.      d
107c0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
107d0 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
107e0 45 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a  E,.      zType,.
107f0 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
10800 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
10810 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65        pParse->re
10820 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74  gRoot,.      zSt
10830 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  mt,.      pParse
10840 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29  ->regRowid.    )
10850 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
10860 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a  ree(db, zStmt);.
10870 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
10880 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
10890 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
108a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
108b0 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20  NCREMENT.    /* 
108c0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
108d0 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
108e0 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75  e an sqlite_sequ
108f0 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20  ence table for. 
10900 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72     ** keeping tr
10910 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65  ack of autoincre
10920 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a  ment keys..    *
10930 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61  /.    if( (p->ta
10940 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
10950 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 20 29 7b  increment)!=0 ){
10960 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d  .      Db *pDb =
10970 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
10980 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
10990 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
109a0 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
109b0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44   );.      if( pD
109c0 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  b->pSchema->pSeq
109d0 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
109e0 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
109f0 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
10a00 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
10a10 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73  ABLE %Q.sqlite_s
10a20 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71  equence(name,seq
10a30 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44  )",.          pD
10a40 62 2d 3e 7a 44 62 53 4e 61 6d 65 0a 20 20 20 20  b->zDbSName.    
10a50 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
10a60 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
10a70 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72   /* Reparse ever
10a80 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65  ything to update
10a90 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61   our internal da
10aa0 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f  ta structures */
10ab0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10ac0 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70  AddParseSchemaOp
10ad0 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  (v, iDb,.       
10ae0 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
10af0 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65  tf(db, "tbl_name
10b00 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 21 3d  ='%q' AND type!=
10b10 27 74 72 69 67 67 65 72 27 22 2c 20 70 2d 3e 7a  'trigger'", p->z
10b20 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20  Name));.  }...  
10b30 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65  /* Add the table
10b40 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   to the in-memor
10b50 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
10b60 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
10b70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
10b80 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
10b90 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20    Table *pOld;. 
10ba0 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
10bb0 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b  ma = p->pSchema;
10bc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
10bd0 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
10be0 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
10bf0 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71  );.    pOld = sq
10c00 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
10c10 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  &pSchema->tblHas
10c20 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b  h, p->zName, p);
10c30 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b  .    if( pOld ){
10c40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10c50 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61  ==pOld );  /* Ma
10c60 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
10c70 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73  ailed inside Has
10c80 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20  hInsert() */.   
10c90 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
10ca0 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65  lt(db);.      re
10cb0 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
10cc0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
10cd0 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6d  e = 0;.    db->m
10ce0 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41  DbFlags |= DBFLA
10cf0 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  G_SchemaChange;.
10d00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10d10 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a  OMIT_ALTERTABLE.
10d20 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c      if( !p->pSel
10d30 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ect ){.      con
10d40 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
10d50 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
10d60 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
10d70 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  n.z;.      int n
10d80 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Name;.      asse
10d90 72 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20  rt( !pSelect && 
10da0 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b  pCons && pEnd );
10db0 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73  .      if( pCons
10dc0 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->z==0 ){.      
10dd0 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a    pCons = pEnd;.
10de0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e        }.      nN
10df0 61 6d 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e  ame = (int)((con
10e00 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d  st char *)pCons-
10e10 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >z - zName);.   
10e20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73     p->addColOffs
10e30 65 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65  et = 13 + sqlite
10e40 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61  3Utf8CharLen(zNa
10e50 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
10e60 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
10e70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10e80 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54  MIT_VIEW./*.** T
10e90 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
10ea0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20  this routine in 
10eb0 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20  order to create 
10ec0 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f  a new VIEW.*/.vo
10ed0 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
10ee0 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70  View(.  Parse *p
10ef0 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68  Parse,     /* Th
10f00 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
10f10 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42  t */.  Token *pB
10f20 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65  egin,     /* The
10f30 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
10f40 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74  at begins the st
10f50 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
10f60 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
10f70 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
10f80 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
10f90 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
10fa0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
10fb0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
10fc0 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
10fd0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
10fe0 77 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  w */.  ExprList 
10ff0 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a 20 4f 70 74  *pCNames, /* Opt
11000 69 6f 6e 61 6c 20 6c 69 73 74 20 6f 66 20 76 69  ional list of vi
11010 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ew column names 
11020 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
11030 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c  lect,   /* A SEL
11040 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
11050 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
11060 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20  he new view */. 
11070 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20   int isTemp,    
11080 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20      /* TRUE for 
11090 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77  a TEMPORARY view
110a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
110b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70           /* Supp
110c0 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61  ress error messa
110d0 67 65 73 20 69 66 20 56 49 45 57 20 61 6c 72 65  ges if VIEW alre
110e0 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
110f0 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
11100 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt n;.  const ch
11110 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73  ar *z;.  Token s
11120 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73  End;.  DbFixer s
11130 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  Fix;.  Token *pN
11140 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ame = 0;.  int i
11150 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Db;.  sqlite3 *d
11160 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
11170 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
11180 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  Var>0 ){.    sql
11190 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
111a0 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73  rse, "parameters
111b0 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
111c0 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20   in views");.   
111d0 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65   goto create_vie
111e0 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20 20 73 71  w_fail;.  }.  sq
111f0 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
11200 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
11210 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20  pName2, isTemp, 
11220 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20  1, 0, noErr);.  
11230 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
11240 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
11250 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
11260 72 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f  r ) goto create_
11270 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 73 71 6c  view_fail;.  sql
11280 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
11290 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
112a0 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
112b0 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
112c0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
112d0 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  , p->pSchema);. 
112e0 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
112f0 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
11300 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d  Db, "view", pNam
11310 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  e);.  if( sqlite
11320 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78  3FixSelect(&sFix
11330 2c 20 70 53 65 6c 65 63 74 29 20 29 20 67 6f 74  , pSelect) ) got
11340 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61  o create_view_fa
11350 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61  il;..  /* Make a
11360 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74   copy of the ent
11370 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ire SELECT state
11380 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
11390 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a  s the view..  **
113a0 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65   This will force
113b0 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f   all the Expr.to
113c0 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20  ken.z values to 
113d0 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  be dynamically. 
113e0 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61   ** allocated ra
113f0 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20  ther than point 
11400 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  to the input str
11410 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e  ing - which mean
11420 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79  s that.  ** they
11430 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66   will persist af
11440 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
11450 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63  sqlite3_exec() c
11460 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a  all returns..  *
11470 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d  /.  p->pSelect =
11480 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
11490 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45  p(db, pSelect, E
114a0 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
114b0 20 20 70 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71    p->pCheck = sq
114c0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
114d0 28 64 62 2c 20 70 43 4e 61 6d 65 73 2c 20 45 58  (db, pCNames, EX
114e0 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
114f0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
11500 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 63 72 65  ailed ) goto cre
11510 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a  ate_view_fail;..
11520 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
11530 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54  end of the CREAT
11540 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
11550 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69  .  Make sEnd poi
11560 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65  nt to.  ** the e
11570 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20  nd..  */.  sEnd 
11580 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54  = pParse->sLastT
11590 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  oken;.  assert( 
115a0 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 7c 7c 20  sEnd.z[0]!=0 || 
115b0 73 45 6e 64 2e 6e 3d 3d 30 20 29 3b 0a 20 20 69  sEnd.n==0 );.  i
115c0 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b  f( sEnd.z[0]!=';
115d0 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20  ' ){.    sEnd.z 
115e0 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20  += sEnd.n;.  }. 
115f0 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e   sEnd.n = 0;.  n
11600 20 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20   = (int)(sEnd.z 
11610 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20  - pBegin->z);.  
11620 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20  assert( n>0 );. 
11630 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a   z = pBegin->z;.
11640 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
11650 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20  Isspace(z[n-1]) 
11660 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64  ){ n--; }.  sEnd
11670 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20  .z = &z[n-1];.  
11680 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f  sEnd.n = 1;..  /
11690 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64  * Use sqlite3End
116a0 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74  Table() to add t
116b0 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53  he view to the S
116c0 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
116d0 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  le */.  sqlite3E
116e0 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  ndTable(pParse, 
116f0 30 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b  0, &sEnd, 0, 0);
11700 0a 0a 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61  ..create_view_fa
11710 69 6c 3a 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  il:.  sqlite3Sel
11720 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
11730 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
11740 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
11750 64 62 2c 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20  db, pCNames);.  
11760 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66  return;.}.#endif
11770 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
11780 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65  VIEW */..#if !de
11790 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
117a0 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
117b0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
117c0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a  VIRTUALTABLE)./*
117d0 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
117e0 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69  ructure pTable i
117f0 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e  s really a VIEW.
11800 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61    Fill in the na
11810 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f  mes of.** the co
11820 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65  lumns of the vie
11830 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20  w in the pTable 
11840 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75  structure.  Retu
11850 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  rn the number.**
11860 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
11870 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e  an error is seen
11880 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
11890 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
118a0 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69  e->zErrMsg..*/.i
118b0 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  nt sqlite3ViewGe
118c0 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72  tColumnNames(Par
118d0 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
118e0 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61  e *pTable){.  Ta
118f0 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20  ble *pSelTab;   
11900 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20  /* A fake table 
11910 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65  from which we ge
11920 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  t the result set
11930 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
11940 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  el;     /* Copy 
11950 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 74 68  of the SELECT th
11960 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
11970 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  e view */.  int 
11980 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a  nErr = 0;     /*
11990 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   Number of error
119a0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f  s encountered */
119b0 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
119c0 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
119d0 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75  ily holds the nu
119e0 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
119f0 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71  assigned */.  sq
11a00 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
11a10 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
11a20 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
11a30 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  for malloc error
11a40 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  s */.#ifndef SQL
11a50 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
11a60 54 41 42 4c 45 0a 20 20 69 6e 74 20 72 63 3b 0a  TABLE.  int rc;.
11a70 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
11a80 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
11a90 52 49 5a 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74  RIZATION.  sqlit
11aa0 65 33 5f 78 61 75 74 68 20 78 41 75 74 68 3b 20  e3_xauth xAuth; 
11ab0 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 78        /* Saved x
11ac0 41 75 74 68 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  Auth pointer */.
11ad0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
11ae0 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66  ( pTable );..#if
11af0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11b00 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
11b10 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 2b  db->nSchemaLock+
11b20 2b 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  +;.  rc = sqlite
11b30 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74  3VtabCallConnect
11b40 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29  (pParse, pTable)
11b50 3b 0a 20 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c  ;.  db->nSchemaL
11b60 6f 63 6b 2d 2d 3b 0a 20 20 69 66 28 20 72 63 20  ock--;.  if( rc 
11b70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
11b80 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72  .  }.  if( IsVir
11b90 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72  tual(pTable) ) r
11ba0 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
11bb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11bc0 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41  OMIT_VIEW.  /* A
11bd0 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d   positive nCol m
11be0 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73  eans the columns
11bf0 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20   names for this 
11c00 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c  view are.  ** al
11c10 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a  ready known..  *
11c20 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
11c30 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20  nCol>0 ) return 
11c40 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74  0;..  /* A negat
11c50 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70  ive nCol is a sp
11c60 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61  ecial marker mea
11c70 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65  ning that we are
11c80 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20   currently.  ** 
11c90 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74  trying to comput
11ca0 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
11cb0 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72  es.  If we enter
11cc0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
11cd0 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69  th.  ** a negati
11ce0 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e  ve nCol, it mean
11cf0 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69  s two or more vi
11d00 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c  ews form a loop,
11d10 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a   like this:.  **
11d20 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
11d30 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c   VIEW one AS SEL
11d40 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a  ECT * FROM two;.
11d50 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
11d60 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45  VIEW two AS SELE
11d70 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20  CT * FROM one;. 
11d80 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
11d90 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61 62 6f  y, the error abo
11da0 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74  ve is now caught
11db0 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69   prior to reachi
11dc0 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20  ng this point.. 
11dd0 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f 6c 6c   ** But the foll
11de0 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20 73 74  owing test is st
11df0 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61 73  ill important as
11e00 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20 75 70   it does come up
11e10 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c  .  ** in the fol
11e20 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20  lowing:.  ** .  
11e30 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
11e40 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b  BLE main.ex1(a);
11e50 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
11e60 20 54 45 4d 50 20 56 49 45 57 20 65 78 31 20 41   TEMP VIEW ex1 A
11e70 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20  S SELECT a FROM 
11e80 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45  ex1;.  **     SE
11e90 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70  LECT * FROM temp
11ea0 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28  .ex1;.  */.  if(
11eb0 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20   pTable->nCol<0 
11ec0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
11ed0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11ee0 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63 75  view %s is circu
11ef0 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20  larly defined", 
11f00 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
11f10 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
11f20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  }.  assert( pTab
11f30 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a  le->nCol>=0 );..
11f40 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
11f50 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
11f60 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d  s we need to com
11f70 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e  pute the table n
11f80 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20  ames..  ** Note 
11f90 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f  that the call to
11fa0 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
11fb0 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c  tOfSelect() will
11fc0 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a   expand any.  **
11fd0 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e   "*" elements in
11fe0 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65 74   the results set
11ff0 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e 64   of the view and
12000 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72   will assign cur
12010 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  sors.  ** to the
12020 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
12030 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42   FROM clause.  B
12040 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e  ut we do not wan
12050 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a  t these changes.
12060 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61    ** to be perma
12070 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f  nent.  So the co
12080 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e  mputation is don
12090 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74  e on a copy of t
120a0 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73  he SELECT.  ** s
120b0 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
120c0 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
120d0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
120e0 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
120f0 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74  ;.  pSel = sqlit
12100 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
12110 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c  pTable->pSelect,
12120 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20   0);.  if( pSel 
12130 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73  ){.    n = pPars
12140 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c  e->nTab;.    sql
12150 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
12160 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
12170 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20   pSel->pSrc);.  
12180 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
12190 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f   -1;.    db->loo
121a0 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2b  kaside.bDisable+
121b0 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
121c0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
121d0 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d  TION.    xAuth =
121e0 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20   db->xAuth;.    
121f0 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20  db->xAuth = 0;. 
12200 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
12210 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
12220 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
12230 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75  el);.    db->xAu
12240 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73  th = xAuth;.#els
12250 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20  e.    pSelTab = 
12260 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
12270 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
12280 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20   pSel);.#endif. 
12290 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
122a0 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 54 61  = n;.    if( pTa
122b0 62 6c 65 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20  ble->pCheck ){. 
122c0 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20 56       /* CREATE V
122d0 49 45 57 20 6e 61 6d 65 28 61 72 67 6c 69 73 74  IEW name(arglist
122e0 29 20 41 53 20 2e 2e 2e 0a 20 20 20 20 20 20 2a  ) AS ....      *
122f0 2a 20 54 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  * The names of t
12300 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  he columns in th
12310 65 20 74 61 62 6c 65 20 61 72 65 20 74 61 6b 65  e table are take
12320 6e 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20  n from.      ** 
12330 61 72 67 6c 69 73 74 20 77 68 69 63 68 20 69 73  arglist which is
12340 20 73 74 6f 72 65 64 20 69 6e 20 70 54 61 62 6c   stored in pTabl
12350 65 2d 3e 70 43 68 65 63 6b 2e 20 20 54 68 65 20  e->pCheck.  The 
12360 70 43 68 65 63 6b 20 66 69 65 6c 64 0a 20 20 20  pCheck field.   
12370 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 68     ** normally h
12380 6f 6c 64 73 20 43 48 45 43 4b 20 63 6f 6e 73 74  olds CHECK const
12390 72 61 69 6e 74 73 20 6f 6e 20 61 6e 20 6f 72 64  raints on an ord
123a0 69 6e 61 72 79 20 74 61 62 6c 65 2c 20 62 75 74  inary table, but
123b0 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 20   for.      ** a 
123c0 56 49 45 57 20 69 74 20 68 6f 6c 64 73 20 74 68  VIEW it holds th
123d0 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
123e0 20 6e 61 6d 65 73 2e 0a 20 20 20 20 20 20 2a 2f   names..      */
123f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
12400 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
12410 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  t(pParse, pTable
12420 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20  ->pCheck, .     
12430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12440 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54 61              &pTa
12450 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  ble->nCol, &pTab
12460 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20  le->aCol);.     
12470 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
12480 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 20  ailed==0 .      
12490 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
124a0 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 54  ==0.       && pT
124b0 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c  able->nCol==pSel
124c0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a  ->pEList->nExpr.
124d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
124e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
124f0 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
12500 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
12510 70 54 61 62 6c 65 2c 20 70 53 65 6c 29 3b 0a 20  pTable, pSel);. 
12520 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
12530 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
12540 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20        /* CREATE 
12550 56 49 45 57 20 6e 61 6d 65 20 41 53 2e 2e 2e 20  VIEW name AS... 
12560 20 77 69 74 68 6f 75 74 20 61 6e 20 61 72 67 75   without an argu
12570 6d 65 6e 74 20 6c 69 73 74 2e 20 20 43 6f 6e 73  ment list.  Cons
12580 74 72 75 63 74 0a 20 20 20 20 20 20 2a 2a 20 74  truct.      ** t
12590 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
125a0 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
125b0 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
125c0 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
125d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
125e0 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
125f0 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
12600 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
12610 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
12620 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
12630 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
12640 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
12650 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
12660 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
12670 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
12680 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
12690 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
126a0 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
126b0 29 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ) );.    }else{.
126c0 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43        pTable->nC
126d0 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45  ol = 0;.      nE
126e0 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rr++;.    }.    
126f0 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
12700 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b  le(db, pSelTab);
12710 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
12720 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
12730 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  l);.    db->look
12740 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2d 2d  aside.bDisable--
12750 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
12760 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70   nErr++;.  }.  p
12770 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
12780 73 63 68 65 6d 61 46 6c 61 67 73 20 7c 3d 20 44  schemaFlags |= D
12790 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a  B_UnresetViews;.
127a0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
127b0 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20  _OMIT_VIEW */.  
127c0 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
127d0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
127e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
127f0 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
12800 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
12810 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
12820 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12830 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43  MIT_VIEW./*.** C
12840 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
12850 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79  names from every
12860 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73   VIEW in databas
12870 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  e idx..*/.static
12880 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
12890 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33  ResetAll(sqlite3
128a0 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a   *db, int idx){.
128b0 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
128c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
128d0 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
128e0 64 62 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a 20  db, idx, 0) );. 
128f0 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65   if( !DbHasPrope
12900 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
12910 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20  UnresetViews) ) 
12920 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
12930 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
12940 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53  &db->aDb[idx].pS
12950 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
12960 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e   i;i=sqliteHashN
12970 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62  ext(i)){.    Tab
12980 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
12990 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
129a0 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
129b0 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
129c0 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  ite3DeleteColumn
129d0 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29 3b  Names(db, pTab);
129e0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  .      pTab->aCo
129f0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61  l = 0;.      pTa
12a00 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
12a10 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
12a20 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
12a30 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
12a40 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  s);.}.#else.# de
12a50 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52  fine sqliteViewR
12a60 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e  esetAll(A,B).#en
12a70 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
12a80 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_VIEW */../*.*
12a90 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
12aa0 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
12ab0 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20   VDBE to adjust 
12ac0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
12ad0 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53  ema.** used by S
12ae0 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62  QLite when the b
12af0 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73  tree layer moves
12b00 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61   a table root pa
12b10 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d  ge. The.** root-
12b20 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
12b30 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61  or index in data
12b40 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61  base iDb has cha
12b50 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a  nged from iFrom.
12b60 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a  ** to iTo..**.**
12b70 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20   Ticket #1728:  
12b80 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65  The symbol table
12b90 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e   might still con
12ba0 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tain information
12bb0 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e  .** on tables an
12bc0 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61  d/or indices tha
12bd0 74 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73  t are the proces
12be0 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74  s of being delet
12bf0 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72  ed..** If you ar
12c00 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f  e unlucky, one o
12c10 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20  f those deleted 
12c20 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65  indices or table
12c30 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20  s might.** have 
12c40 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67  the same rootpag
12c50 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  e number as the 
12c60 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e  real table or in
12c70 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62  dex that is.** b
12c80 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20  eing moved.  So 
12c90 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73  we cannot stop s
12ca0 65 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74  earching after t
12cb0 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a  he first match .
12cc0 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ** because the f
12cd0 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74  irst match might
12ce0 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74   be for one of t
12cf0 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  he deleted indic
12d00 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20  es.** or tables 
12d10 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c  and not the tabl
12d20 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  e/index that is 
12d30 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d  actually being m
12d40 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74  oved..** We must
12d50 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e   continue loopin
12d60 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c  g until all tabl
12d70 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77  es and indices w
12d80 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d  ith.** rootpage=
12d90 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e  =iFrom have been
12da0 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61   converted to ha
12db0 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66  ve a rootpage of
12dc0 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72   iTo.** in order
12dd0 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74   to be certain t
12de0 68 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72  hat we got the r
12df0 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66  ight one..*/.#if
12e00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12e10 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64  _AUTOVACUUM.void
12e20 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65   sqlite3RootPage
12e30 4d 6f 76 65 64 28 73 71 6c 69 74 65 33 20 2a 64  Moved(sqlite3 *d
12e40 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
12e50 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
12e60 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  .  HashElem *pEl
12e70 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73  em;.  Hash *pHas
12e80 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  h;.  Db *pDb;.. 
12e90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12ea0 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
12eb0 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
12ec0 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
12ed0 69 44 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20  iDb];.  pHash = 
12ee0 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
12ef0 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  blHash;.  for(pE
12f00 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
12f10 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
12f20 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
12f30 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
12f40 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
12f50 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
12f60 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
12f70 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pTab->tnum==iF
12f80 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61  rom ){.      pTa
12f90 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  b->tnum = iTo;. 
12fa0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68     }.  }.  pHash
12fb0 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
12fc0 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72  ->idxHash;.  for
12fd0 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
12fe0 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
12ff0 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
13000 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
13010 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  )){.    Index *p
13020 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Idx = sqliteHash
13030 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
13040 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d   if( pIdx->tnum=
13050 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
13060 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pIdx->tnum = iTo
13070 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
13080 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
13090 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  e code to erase 
130a0 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
130b0 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
130c0 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44  from database iD
130d0 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65  b..** Also write
130e0 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20   code to modify 
130f0 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
13100 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65  r table and inte
13110 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69  rnal schema.** i
13120 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  f a root-page of
13130 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
13140 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
13150 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73  tree-layer whils
13160 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61  t.** erasing iTa
13170 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61  ble (this can ha
13180 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74  ppen with an aut
13190 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
131a0 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  e)..*/ .static v
131b0 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  oid destroyRootP
131c0 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  age(Parse *pPars
131d0 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  e, int iTable, i
131e0 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
131f0 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
13200 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
13210 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
13220 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
13230 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 54 61  );.  assert( iTa
13240 62 6c 65 3e 31 20 29 3b 0a 20 20 73 71 6c 69 74  ble>1 );.  sqlit
13250 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
13260 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62  OP_Destroy, iTab
13270 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20 20  le, r1, iDb);.  
13280 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
13290 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66  pParse);.#ifndef
132a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
132b0 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f  OVACUUM.  /* OP_
132c0 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61  Destroy stores a
132d0 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e  n in integer r1.
132e0 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72   If this integer
132f0 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  .  ** is non-zer
13300 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  o, then it is th
13310 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
13320 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f  er of a table mo
13330 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61  ved to.  ** loca
13340 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65  tion iTable. The
13350 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
13360 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c  modifies the sql
13370 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
13380 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74   to.  ** reflect
13390 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   this..  **.  **
133a0 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74   The "#NNN" in t
133b0 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63  he SQL is a spec
133c0 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ial constant tha
133d0 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72  t means whatever
133e0 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69   value.  ** is i
133f0 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20  n register NNN. 
13400 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75 6c   See grammar rul
13410 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
13420 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53 54  th the TK_REGIST
13430 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f  ER.  ** token fo
13440 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
13450 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  ormation..  */. 
13460 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
13470 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
13480 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
13490 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20  SET rootpage=%d 
134a0 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f  WHERE #%d AND ro
134b0 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20  otpage=#%d",.   
134c0 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44    pParse->db->aD
134d0 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c  b[iDb].zDbSName,
134e0 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 69 54   MASTER_NAME, iT
134f0 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23  able, r1, r1);.#
13500 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52  endif.  sqlite3R
13510 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
13520 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
13530 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63  .** Write VDBE c
13540 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62  ode to erase tab
13550 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20  le pTab and all 
13560 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63  associated indic
13570 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43  es on disk..** C
13580 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  ode to update th
13590 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
135a0 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72  tables and inter
135b0 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e  nal schema defin
135c0 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73  itions.** in cas
135d0 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65  e a root-page be
135e0 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68  longing to anoth
135f0 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
13600 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c  d by the btree l
13610 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20  ayer.** is also 
13620 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20  added (this can 
13630 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
13640 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
13650 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
13660 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c  void destroyTabl
13670 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
13680 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20   Table *pTab){. 
13690 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
136a0 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d  ase may be auto-
136b0 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28  vacuum capable (
136c0 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  if SQLITE_OMIT_A
136d0 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69  UTOVACUUM.  ** i
136e0 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20  s not defined), 
136f0 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72  then it is impor
13700 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f  tant to call OP_
13710 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20  Destroy on the. 
13720 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e   ** table and in
13730 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69  dex root-pages i
13740 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e  n order, startin
13750 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72  g with the numer
13760 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72  ically .  ** lar
13770 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
13780 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72  umber. This guar
13790 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65  antees that none
137a0 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   of the root-pag
137b0 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65  es.  ** to be de
137c0 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63  stroyed is reloc
137d0 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ated by an earli
137e0 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69  er OP_Destroy. i
137f0 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  .e. if the.  ** 
13800 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63  following were c
13810 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oded:.  **.  ** 
13820 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20  OP_Destroy 4 0. 
13830 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f   ** ....  ** OP_
13840 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a  Destroy 5 0.  **
13850 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70  .  ** and root p
13860 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74  age 5 happened t
13870 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74  o be the largest
13880 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
13890 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  r in the.  ** da
138a0 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f  tabase, then roo
138b0 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62  t page 5 would b
138c0 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20  e moved to page 
138d0 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22  4 by the .  ** "
138e0 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20  OP_Destroy 4 0" 
138f0 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73  opcode. The subs
13900 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72  equent "OP_Destr
13910 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69  oy 5 0" would hi
13920 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69  t.  ** a free-li
13930 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  st page..  */.  
13940 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d  int iTab = pTab-
13950 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65  >tnum;.  int iDe
13960 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20  stroyed = 0;..  
13970 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
13980 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
13990 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20   int iLargest = 
139a0 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73  0;..    if( iDes
139b0 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61  troyed==0 || iTa
139c0 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a  b<iDestroyed ){.
139d0 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
139e0 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20   iTab;.    }.   
139f0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
13a00 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
13a10 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
13a20 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20  .      int iIdx 
13a30 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20  = pIdx->tnum;.  
13a40 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
13a50 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
13a60 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
13a70 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65    if( (iDestroye
13a80 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44  d==0 || (iIdx<iD
13a90 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49  estroyed)) && iI
13aa0 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20  dx>iLargest ){. 
13ab0 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20         iLargest 
13ac0 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a  = iIdx;.      }.
13ad0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c      }.    if( iL
13ae0 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20  argest==0 ){.   
13af0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
13b00 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
13b10 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
13b20 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
13b30 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
13b40 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61 73 73  hema);.      ass
13b50 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
13b60 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e  Db<pParse->db->n
13b70 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65 73 74  Db );.      dest
13b80 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
13b90 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44  se, iLargest, iD
13ba0 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72  b);.      iDestr
13bb0 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b  oyed = iLargest;
13bc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
13bd0 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74 72 69  .** Remove entri
13be0 65 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  es from the sqli
13bf0 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 20  te_statN tables 
13c00 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33  (for N in (1,2,3
13c10 29 29 0a 2a 2a 20 61 66 74 65 72 20 61 20 44 52  )).** after a DR
13c20 4f 50 20 49 4e 44 45 58 20 6f 72 20 44 52 4f 50  OP INDEX or DROP
13c30 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a   TABLE command..
13c40 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
13c50 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54  qlite3ClearStatT
13c60 61 62 6c 65 73 28 0a 20 20 50 61 72 73 65 20 2a  ables(.  Parse *
13c70 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
13c80 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
13c90 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
13ca0 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  iDb,            
13cb0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
13cc0 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63  se number */.  c
13cd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
13ce0 2c 20 20 20 20 20 2f 2a 20 22 69 64 78 22 20 6f  ,     /* "idx" o
13cf0 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e  r "tbl" */.  con
13d00 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
13d10 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69      /* Name of i
13d20 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f  ndex or table */
13d30 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  .){.  int i;.  c
13d40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
13d50 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  me = pParse->db-
13d60 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
13d70 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  me;.  for(i=1; i
13d80 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  <=4; i++){.    c
13d90 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a 20 20  har zTab[24];.  
13da0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
13db0 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62 29 2c  tf(sizeof(zTab),
13dc0 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73 74 61  zTab,"sqlite_sta
13dd0 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69 66 28  t%d",i);.    if(
13de0 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
13df0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54  e(pParse->db, zT
13e00 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29 7b 0a  ab, zDbName) ){.
13e10 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
13e20 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
13e30 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
13e40 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
13e50 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20 20 20  E %s=%Q",.      
13e60 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62 2c    zDbName, zTab,
13e70 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 20   zType, zName.  
13e80 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
13e90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
13ea0 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f 70 20  te code to drop 
13eb0 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  a table..*/.void
13ec0 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70   sqlite3CodeDrop
13ed0 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
13ee0 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
13ef0 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69  , int iDb, int i
13f00 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65 20 2a  sView){.  Vdbe *
13f10 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
13f20 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
13f30 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
13f40 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d 20  er;.  Db *pDb = 
13f50 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a  &db->aDb[iDb];..
13f60 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
13f70 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
13f80 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
13f90 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
13fa0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
13fb0 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23  rse, 1, iDb);..#
13fc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13fd0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
13fe0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
13ff0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
14000 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
14010 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20  , OP_VBegin);.  
14020 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
14030 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73  rop all triggers
14040 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
14050 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
14060 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20   dropped. Code. 
14070 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64   ** is generated
14080 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69   to remove entri
14090 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d  es from sqlite_m
140a0 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 2a  aster and/or.  *
140b0 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  * sqlite_temp_ma
140c0 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65 64  ster if required
140d0 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67 67 65  ..  */.  pTrigge
140e0 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67  r = sqlite3Trigg
140f0 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  erList(pParse, p
14100 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  Tab);.  while( p
14110 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 61  Trigger ){.    a
14120 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d  ssert( pTrigger-
14130 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
14140 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20  pSchema || .    
14150 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53      pTrigger->pS
14160 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
14170 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
14180 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67   sqlite3DropTrig
14190 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70  gerPtr(pParse, p
141a0 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 70 54  Trigger);.    pT
141b0 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65  rigger = pTrigge
141c0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23  r->pNext;.  }..#
141d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
141e0 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
141f0 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79  .  /* Remove any
14200 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20   entries of the 
14210 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
14220 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  table associated
14230 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 74   with.  ** the t
14240 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
14250 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  ed. This is done
14260 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c   before the tabl
14270 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 2a  e is dropped.  *
14280 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20 6c  * at the btree l
14290 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68  evel, in case th
142a0 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
142b0 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f  e table needs to
142c0 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20  .  ** move as a 
142d0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72  result of the dr
142e0 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69  op (can happen i
142f0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
14300 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  de)..  */.  if( 
14310 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
14320 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e   TF_Autoincremen
14330 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
14340 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
14350 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c 45 54  se,.      "DELET
14360 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65  E FROM %Q.sqlite
14370 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45 20  _sequence WHERE 
14380 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20  name=%Q",.      
14390 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 70  pDb->zDbSName, p
143a0 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  Tab->zName.    )
143b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
143c0 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49  /* Drop all SQLI
143d0 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
143e0 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  and index entrie
143f0 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
14400 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20  the.  ** table. 
14410 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65  The program name
14420 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74   loops through t
14430 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
14440 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a  and deletes.  **
14450 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20   every row that 
14460 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
14470 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
14480 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65  me as the one be
14490 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64  ing.  ** dropped
144a0 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68  . Triggers are h
144b0 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c  andled separatel
144c0 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67  y because a trig
144d0 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20  ger can be.  ** 
144e0 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74  created in the t
144f0 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61  emp database tha
14500 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
14510 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20  ble in another. 
14520 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
14530 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74  */.  sqlite3Nest
14540 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
14550 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46  .      "DELETE F
14560 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
14570 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20  tbl_name=%Q and 
14580 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22  type!='trigger'"
14590 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62  ,.      pDb->zDb
145a0 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  SName, MASTER_NA
145b0 4d 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  ME, pTab->zName)
145c0 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  ;.  if( !isView 
145d0 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
145e0 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73 74 72  ab) ){.    destr
145f0 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  oyTable(pParse, 
14600 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pTab);.  }..  /*
14610 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   Remove the tabl
14620 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c  e entry from SQL
14630 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73  ite's internal s
14640 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79  chema and modify
14650 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  .  ** the schema
14660 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20   cookie..  */.  
14670 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
14680 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
14690 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
146a0 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 62  OP_VDestroy, iDb
146b0 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  , 0, 0, pTab->zN
146c0 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  ame, 0);.  }.  s
146d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
146e0 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65  (v, OP_DropTable
146f0 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61  , iDb, 0, 0, pTa
14700 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
14710 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
14720 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
14730 3b 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65  ;.  sqliteViewRe
14740 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b  setAll(db, iDb);
14750 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
14760 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
14770 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20   to do the work 
14780 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20  of a DROP TABLE 
14790 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e  statement..** pN
147a0 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
147b0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
147c0 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76  be dropped..*/.v
147d0 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54  oid sqlite3DropT
147e0 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
147f0 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61  se, SrcList *pNa
14800 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20  me, int isView, 
14810 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61  int noErr){.  Ta
14820 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62  ble *pTab;.  Vdb
14830 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
14840 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
14850 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
14860 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
14870 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
14880 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14890 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
148a0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
148b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61  );.  assert( pNa
148c0 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
148d0 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64   if( sqlite3Read
148e0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
148f0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14900 74 61 62 6c 65 3b 0a 20 20 69 66 28 20 6e 6f 45  table;.  if( noE
14910 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73  rr ) db->suppres
14920 73 45 72 72 2b 2b 3b 0a 20 20 61 73 73 65 72 74  sErr++;.  assert
14930 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69  ( isView==0 || i
14940 73 56 69 65 77 3d 3d 4c 4f 43 41 54 45 5f 56 49  sView==LOCATE_VI
14950 45 57 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73  EW );.  pTab = s
14960 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
14970 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 69 73  eItem(pParse, is
14980 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b  View, &pName->a[
14990 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72  0]);.  if( noErr
149a0 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45   ) db->suppressE
149b0 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61  rr--;..  if( pTa
149c0 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  b==0 ){.    if( 
149d0 6e 6f 45 72 72 20 29 20 73 71 6c 69 74 65 33 43  noErr ) sqlite3C
149e0 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
149f0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61  hema(pParse, pNa
14a00 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
14a10 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  se);.    goto ex
14a20 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
14a30 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
14a40 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
14a50 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
14a60 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  a);.  assert( iD
14a70 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
14a80 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nDb );..  /* If 
14a90 70 54 61 62 20 69 73 20 61 20 76 69 72 74 75 61  pTab is a virtua
14aa0 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69  l table, call Vi
14ab0 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
14ac0 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a  () to ensure.  *
14ad0 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69  * it is initiali
14ae0 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  zed..  */.  if( 
14af0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
14b00 26 26 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  && sqlite3ViewGe
14b10 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
14b20 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20  rse, pTab) ){.  
14b30 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
14b40 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e  _table;.  }.#ifn
14b50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14b60 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
14b70 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
14b80 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
14b90 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
14ba0 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f  BLE(iDb);.    co
14bb0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
14bc0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
14bd0 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  SName;.    const
14be0 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30   char *zArg2 = 0
14bf0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
14c00 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
14c10 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
14c20 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29  , zTab, 0, zDb))
14c30 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
14c40 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
14c50 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
14c60 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
14c70 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
14c80 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
14c90 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
14ca0 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  DROP_TEMP_VIEW;.
14cb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14cc0 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
14cd0 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20  TE_DROP_VIEW;.  
14ce0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
14cf0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
14d00 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65  LTABLE.    }else
14d10 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
14d20 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  Tab) ){.      co
14d30 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
14d40 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a  _VTABLE;.      z
14d50 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65  Arg2 = sqlite3Ge
14d60 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
14d70 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a  )->pMod->zName;.
14d80 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
14d90 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
14da0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
14db0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
14dc0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
14dd0 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
14de0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14df0 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
14e00 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  DROP_TABLE;.    
14e10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
14e20 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
14e30 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
14e40 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41   pTab->zName, zA
14e50 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  rg2, zDb) ){.   
14e60 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14e70 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
14e80 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
14e90 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
14ea0 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70  SQLITE_DELETE, p
14eb0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  Tab->zName, 0, z
14ec0 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
14ed0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
14ee0 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  e;.    }.  }.#en
14ef0 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65  dif.  if( sqlite
14f00 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
14f10 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
14f20 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20  , 7)==0 .    && 
14f30 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
14f40 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
14f50 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29 21  lite_stat", 11)!
14f60 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
14f70 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14f80 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
14f90 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
14fa0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
14fb0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14fc0 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69  p_table;.  }..#i
14fd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14fe0 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75  T_VIEW.  /* Ensu
14ff0 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73  re DROP TABLE is
15000 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76   not used on a v
15010 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49  iew, and DROP VI
15020 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20  EW is not used. 
15030 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a   ** on a table..
15040 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65    */.  if( isVie
15050 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
15060 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
15070 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15080 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54  rse, "use DROP T
15090 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74  ABLE to delete t
150a0 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e  able %s", pTab->
150b0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
150c0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
150d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56  ;.  }.  if( !isV
150e0 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
150f0 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
15100 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15110 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49  se, "use DROP VI
15120 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65  EW to delete vie
15130 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  w %s", pTab->zNa
15140 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
15150 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
15160 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
15170 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
15180 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
15190 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
151a0 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
151b0 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
151c0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
151d0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
151e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
151f0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
15200 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
15210 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  b);.    sqlite3C
15220 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
15230 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62 6c  Parse, iDb, "tbl
15240 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
15250 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44 72  .    sqlite3FkDr
15260 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
15270 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20  pName, pTab);.  
15280 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f    sqlite3CodeDro
15290 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  pTable(pParse, p
152a0 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77  Tab, iDb, isView
152b0 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
152c0 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  p_table:.  sqlit
152d0 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
152e0 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
152f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15300 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
15310 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65  reate a new fore
15320 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74  ign key on the t
15330 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  able.** currentl
15340 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
15350 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20  tion.  pFromCol 
15360 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
15370 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
15380 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
15390 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f   point to the fo
153a0 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70  reign key.  If p
153b0 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a  FromCol==0 then.
153c0 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b  ** connect the k
153d0 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  ey to the last c
153e0 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20  olumn inserted. 
153f0 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65   pTo is the name
15400 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
15410 20 72 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e   referred to (a.
15420 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74 22  k.a the "parent"
15430 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c   table).  pToCol
15440 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66   is a list.** of
15450 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
15460 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e  arent pTo table.
15470 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
15480 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
15490 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
154a0 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
154b0 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
154c0 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
154d0 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
154e0 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
154f0 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
15500 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
15510 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
15520 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
15530 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
15540 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
15550 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
15560 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
15570 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  field..**.** The
15580 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
15590 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
155a0 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
155b0 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
155c0 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
155d0 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
155e0 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
155f0 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
15600 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
15610 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
15620 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
15630 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
15640 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
15650 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
15660 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
15670 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
15680 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
15690 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
156a0 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
156b0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
156c0 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
156d0 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
156e0 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
156f0 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
15700 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
15710 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
15720 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
15730 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
15740 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
15750 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
15760 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
15770 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
15780 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
15790 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e   = 0;.  FKey *pN
157a0 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a  extTo;.  Table *
157b0 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
157c0 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
157d0 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
157e0 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
157f0 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
15800 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
15810 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
15820 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b  E_VTAB ) goto fk
15830 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
15840 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
15850 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
15860 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  l-1;.    if( NEV
15870 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74  ER(iCol<0) ) got
15880 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
15890 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
158a0 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  ol->nExpr!=1 ){.
158b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
158c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
158d0 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73  oreign key on %s
158e0 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f  ".         " sho
158f0 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
15900 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
15910 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20   table %T",.    
15920 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f       p->aCol[iCo
15930 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a  l].zName, pTo);.
15940 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
15950 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
15960 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
15970 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
15980 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f  Col->nExpr!=pFro
15990 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  mCol->nExpr ){. 
159a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
159b0 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
159c0 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
159d0 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
159e0 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
159f0 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
15a00 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
15a10 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
15a20 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
15a30 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
15a40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
15a50 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
15a60 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  Expr;.  }.  nByt
15a70 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
15a80 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69  y) + (nCol-1)*si
15a90 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
15aa0 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
15ab0 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
15ac0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
15ad0 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b  i<pToCol->nExpr;
15ae0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
15af0 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
15b00 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
15b10 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
15b20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
15b30 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
15b40 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
15b50 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
15b60 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  =0 ){.    goto f
15b70 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b  k_end;.  }.  pFK
15b80 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
15b90 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
15ba0 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
15bb0 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
15bc0 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20  y->aCol[nCol];. 
15bd0 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
15be0 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
15bf0 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
15c00 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
15c10 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
15c20 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e  z);.  z += pTo->
15c30 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  n+1;.  pFKey->nC
15c40 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
15c50 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
15c60 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
15c70 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
15c80 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
15c90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
15ca0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
15cb0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
15cc0 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
15cd0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
15ce0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
15cf0 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
15d00 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
15d10 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
15d20 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
15d30 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
15d40 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
15d50 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
15d60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
15d70 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
15d80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
15d90 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
15da0 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
15db0 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
15dc0 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
15dd0 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
15de0 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
15df0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
15e00 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
15e10 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
15e20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
15e30 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
15e40 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
15e50 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
15e60 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
15e70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
15e80 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
15e90 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
15ea0 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
15eb0 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
15ec0 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
15ed0 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
15ee0 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
15ef0 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
15f00 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
15f10 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30  pFKey->aAction[0
15f20 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26  ] = (u8)(flags &
15f30 20 30 78 66 66 29 3b 20 20 20 20 20 20 20 20 20   0xff);         
15f40 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20     /* ON DELETE 
15f50 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65  action */.  pFKe
15f60 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20  y->aAction[1] = 
15f70 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38  (u8)((flags >> 8
15f80 20 29 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f   ) & 0xff);    /
15f90 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69  * ON UPDATE acti
15fa0 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  on */..  assert(
15fb0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
15fc0 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
15fd0 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
15fe0 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20  pNextTo = (FKey 
15ff0 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  *)sqlite3HashIns
16000 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d  ert(&p->pSchema-
16010 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20  >fkeyHash, .    
16020 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76    pFKey->zTo, (v
16030 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b  oid *)pFKey.  );
16040 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d  .  if( pNextTo==
16050 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  pFKey ){.    sql
16060 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
16070 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
16080 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65  d;.  }.  if( pNe
16090 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73 73 65  xtTo ){.    asse
160a0 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72  rt( pNextTo->pPr
160b0 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70  evTo==0 );.    p
160c0 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  FKey->pNextTo = 
160d0 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65  pNextTo;.    pNe
160e0 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20  xtTo->pPrevTo = 
160f0 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pFKey;.  }..  /*
16100 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67   Link the foreig
16110 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62  n key to the tab
16120 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73  le as the last s
16130 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  tep..  */.  p->p
16140 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20  FKey = pFKey;.  
16150 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65  pFKey = 0;..fk_e
16160 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  nd:.  sqlite3DbF
16170 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a  ree(db, pFKey);.
16180 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
16190 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
161a0 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20  OREIGN_KEY) */. 
161b0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
161c0 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d  Delete(db, pFrom
161d0 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Col);.  sqlite3E
161e0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
161f0 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a  , pToCol);.}../*
16200 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16210 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
16220 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  an INITIALLY IMM
16230 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41  EDIATE or INITIA
16240 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20  LLY DEFERRED.** 
16250 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61  clause is seen a
16260 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65  s part of a fore
16270 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
16280 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72  on.  The isDefer
16290 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  red.** parameter
162a0 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41   is 1 for INITIA
162b0 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64  LLY DEFERRED and
162c0 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   0 for INITIALLY
162d0 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54   IMMEDIATE..** T
162e0 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
162f0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
16300 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e   created foreign
16310 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64   key is adjusted
16320 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  .** accordingly.
16330 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
16340 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
16350 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
16360 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a  nt isDeferred){.
16370 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16380 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
16390 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
163a0 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
163b0 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72  if( (pTab = pPar
163c0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
163d0 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54  0 || (pFKey = pT
163e0 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20  ab->pFKey)==0 ) 
163f0 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
16400 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20  ( isDeferred==0 
16410 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31  || isDeferred==1
16420 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33   ); /* EV: R-303
16430 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70 46  23-21917 */.  pF
16440 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
16450 3d 20 28 75 38 29 69 73 44 65 66 65 72 72 65 64  = (u8)isDeferred
16460 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
16470 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
16480 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20  that will erase 
16490 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78  and refill index
164a0 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73   *pIdx.  This is
164b0 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74  .** used to init
164c0 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63  ialize a newly c
164d0 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20  reated index or 
164e0 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65  to recompute the
164f0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  .** content of a
16500 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f  n index in respo
16510 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58  nse to a REINDEX
16520 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
16530 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  if memRootPage i
16540 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20  s not negative, 
16550 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
16560 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79  e index is newly
16570 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68  .** created.  Th
16580 65 20 72 65 67 69 73 74 65 72 20 73 70 65 63 69  e register speci
16590 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50  fied by memRootP
165a0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  age contains the
165b0 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  .** root page nu
165c0 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
165d0 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61  x.  If memRootPa
165e0 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
165f0 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65  then.** the inde
16600 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
16610 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65   and must be cle
16620 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ared before bein
16630 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a  g refilled and.*
16640 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * the root page 
16650 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
16660 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  dex is taken fro
16670 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a  m pIndex->tnum..
16680 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
16690 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
166a0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
166b0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
166c0 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29  int memRootPage)
166d0 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
166e0 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
166f0 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  ;  /* The table 
16700 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20  that is indexed 
16710 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
16720 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
16730 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
16740 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61  sor used for pTa
16750 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20  b */.  int iIdx 
16760 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
16770 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
16780 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
16790 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  Index */.  int i
167a0 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20 20 20  Sorter;         
167b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
167c0 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 4f 70  sor opened by Op
167d0 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69 6e 20  enSorter (if in 
167e0 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64  use) */.  int ad
167f0 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
16800 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
16810 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f  ess of top of lo
16820 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
16830 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
16840 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
16850 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72  s to jump to for
16860 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
16870 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20  */.  int tnum;  
16880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16890 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
168a0 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   of index */.  i
168b0 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c  nt iPartIdxLabel
168c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
168d0 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61   Jump to this la
168e0 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20 72 6f  bel to skip a ro
168f0 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  w */.  Vdbe *v; 
16900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16910 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
16920 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
16930 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
16940 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
16950 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
16960 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20       /* KeyInfo 
16970 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  for index */.  i
16980 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20  nt regRecord;   
16990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
169a0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
169b0 67 20 61 73 73 65 6d 62 6c 65 64 20 69 6e 64 65  g assembled inde
169c0 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
169d0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
169e0 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20  se->db;      /* 
169f0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
16a00 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
16a10 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
16a20 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
16a30 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
16a40 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
16a50 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
16a60 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74  TION.  if( sqlit
16a70 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
16a80 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44  se, SQLITE_REIND
16a90 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  EX, pIndex->zNam
16aa0 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e  e, 0,.      db->
16ab0 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
16ac0 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e ) ){.    retur
16ad0 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
16ae0 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77 72   /* Require a wr
16af0 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
16b00 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d  table to perform
16b10 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
16b20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  */.  sqlite3Tabl
16b30 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
16b40 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31  b, pTab->tnum, 1
16b50 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
16b60 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
16b70 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
16b80 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
16b90 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f  rn;.  if( memRoo
16ba0 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  tPage>=0 ){.    
16bb0 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61  tnum = memRootPa
16bc0 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
16bd0 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e   tnum = pIndex->
16be0 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79  tnum;.  }.  pKey
16bf0 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
16c00 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c  oOfIndex(pParse,
16c10 20 70 49 6e 64 65 78 29 3b 0a 20 20 61 73 73 65   pIndex);.  asse
16c20 72 74 28 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64  rt( pKey!=0 || d
16c30 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
16c40 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
16c50 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  );..  /* Open th
16c60 65 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72 20  e sorter cursor 
16c70 69 66 20 77 65 20 61 72 65 20 74 6f 20 75 73 65  if we are to use
16c80 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53 6f 72 74   one. */.  iSort
16c90 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  er = pParse->nTa
16ca0 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  b++;.  sqlite3Vd
16cb0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
16cc0 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53 6f 72 74  orterOpen, iSort
16cd0 65 72 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e  er, 0, pIndex->n
16ce0 4b 65 79 43 6f 6c 2c 20 28 63 68 61 72 2a 29 0a  KeyCol, (char*).
16cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d00 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
16d10 66 6f 52 65 66 28 70 4b 65 79 29 2c 20 50 34 5f  foRef(pKey), P4_
16d20 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20  KEYINFO);..  /* 
16d30 4f 70 65 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  Open the table. 
16d40 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
16d50 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62   rows of the tab
16d60 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67 20 69 6e  le, inserting in
16d70 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73  dex.  ** records
16d80 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72   into the sorter
16d90 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70  . */.  sqlite3Op
16da0 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
16db0 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c  iTab, iDb, pTab,
16dc0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
16dd0 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
16de0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16df0 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30  _Rewind, iTab, 0
16e00 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16e10 76 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20  v);.  regRecord 
16e20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
16e30 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  Reg(pParse);..  
16e40 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
16e50 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 70  ndexKey(pParse,p
16e60 49 6e 64 65 78 2c 69 54 61 62 2c 72 65 67 52 65  Index,iTab,regRe
16e70 63 6f 72 64 2c 30 2c 26 69 50 61 72 74 49 64 78  cord,0,&iPartIdx
16e80 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a 20 20 73 71  Label,0,0);.  sq
16e90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16ea0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  v, OP_SorterInse
16eb0 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67  rt, iSorter, reg
16ec0 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
16ed0 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78  e3ResolvePartIdx
16ee0 4c 61 62 65 6c 28 70 50 61 72 73 65 2c 20 69 50  Label(pParse, iP
16ef0 61 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20  artIdxLabel);.  
16f00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16f10 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  2(v, OP_Next, iT
16f20 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64  ab, addr1+1); Vd
16f30 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16f40 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
16f50 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
16f60 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
16f70 65 3c 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  e<0 ) sqlite3Vdb
16f80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
16f90 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b  ear, tnum, iDb);
16fa0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16fb0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp4(v, OP_OpenW
16fc0 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d  rite, iIdx, tnum
16fd0 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20  , iDb, .        
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
16ff0 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59  r *)pKey, P4_KEY
17000 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
17010 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
17020 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28  OPFLAG_BULKCSR|(
17030 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29  (memRootPage>=0)
17040 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 3a  ?OPFLAG_P2ISREG:
17050 30 29 29 3b 0a 0a 20 20 61 64 64 72 31 20 3d 20  0));..  addr1 = 
17060 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17070 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f  2(v, OP_SorterSo
17080 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 30 29 3b  rt, iSorter, 0);
17090 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
170a0 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75 65  ;.  if( IsUnique
170b0 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29 7b  Index(pIndex) ){
170c0 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d 20 73 71  .    int j2 = sq
170d0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
170e0 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20 20 20  Addr(v) + 3;.   
170f0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
17100 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20 61 64 64  (v, j2);.    add
17110 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
17120 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
17130 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17140 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53  ddOp4Int(v, OP_S
17150 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20 69 53  orterCompare, iS
17160 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67 52 65  orter, j2, regRe
17170 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  cord,.          
17180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17190 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b  Index->nKeyCol);
171a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
171b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69  ;.    sqlite3Uni
171c0 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  queConstraint(pP
171d0 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20  arse, OE_Abort, 
171e0 70 49 6e 64 65 78 29 3b 0a 20 20 7d 65 6c 73 65  pIndex);.  }else
171f0 7b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  {.    addr2 = sq
17200 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
17210 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73  Addr(v);.  }.  s
17220 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
17230 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
17240 61 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52  a, iSorter, regR
17250 65 63 6f 72 64 2c 20 69 49 64 78 29 3b 0a 20 20  ecord, iIdx);.  
17260 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17270 31 28 76 2c 20 4f 50 5f 53 65 65 6b 45 6e 64 2c  1(v, OP_SeekEnd,
17280 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65   iIdx);.  sqlite
17290 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
172a0 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64  P_IdxInsert, iId
172b0 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  x, regRecord);. 
172c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
172d0 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55  geP5(v, OPFLAG_U
172e0 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20  SESEEKRESULT);. 
172f0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
17300 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
17310 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
17320 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17330 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
17340 20 69 53 6f 72 74 65 72 2c 20 61 64 64 72 32 29   iSorter, addr2)
17350 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
17360 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
17370 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
17380 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64  1);..  sqlite3Vd
17390 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
173a0 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73  lose, iTab);.  s
173b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
173c0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
173d0 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dx);.  sqlite3Vd
173e0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
173f0 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a  lose, iSorter);.
17400 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
17410 65 20 68 65 61 70 20 73 70 61 63 65 20 74 6f 20  e heap space to 
17420 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f 62  hold an Index ob
17430 6a 65 63 74 20 77 69 74 68 20 6e 43 6f 6c 20 63  ject with nCol c
17440 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e  olumns..**.** In
17450 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 63  crease the alloc
17460 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72  ation size to pr
17470 6f 76 69 64 65 20 61 6e 20 65 78 74 72 61 20 6e  ovide an extra n
17480 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f  Extra bytes.** o
17490 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  f 8-byte aligned
174a0 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65   space after the
174b0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 61 6e   Index object an
174c0 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f  d return a.** po
174d0 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 65 78  inter to this ex
174e0 74 72 61 20 73 70 61 63 65 20 69 6e 20 2a 70 70  tra space in *pp
174f0 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20  Extra..*/.Index 
17500 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65  *sqlite3Allocate
17510 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20 20 73  IndexObject(.  s
17520 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
17530 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
17540 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
17550 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20  i16 nCol,       
17560 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
17570 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
17580 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  in the index */.
17590 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
175a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
175b0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 65 78 74   of bytes of ext
175c0 72 61 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  ra space to allo
175d0 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70  c */.  char **pp
175e0 45 78 74 72 61 20 20 20 20 20 20 20 2f 2a 20 50  Extra       /* P
175f0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 65  ointer to the "e
17600 78 74 72 61 22 20 73 70 61 63 65 20 2a 2f 0a 29  xtra" space */.)
17610 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20 20 20  {.  Index *p;   
17620 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
17630 63 61 74 65 64 20 69 6e 64 65 78 20 6f 62 6a 65  cated index obje
17640 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ct */.  int nByt
17650 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
17660 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  Bytes of space f
17670 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  or Index object 
17680 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e  + arrays */..  n
17690 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69  Byte = ROUND8(si
176a0 7a 65 6f 66 28 49 6e 64 65 78 29 29 20 2b 20 20  zeof(Index)) +  
176b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
176c0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 20  ndex structure  
176d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55  */.          ROU
176e0 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  ND8(sizeof(char*
176f0 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20 20  )*nCol) +       
17700 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c    /* Index.azCol
17710 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  l     */.       
17720 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
17730 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31  (LogEst)*(nCol+1
17740 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  ) +     /* Index
17750 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a  .aiRowLogEst   *
17760 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
17770 20 20 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e     sizeof(i16)*n
17780 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20  Col +           
17790 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75   /* Index.aiColu
177a0 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  mn   */.        
177b0 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
177c0 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20  u8)*nCol);      
177d0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
177e0 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20  aSortOrder */.  
177f0 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
17800 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
17810 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  e + nExtra);.  i
17820 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68 61 72  f( p ){.    char
17830 20 2a 70 45 78 74 72 61 20 3d 20 28 28 63 68 61   *pExtra = ((cha
17840 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a  r*)p)+ROUND8(siz
17850 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20  eof(Index));.   
17860 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f   p->azColl = (co
17870 6e 73 74 20 63 68 61 72 2a 2a 29 70 45 78 74 72  nst char**)pExtr
17880 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 52 4f 55  a; pExtra += ROU
17890 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  ND8(sizeof(char*
178a0 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e  )*nCol);.    p->
178b0 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c  aiRowLogEst = (L
178c0 6f 67 45 73 74 2a 29 70 45 78 74 72 61 3b 20 70  ogEst*)pExtra; p
178d0 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
178e0 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29  LogEst)*(nCol+1)
178f0 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d  ;.    p->aiColum
17900 6e 20 3d 20 28 69 31 36 2a 29 70 45 78 74 72 61  n = (i16*)pExtra
17910 3b 20 20 20 20 20 20 20 70 45 78 74 72 61 20 2b  ;       pExtra +
17920 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43  = sizeof(i16)*nC
17930 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74  ol;.    p->aSort
17940 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 70 45 78  Order = (u8*)pEx
17950 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c  tra;.    p->nCol
17960 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20  umn = nCol;.    
17970 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f  p->nKeyCol = nCo
17980 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70 70 45 78  l - 1;.    *ppEx
17990 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29  tra = ((char*)p)
179a0 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20   + nByte;.  }.  
179b0 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
179c0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
179d0 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c  index for an SQL
179e0 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e   table.  pName1.
179f0 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61  pName2 is the na
17a00 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
17a10 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74  .** and pTblList
17a20 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
17a30 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
17a40 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
17a50 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20    Both will .** 
17a60 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72  be NULL for a pr
17a70 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20  imary key or an 
17a80 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72  index that is cr
17a90 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79  eated to satisfy
17aa0 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e   a.** UNIQUE con
17ab0 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61  straint.  If pTa
17ac0 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61  ble and pIndex a
17ad0 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61  re NULL, use pPa
17ae0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a  rse->pNewTable.*
17af0 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74  * as the table t
17b00 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
17b10 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
17b20 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74   is a table that
17b30 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79   is.** currently
17b40 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
17b50 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54  ed by a CREATE T
17b60 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
17b70 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61  **.** pList is a
17b80 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
17b90 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
17ba0 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e   pList will be N
17bb0 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ULL if this.** i
17bc0 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  s a primary key 
17bd0 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72  or unique-constr
17be0 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74  aint on the most
17bf0 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61   recent column a
17c00 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74  dded.** to the t
17c10 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
17c20 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
17c30 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  n.  .*/.void sql
17c40 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
17c50 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
17c60 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66  ,     /* All inf
17c70 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
17c80 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54  his parse */.  T
17c90 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
17ca0 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20    /* First part 
17cb0 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
17cc0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
17cd0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
17ce0 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
17cf0 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e  t of index name.
17d00 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
17d10 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e    SrcList *pTblN
17d20 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f  ame, /* Table to
17d30 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72   index. Use pPar
17d40 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66  se->pNewTable if
17d50 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74   0 */.  ExprList
17d60 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20   *pList,   /* A 
17d70 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
17d80 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
17d90 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
17da0 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72        /* OE_Abor
17db0 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45  t, OE_Ignore, OE
17dc0 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f  _Replace, or OE_
17dd0 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  None */.  Token 
17de0 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20  *pStart,     /* 
17df0 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
17e00 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 69   that begins thi
17e10 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  s statement */. 
17e20 20 45 78 70 72 20 2a 70 50 49 57 68 65 72 65 2c   Expr *pPIWhere,
17e30 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61      /* WHERE cla
17e40 75 73 65 20 66 6f 72 20 70 61 72 74 69 61 6c 20  use for partial 
17e50 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74  indices */.  int
17e60 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20   sortOrder,     
17e70 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66  /* Sort order of
17e80 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65   primary key whe
17e90 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f  n pList==NULL */
17ea0 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73  .  int ifNotExis
17eb0 74 2c 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72  t,    /* Omit er
17ec0 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72  ror if index alr
17ed0 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20  eady exists */. 
17ee0 20 75 38 20 69 64 78 54 79 70 65 20 20 20 20 20   u8 idxType     
17ef0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
17f00 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 54 61   type */.){.  Ta
17f10 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
17f20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
17f30 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49  e indexed */.  I
17f40 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30  ndex *pIndex = 0
17f50 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ;   /* The index
17f60 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a   to be created *
17f70 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  /.  char *zName 
17f80 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  = 0;     /* Name
17f90 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   of the index */
17fa0 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
17fb0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17fc0 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
17fd0 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e  in zName */.  in
17fe0 74 20 69 2c 20 6a 3b 0a 20 20 44 62 46 69 78 65  t i, j;.  DbFixe
17ff0 72 20 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f  r sFix;        /
18000 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20  * For assigning 
18010 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74  database names t
18020 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  o pTable */.  in
18030 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b  t sortOrderMask;
18040 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72     /* 1 to honor
18050 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20   DESC in index. 
18060 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f   0 to ignore. */
18070 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
18080 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44   pParse->db;.  D
18090 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20  b *pDb;         
180a0 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69      /* The speci
180b0 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  fic table contai
180c0 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64  ning the indexed
180d0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
180e0 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
180f0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
18100 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
18110 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  t is being writt
18120 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
18130 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Name = 0;    /* 
18140 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
18150 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f   of the index to
18160 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72   create */.  str
18170 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
18180 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a  m *pListItem; /*
18190 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
181a0 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  r pList */.  int
181b0 20 6e 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20   nExtra = 0;    
181c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
181d0 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   Space allocated
181e0 20 66 6f 72 20 7a 45 78 74 72 61 5b 5d 20 2a 2f   for zExtra[] */
181f0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 43 6f 6c  .  int nExtraCol
18200 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18210 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18220 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e   extra columns n
18230 65 65 64 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  eeded */.  char 
18240 2a 7a 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20  *zExtra = 0;    
18250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
18260 78 74 72 61 20 73 70 61 63 65 20 61 66 74 65 72  xtra space after
18270 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
18280 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  t */.  Index *pP
18290 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50  k = 0;      /* P
182a0 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
182b0 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
182c0 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a 0a 20 20  ID tables */..  
182d0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
182e0 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
182f0 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 67 6f  nErr>0 ){.    go
18300 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18310 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
18320 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
18330 26 26 20 69 64 78 54 79 70 65 21 3d 53 51 4c 49  && idxType!=SQLI
18340 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41  TE_IDXTYPE_PRIMA
18350 52 59 4b 45 59 20 29 7b 0a 20 20 20 20 67 6f 74  RYKEY ){.    got
18360 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18370 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53  dex;.  }.  if( S
18380 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
18390 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
183a0 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  se) ){.    goto 
183b0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
183c0 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  x;.  }..  /*.  *
183d0 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65  * Find the table
183e0 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
183f0 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20  ndexed.  Return 
18400 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75  early if not fou
18410 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  nd..  */.  if( p
18420 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20  TblName!=0 ){.. 
18430 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77     /* Use the tw
18440 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d  o-part index nam
18450 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
18460 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
18470 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f   ** to search fo
18480 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69  r the table. 'Fi
18490 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  x' the table nam
184a0 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20  e to this db.   
184b0 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69   ** before looki
184c0 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e  ng up the table.
184d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
184e0 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e  rt( pName1 && pN
184f0 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20  ame2 );.    iDb 
18500 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
18510 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
18520 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
18530 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44  ame);.    if( iD
18540 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  b<0 ) goto exit_
18550 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18560 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 20    assert( pName 
18570 26 26 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a  && pName->z );..
18580 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18590 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f  MIT_TEMPDB.    /
185a0 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e  * If the index n
185b0 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66  ame was unqualif
185c0 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68  ied, check if th
185d0 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  e table.    ** i
185e0 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20  s a temp table. 
185f0 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64  If so, set the d
18600 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20 44 6f  atabase to 1. Do
18610 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20 20 20   not do this.   
18620 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c 69 73   ** if initialis
18630 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 73  ing a database s
18640 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20  chema..    */.  
18650 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
18660 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 70 54  busy ){.      pT
18670 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  ab = sqlite3SrcL
18680 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  istLookup(pParse
18690 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20  , pTblName);.   
186a0 20 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e     if( pName2->n
186b0 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20 70  ==0 && pTab && p
186c0 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62  Tab->pSchema==db
186d0 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
186e0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44 62 20   ){.        iDb 
186f0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
18700 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73   }.#endif..    s
18710 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
18720 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
18730 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65  , "index", pName
18740 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
18750 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46  e3FixSrcList(&sF
18760 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 20 29 7b  ix, pTblName) ){
18770 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73  .      /* Becaus
18780 65 20 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e  e the parser con
18790 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d 65  structs pTblName
187a0 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69   from a single i
187b0 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20 20  dentifier,.     
187c0 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72   ** sqlite3FixSr
187d0 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72 20  cList can never 
187e0 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61  fail. */.      a
187f0 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a  ssert(0);.    }.
18800 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
18810 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
18820 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 26 70 54  m(pParse, 0, &pT
18830 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20  blName->a[0]);. 
18840 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
18850 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c  allocFailed==0 |
18860 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  | pTab==0 );.   
18870 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
18880 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18890 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 69  index;.    if( i
188a0 44 62 3d 3d 31 20 26 26 20 64 62 2d 3e 61 44 62  Db==1 && db->aDb
188b0 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 21 3d 70  [iDb].pSchema!=p
188c0 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  Tab->pSchema ){.
188d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
188e0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
188f0 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f            "canno
18900 74 20 63 72 65 61 74 65 20 61 20 54 45 4d 50 20  t create a TEMP 
18910 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d  index on non-TEM
18920 50 20 74 61 62 6c 65 20 5c 22 25 73 5c 22 22 2c  P table \"%s\"",
18930 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
18940 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
18950 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18960 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
18970 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
18980 70 54 61 62 29 20 29 20 70 50 6b 20 3d 20 73 71  pTab) ) pPk = sq
18990 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
189a0 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 65  ndex(pTab);.  }e
189b0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
189c0 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20   pName==0 );.   
189d0 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74 3d   assert( pStart=
189e0 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
189f0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
18a00 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61  le;.    if( !pTa
18a10 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  b ) goto exit_cr
18a20 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
18a30 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
18a40 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
18a50 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
18a60 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e   }.  pDb = &db->
18a70 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73  aDb[iDb];..  ass
18a80 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
18a90 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
18aa0 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69  ->nErr==0 );.  i
18ab0 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
18ac0 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
18ad0 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
18ae0 20 0a 20 20 20 20 20 20 20 26 26 20 64 62 2d 3e   .       && db->
18af0 69 6e 69 74 2e 62 75 73 79 3d 3d 30 0a 23 69 66  init.busy==0.#if
18b00 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
18b10 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20  HENTICATION.    
18b20 20 20 20 26 26 20 73 71 6c 69 74 65 33 55 73 65     && sqlite3Use
18b30 72 41 75 74 68 54 61 62 6c 65 28 70 54 61 62 2d  rAuthTable(pTab-
18b40 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65 6e 64 69  >zName)==0.#endi
18b50 66 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  f.       && sqli
18b60 74 65 33 53 74 72 4e 49 43 6d 70 28 26 70 54 61  te3StrNICmp(&pTa
18b70 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74  b->zName[7],"alt
18b80 65 72 74 61 62 5f 22 2c 39 29 21 3d 30 20 29 7b  ertab_",9)!=0 ){
18b90 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
18ba0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
18bb0 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62  ble %s may not b
18bc0 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62  e indexed", pTab
18bd0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
18be0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18bf0 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  ndex;.  }.#ifnde
18c00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
18c10 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70  EW.  if( pTab->p
18c20 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
18c30 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18c40 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79  arse, "views may
18c50 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
18c60 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
18c70 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18c80 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   }.#endif.#ifnde
18c90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
18ca0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
18cb0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
18cc0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
18cd0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
18ce0 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20  "virtual tables 
18cf0 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
18d00 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ed");.    goto e
18d10 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18d20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
18d30 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
18d40 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
18d50 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  ex.  Make sure t
18d60 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  here is not alre
18d70 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a  ady another.  **
18d80 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
18d90 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
18da0 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  me.  .  **.  ** 
18db0 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77  Exception:  If w
18dc0 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
18dd0 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61  e names of perma
18de0 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f  nent indices fro
18df0 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  m the.  ** sqlit
18e00 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28  e_master table (
18e10 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68  because some oth
18e20 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67  er process chang
18e30 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61  ed the schema) a
18e40 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74  nd.  ** one of t
18e50 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63  he index names c
18e60 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65  ollides with the
18e70 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f   name of a tempo
18e80 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20  rary table or.  
18e90 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77  ** index, then w
18ea0 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
18eb0 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20  to process this 
18ec0 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
18ed0 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20   If pName==0 it 
18ee0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72  means that we ar
18ef0 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77  e.  ** dealing w
18f00 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65  ith a primary ke
18f10 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  y or UNIQUE cons
18f20 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65  traint.  We have
18f30 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20   to invent our. 
18f40 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20   ** own name..  
18f50 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29  */.  if( pName )
18f60 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
18f70 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
18f80 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
18f90 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
18fa0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
18fb0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
18fc0 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d  sert( pName->z!=
18fd0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  0 );.    if( SQL
18fe0 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43  ITE_OK!=sqlite3C
18ff0 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70  heckObjectName(p
19000 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  Parse, zName) ){
19010 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
19020 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19030 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62     }.    if( !db
19040 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
19050 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
19060 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
19070 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20  ame, 0)!=0 ){.  
19080 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
19090 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
190a0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
190b0 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73  a table named %s
190c0 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
190d0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
190e0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
190f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
19100 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
19110 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62  x(db, zName, pDb
19120 2d 3e 7a 44 62 53 4e 61 6d 65 29 21 3d 30 20 29  ->zDbSName)!=0 )
19130 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 66 4e  {.      if( !ifN
19140 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20  otExist ){.     
19150 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
19160 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
19170 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69  x %s already exi
19180 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  sts", zName);.  
19190 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
191a0 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
191b0 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20  init.busy );.   
191c0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
191d0 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
191e0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
191f0 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78   }.      goto ex
19200 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19210 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
19220 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49      int n;.    I
19230 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20  ndex *pLoop;.   
19240 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d   for(pLoop=pTab-
19250 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c  >pIndex, n=1; pL
19260 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
19270 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a  ->pNext, n++){}.
19280 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
19290 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
192a0 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78  sqlite_autoindex
192b0 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a  _%s_%d", pTab->z
192c0 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66  Name, n);.    if
192d0 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
192e0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
192f0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
19300 7d 0a 0a 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61  }..    /* Automa
19310 74 69 63 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  tic index names 
19320 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 77  generated from w
19330 69 74 68 69 6e 20 73 71 6c 69 74 65 33 5f 64 65  ithin sqlite3_de
19340 63 6c 61 72 65 5f 76 74 61 62 28 29 0a 20 20 20  clare_vtab().   
19350 20 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 6e 61   ** must have na
19360 6d 65 73 20 74 68 61 74 20 61 72 65 20 64 69 73  mes that are dis
19370 74 69 6e 63 74 20 66 72 6f 6d 20 6e 6f 72 6d 61  tinct from norma
19380 6c 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  l automatic inde
19390 78 20 6e 61 6d 65 73 2e 0a 20 20 20 20 2a 2a 20  x names..    ** 
193a0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  The following st
193b0 61 74 65 6d 65 6e 74 20 63 6f 6e 76 65 72 74 73  atement converts
193c0 20 22 73 71 6c 69 74 65 33 5f 61 75 74 6f 69 6e   "sqlite3_autoin
193d0 64 65 78 2e 2e 2e 22 20 69 6e 74 6f 0a 20 20 20  dex..." into.   
193e0 20 2a 2a 20 22 73 71 6c 69 74 65 33 5f 62 75 74   ** "sqlite3_but
193f0 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e 20 6f 72  oindex..." in or
19400 64 65 72 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  der to make the 
19410 6e 61 6d 65 73 20 64 69 73 74 69 6e 63 74 2e 0a  names distinct..
19420 20 20 20 20 2a 2a 20 54 68 65 20 22 76 74 61 62      ** The "vtab
19430 5f 65 72 72 2e 74 65 73 74 22 20 74 65 73 74 20  _err.test" test 
19440 64 65 6d 6f 6e 73 74 72 61 74 65 73 20 74 68 65  demonstrates the
19450 20 6e 65 65 64 20 6f 66 20 74 68 69 73 20 73 74   need of this st
19460 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20  atement. */.    
19470 69 66 28 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56  if( IN_DECLARE_V
19480 54 41 42 20 29 20 7a 4e 61 6d 65 5b 37 5d 2b 2b  TAB ) zName[7]++
19490 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
194a0 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74  k for authorizat
194b0 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e  ion to create an
194c0 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66   index..  */.#if
194d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
194e0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
194f0 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
19500 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 44  r *zDb = pDb->zD
19510 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  bSName;.    if( 
19520 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
19530 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
19540 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
19550 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44  ABLE(iDb), 0, zD
19560 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
19570 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19580 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  ex;.    }.    i 
19590 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
195a0 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21  INDEX;.    if( !
195b0 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
195c0 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49  Db==1 ) i = SQLI
195d0 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
195e0 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
195f0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
19600 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c  Parse, i, zName,
19610 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
19620 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
19630 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19640 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
19650 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c  ndif..  /* If pL
19660 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73  ist==0, it means
19670 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
19680 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65  s called to make
19690 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20   a primary.  ** 
196a0 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  key out of the l
196b0 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
196c0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e   to the table un
196d0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
196e0 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65  ..  ** So create
196f0 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20   a fake list to 
19700 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20  simulate this.. 
19710 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
19720 3d 30 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20  =0 ){.    Token 
19730 70 72 65 76 43 6f 6c 3b 0a 20 20 20 20 43 6f 6c  prevCol;.    Col
19740 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 26 70 54 61  umn *pCol = &pTa
19750 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
19760 6f 6c 2d 31 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d  ol-1];.    pCol-
19770 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  >colFlags |= COL
19780 46 4c 41 47 5f 55 4e 49 51 55 45 3b 0a 20 20 20  FLAG_UNIQUE;.   
19790 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69   sqlite3TokenIni
197a0 74 28 26 70 72 65 76 43 6f 6c 2c 20 70 43 6f 6c  t(&prevCol, pCol
197b0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c  ->zName);.    pL
197c0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
197d0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
197e0 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  se, 0,.         
197f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
19800 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c  Alloc(db, TK_ID,
19810 20 26 70 72 65 76 43 6f 6c 2c 20 30 29 29 3b 0a   &prevCol, 0));.
19820 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
19830 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
19840 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61  ate_index;.    a
19850 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
19860 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71  xpr==1 );.    sq
19870 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
19880 53 6f 72 74 4f 72 64 65 72 28 70 4c 69 73 74 2c  SortOrder(pList,
19890 20 73 6f 72 74 4f 72 64 65 72 29 3b 0a 20 20 7d   sortOrder);.  }
198a0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
198b0 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65  3ExprListCheckLe
198c0 6e 67 74 68 28 70 50 61 72 73 65 2c 20 70 4c 69  ngth(pParse, pLi
198d0 73 74 2c 20 22 69 6e 64 65 78 22 29 3b 0a 20 20  st, "index");.  
198e0 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
198f0 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65  ut how many byte
19900 73 20 6f 66 20 73 70 61 63 65 20 61 72 65 20 72  s of space are r
19910 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65  equired to store
19920 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a   explicitly.  **
19930 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61   specified colla
19940 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
19950 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  mes..  */.  for(
19960 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
19970 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
19980 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69  xpr *pExpr = pLi
19990 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
199a0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
199b0 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  r!=0 );.    if( 
199c0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
199d0 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 6e  LLATE ){.      n
199e0 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20 73 71  Extra += (1 + sq
199f0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45  lite3Strlen30(pE
19a00 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29 3b  xpr->u.zToken));
19a10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
19a20 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20   .  ** Allocate 
19a30 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
19a40 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61  ure. .  */.  nNa
19a50 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
19a60 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e  en30(zName);.  n
19a70 45 78 74 72 61 43 6f 6c 20 3d 20 70 50 6b 20 3f  ExtraCol = pPk ?
19a80 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20   pPk->nKeyCol : 
19a90 31 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  1;.  pIndex = sq
19aa0 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64  lite3AllocateInd
19ab0 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 4c 69  exObject(db, pLi
19ac0 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e 45 78 74  st->nExpr + nExt
19ad0 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20  raCol,.         
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19af0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4e 61               nNa
19b00 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b 20 31 2c  me + nExtra + 1,
19b10 20 26 7a 45 78 74 72 61 29 3b 0a 20 20 69 66 28   &zExtra);.  if(
19b20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
19b30 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
19b40 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19b50 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45  .  }.  assert( E
19b60 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
19b70 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 69 52 6f  ENT(pIndex->aiRo
19b80 77 4c 6f 67 45 73 74 29 20 29 3b 0a 20 20 61 73  wLogEst) );.  as
19b90 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
19ba0 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65  _ALIGNMENT(pInde
19bb0 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20  x->azColl) );.  
19bc0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20  pIndex->zName = 
19bd0 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61  zExtra;.  zExtra
19be0 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20   += nName + 1;. 
19bf0 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e   memcpy(pIndex->
19c00 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  zName, zName, nN
19c10 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78  ame+1);.  pIndex
19c20 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b  ->pTable = pTab;
19c30 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  .  pIndex->onErr
19c40 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72  or = (u8)onError
19c50 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71  ;.  pIndex->uniq
19c60 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f  NotNull = onErro
19c70 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70 49  r!=OE_None;.  pI
19c80 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 20 3d 20  ndex->idxType = 
19c90 69 64 78 54 79 70 65 3b 0a 20 20 70 49 6e 64 65  idxType;.  pInde
19ca0 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  x->pSchema = db-
19cb0 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
19cc0 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65  a;.  pIndex->nKe
19cd0 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  yCol = pList->nE
19ce0 78 70 72 3b 0a 20 20 69 66 28 20 70 50 49 57 68  xpr;.  if( pPIWh
19cf0 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ere ){.    sqlit
19d00 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66  e3ResolveSelfRef
19d10 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70  erence(pParse, p
19d20 54 61 62 2c 20 4e 43 5f 50 61 72 74 49 64 78 2c  Tab, NC_PartIdx,
19d30 20 70 50 49 57 68 65 72 65 2c 20 30 29 3b 0a 20   pPIWhere, 0);. 
19d40 20 20 20 70 49 6e 64 65 78 2d 3e 70 50 61 72 74     pIndex->pPart
19d50 49 64 78 57 68 65 72 65 20 3d 20 70 50 49 57 68  IdxWhere = pPIWh
19d60 65 72 65 3b 0a 20 20 20 20 70 50 49 57 68 65 72  ere;.    pPIWher
19d70 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  e = 0;.  }.  ass
19d80 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
19d90 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
19da0 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a  iDb, 0) );..  /*
19db0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
19dc0 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72   we should honor
19dd0 20 44 45 53 43 20 72 65 71 75 65 73 74 73 20 6f   DESC requests o
19de0 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a  n index columns.
19df0 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e    */.  if( pDb->
19e00 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f  pSchema->file_fo
19e10 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73  rmat>=4 ){.    s
19e20 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d  ortOrderMask = -
19e30 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45  1;   /* Honor DE
19e40 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  SC */.  }else{. 
19e50 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b     sortOrderMask
19e60 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f   = 0;    /* Igno
19e70 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a  re DESC */.  }..
19e80 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65    /* Analyze the
19e90 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
19ea0 69 6f 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74  ions that form t
19eb0 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
19ec0 69 6e 64 65 78 20 61 6e 64 0a 20 20 2a 2a 20 72  index and.  ** r
19ed0 65 70 6f 72 74 20 61 6e 79 20 65 72 72 6f 72 73  eport any errors
19ee0 2e 20 20 49 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  .  In the common
19ef0 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
19f00 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 78  expression is ex
19f10 61 63 74 6c 79 0a 20 20 2a 2a 20 61 20 74 61 62  actly.  ** a tab
19f20 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73 74 6f 72 65  le column, store
19f30 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20   that column in 
19f40 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20 46 6f 72  aiColumn[].  For
19f50 20 67 65 6e 65 72 61 6c 20 65 78 70 72 65 73 73   general express
19f60 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f 70 75 6c  ions,.  ** popul
19f70 61 74 65 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c  ate pIndex->aCol
19f80 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 58  Expr and store X
19f90 4e 5f 45 58 50 52 20 28 2d 32 29 20 69 6e 20 61  N_EXPR (-2) in a
19fa0 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a  iColumn[]..  **.
19fb0 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65    ** TODO: Issue
19fc0 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74 77   a warning if tw
19fd0 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e  o or more column
19fe0 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  s of the index a
19ff0 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20  re identical..  
1a000 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65 20 61  ** TODO: Issue a
1a010 20 77 61 72 6e 69 6e 67 20 69 66 20 74 68 65 20   warning if the 
1a020 74 61 62 6c 65 20 70 72 69 6d 61 72 79 20 6b 65  table primary ke
1a030 79 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72  y is used as par
1a040 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e  t of the.  ** in
1a050 64 65 78 20 6b 65 79 2e 0a 20 20 2a 2f 0a 20 20  dex key..  */.  
1a060 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74  for(i=0, pListIt
1a070 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
1a080 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1a090 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a  , pListItem++){.
1a0a0 20 20 20 20 45 78 70 72 20 2a 70 43 45 78 70 72      Expr *pCExpr
1a0b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a0c0 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 69     /* The i-th i
1a0d0 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f 6e 20  ndex expression 
1a0e0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65  */.    int reque
1a0f0 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 20 20  stedSortOrder;  
1a100 20 20 20 20 20 20 2f 2a 20 41 53 43 20 6f 72 20        /* ASC or 
1a110 44 45 53 43 20 6f 6e 20 74 68 65 20 69 2d 74 68  DESC on the i-th
1a120 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
1a130 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1a140 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
1a150 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73    /* Collation s
1a160 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a  equence name */.
1a170 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 69  .    sqlite3Stri
1a180 6e 67 54 6f 49 64 28 70 4c 69 73 74 49 74 65 6d  ngToId(pListItem
1a190 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->pExpr);.    sq
1a1a0 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66  lite3ResolveSelf
1a1b0 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65  Reference(pParse
1a1c0 2c 20 70 54 61 62 2c 20 4e 43 5f 49 64 78 45 78  , pTab, NC_IdxEx
1a1d0 70 72 2c 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  pr, pListItem->p
1a1e0 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 69 66  Expr, 0);.    if
1a1f0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
1a200 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1a210 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70 43 45  e_index;.    pCE
1a220 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1a230 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69  rSkipCollate(pLi
1a240 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a  stItem->pExpr);.
1a250 20 20 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e      if( pCExpr->
1a260 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op!=TK_COLUMN ){
1a270 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
1a280 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62  =pParse->pNewTab
1a290 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  le ){.        sq
1a2a0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1a2b0 61 72 73 65 2c 20 22 65 78 70 72 65 73 73 69 6f  arse, "expressio
1a2c0 6e 73 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e  ns prohibited in
1a2d0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64   PRIMARY KEY and
1a2e0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
1a2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a300 20 20 20 22 55 4e 49 51 55 45 20 63 6f 6e 73 74     "UNIQUE const
1a310 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  raints");.      
1a320 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1a330 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
1a340 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 64  }.      if( pInd
1a350 65 78 2d 3e 61 43 6f 6c 45 78 70 72 3d 3d 30 20  ex->aColExpr==0 
1a360 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  ){.        ExprL
1a370 69 73 74 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c  ist *pCopy = sql
1a380 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
1a390 64 62 2c 20 70 4c 69 73 74 2c 20 30 29 3b 0a 20  db, pList, 0);. 
1a3a0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
1a3b0 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 70 79 3b  ColExpr = pCopy;
1a3c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62  .        if( !db
1a3d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1a3e0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
1a3f0 72 74 28 20 70 43 6f 70 79 21 3d 30 20 29 3b 0a  rt( pCopy!=0 );.
1a400 20 20 20 20 20 20 20 20 20 20 70 4c 69 73 74 49            pListI
1a410 74 65 6d 20 3d 20 26 70 43 6f 70 79 2d 3e 61 5b  tem = &pCopy->a[
1a420 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i];.        }.  
1a430 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20      }.      j = 
1a440 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70  XN_EXPR;.      p
1a450 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
1a460 69 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20  i] = XN_EXPR;.  
1a470 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71      pIndex->uniq
1a480 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  NotNull = 0;.   
1a490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 20   }else{.      j 
1a4a0 3d 20 70 43 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  = pCExpr->iColum
1a4b0 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
1a4c0 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a 20 20   j<=0x7fff );.  
1a4d0 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20      if( j<0 ){. 
1a4e0 20 20 20 20 20 20 20 6a 20 3d 20 70 54 61 62 2d         j = pTab-
1a4f0 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  >iPKey;.      }e
1a500 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 61 43  lse if( pTab->aC
1a510 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  ol[j].notNull==0
1a520 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   ){.        pInd
1a530 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  ex->uniqNotNull 
1a540 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1a550 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
1a560 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29 6a 3b  umn[i] = (i16)j;
1a570 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 6c  .    }.    zColl
1a580 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c   = 0;.    if( pL
1a590 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
1a5a0 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
1a5b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c  {.      int nCol
1a5c0 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  l;.      zColl =
1a5d0 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
1a5e0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
1a5f0 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     nColl = sqlit
1a600 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c  e3Strlen30(zColl
1a610 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) + 1;.      ass
1a620 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f  ert( nExtra>=nCo
1a630 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ll );.      memc
1a640 70 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c  py(zExtra, zColl
1a650 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , nColl);.      
1a660 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a  zColl = zExtra;.
1a670 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20        zExtra += 
1a680 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78  nColl;.      nEx
1a690 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20  tra -= nColl;.  
1a6a0 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3e 3d 30    }else if( j>=0
1a6b0 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20   ){.      zColl 
1a6c0 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
1a6d0 7a 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  zColl;.    }.   
1a6e0 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43   if( !zColl ) zC
1a6f0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72  oll = sqlite3Str
1a700 42 49 4e 41 52 59 3b 0a 20 20 20 20 69 66 28 20  BINARY;.    if( 
1a710 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
1a720 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  & !sqlite3Locate
1a730 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1a740 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
1a750 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1a760 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
1a770 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c    pIndex->azColl
1a780 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20  [i] = zColl;.   
1a790 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72   requestedSortOr
1a7a0 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  der = pListItem-
1a7b0 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72  >sortOrder & sor
1a7c0 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20  tOrderMask;.    
1a7d0 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
1a7e0 65 72 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75  er[i] = (u8)requ
1a7f0 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a  estedSortOrder;.
1a800 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64    }..  /* Append
1a810 20 74 68 65 20 74 61 62 6c 65 20 6b 65 79 20 74   the table key t
1a820 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1a830 20 69 6e 64 65 78 2e 20 20 46 6f 72 20 57 49 54   index.  For WIT
1a840 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 2a 2a 20  HOUT ROWID.  ** 
1a850 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b  tables (when pPk
1a860 21 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62  !=0) this will b
1a870 65 20 74 68 65 20 64 65 63 6c 61 72 65 64 20 50  e the declared P
1a880 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72  RIMARY KEY.  For
1a890 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 74 61 62  .  ** normal tab
1a8a0 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 3d 3d 30  les (when pPk==0
1a8b0 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74  ) this will be t
1a8c0 68 65 20 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20  he rowid..  */. 
1a8d0 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20   if( pPk ){.    
1a8e0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e  for(j=0; j<pPk->
1a8f0 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  nKeyCol; j++){. 
1a900 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 6b       int x = pPk
1a910 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
1a920 20 20 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d       assert( x>=
1a930 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68  0 );.      if( h
1a940 61 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d  asColumn(pIndex-
1a950 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65  >aiColumn, pInde
1a960 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29 20 29  x->nKeyCol, x) )
1a970 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
1a980 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20  ->nColumn--; .  
1a990 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a9a0 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
1a9b0 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20 20 20  umn[i] = x;.    
1a9c0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
1a9d0 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43  ll[i] = pPk->azC
1a9e0 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
1a9f0 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
1aa00 65 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f  er[i] = pPk->aSo
1aa10 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20  rtOrder[j];.    
1aa20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d      i++;.      }
1aa30 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1aa40 74 28 20 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43  t( i==pIndex->nC
1aa50 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73 65  olumn );.  }else
1aa60 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69  {.    pIndex->ai
1aa70 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 52  Column[i] = XN_R
1aa80 4f 57 49 44 3b 0a 20 20 20 20 70 49 6e 64 65 78  OWID;.    pIndex
1aa90 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  ->azColl[i] = sq
1aaa0 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a  lite3StrBINARY;.
1aab0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66    }.  sqlite3Def
1aac0 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65  aultRowEst(pInde
1aad0 78 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  x);.  if( pParse
1aae0 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29  ->pNewTable==0 )
1aaf0 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69   estimateIndexWi
1ab00 64 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20  dth(pIndex);..  
1ab10 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65 78  /* If this index
1ab20 20 63 6f 6e 74 61 69 6e 73 20 65 76 65 72 79 20   contains every 
1ab30 63 6f 6c 75 6d 6e 20 6f 66 20 69 74 73 20 74 61  column of its ta
1ab40 62 6c 65 2c 20 74 68 65 6e 20 6d 61 72 6b 0a 20  ble, then mark. 
1ab50 20 2a 2a 20 69 74 20 61 73 20 61 20 63 6f 76 65   ** it as a cove
1ab60 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ring index */.  
1ab70 61 73 73 65 72 74 28 20 48 61 73 52 6f 77 69 64  assert( HasRowid
1ab80 28 70 54 61 62 29 20 0a 20 20 20 20 20 20 7c 7c  (pTab) .      ||
1ab90 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c   pTab->iPKey<0 |
1aba0 7c 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  | sqlite3ColumnO
1abb0 66 49 6e 64 65 78 28 70 49 6e 64 65 78 2c 20 70  fIndex(pIndex, p
1abc0 54 61 62 2d 3e 69 50 4b 65 79 29 3e 3d 30 20 29  Tab->iPKey)>=0 )
1abd0 3b 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65  ;.  if( pTblName
1abe0 21 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 6e  !=0 && pIndex->n
1abf0 43 6f 6c 75 6d 6e 3e 3d 70 54 61 62 2d 3e 6e 43  Column>=pTab->nC
1ac00 6f 6c 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  ol ){.    pIndex
1ac10 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31  ->isCovering = 1
1ac20 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1ac30 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
1ac40 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d  ){.      if( j==
1ac50 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f  pTab->iPKey ) co
1ac60 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
1ac70 28 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  ( sqlite3ColumnO
1ac80 66 49 6e 64 65 78 28 70 49 6e 64 65 78 2c 6a 29  fIndex(pIndex,j)
1ac90 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  >=0 ) continue;.
1aca0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 69 73        pIndex->is
1acb0 43 6f 76 65 72 69 6e 67 20 3d 20 30 3b 0a 20 20  Covering = 0;.  
1acc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1acd0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 61 62  .  }..  if( pTab
1ace0 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ==pParse->pNewTa
1acf0 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ble ){.    /* Th
1ad00 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62  is routine has b
1ad10 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  een called to cr
1ad20 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69  eate an automati
1ad30 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20  c index as a.   
1ad40 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20   ** result of a 
1ad50 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
1ad60 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20  NIQUE clause on 
1ad70 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  a column definit
1ad80 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  ion, or.    ** a
1ad90 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
1ada0 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f  UNIQUE clause fo
1adb0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75  llowing the colu
1adc0 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a  mn definitions..
1add0 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20      ** i.e. one 
1ade0 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
1adf0 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
1ae00 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
1ae10 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54  y);.    ** CREAT
1ae20 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20  E TABLE t(x, y, 
1ae30 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
1ae40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74     **.    ** Eit
1ae50 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74  her way, check t
1ae60 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62  o see if the tab
1ae70 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73  le already has s
1ae80 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66  uch an index. If
1ae90 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27  .    ** so, don'
1aea0 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e  t bother creatin
1aeb0 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73  g this one. This
1aec0 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f   only applies to
1aed0 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
1aee0 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e  cally created in
1aef0 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e  dices. Users can
1af00 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68   do as they wish
1af10 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70   with.    ** exp
1af20 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20  licit indices.. 
1af30 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f     **.    ** Two
1af40 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41   UNIQUE or PRIMA
1af50 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
1af60 74 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  ts are considere
1af70 64 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20  d equivalent.   
1af80 20 2a 2a 20 28 61 6e 64 20 74 68 75 73 20 73 75   ** (and thus su
1af90 70 70 72 65 73 73 69 6e 67 20 74 68 65 20 73 65  ppressing the se
1afa0 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20 69  cond one) even i
1afb0 66 20 74 68 65 79 20 68 61 76 65 20 64 69 66 66  f they have diff
1afc0 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72  erent.    ** sor
1afd0 74 20 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a  t orders..    **
1afe0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
1aff0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 63   are different c
1b000 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1b010 65 73 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6c  es or if the col
1b020 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74  umns of.    ** t
1b030 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63  he constraint oc
1b040 63 75 72 20 69 6e 20 64 69 66 66 65 72 65 6e 74  cur in different
1b050 20 6f 72 64 65 72 73 2c 20 74 68 65 6e 20 74 68   orders, then th
1b060 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  e constraints ar
1b070 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65  e.    ** conside
1b080 72 65 64 20 64 69 73 74 69 6e 63 74 20 61 6e 64  red distinct and
1b090 20 62 6f 74 68 20 72 65 73 75 6c 74 20 69 6e 20   both result in 
1b0a0 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73  separate indices
1b0b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64  ..    */.    Ind
1b0c0 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
1b0d0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
1b0e0 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
1b0f0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
1b100 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
1b110 20 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 75   assert( IsUniqu
1b120 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 3b 0a  eIndex(pIdx) );.
1b130 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1b140 64 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c  dx->idxType!=SQL
1b150 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
1b160 45 46 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EF );.      asse
1b170 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65  rt( IsUniqueInde
1b180 78 28 70 49 6e 64 65 78 29 20 29 3b 0a 0a 20 20  x(pIndex) );..  
1b190 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b      if( pIdx->nK
1b1a0 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e  eyCol!=pIndex->n
1b1b0 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75  KeyCol ) continu
1b1c0 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  e;.      for(k=0
1b1d0 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; k<pIdx->nKeyCo
1b1e0 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; k++){.       
1b1f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b   const char *z1;
1b200 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
1b210 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20  har *z2;.       
1b220 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
1b230 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b  iColumn[k]>=0 );
1b240 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
1b250 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d  x->aiColumn[k]!=
1b260 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1b270 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  [k] ) break;.   
1b280 20 20 20 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e       z1 = pIdx->
1b290 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20  azColl[k];.     
1b2a0 20 20 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e     z2 = pIndex->
1b2b0 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20  azColl[k];.     
1b2c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1b2d0 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20  rICmp(z1, z2) ) 
1b2e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1b2f0 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78       if( k==pIdx
1b300 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  ->nKeyCol ){.   
1b310 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
1b320 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e  nError!=pIndex->
1b330 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  onError ){.     
1b340 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
1b350 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20  straint creates 
1b360 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61  the same index a
1b370 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  s a previous.   
1b380 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
1b390 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73  aint specified s
1b3a0 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20  omewhere in the 
1b3b0 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
1b3c0 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20  tement..        
1b3d0 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65    ** However the
1b3e0 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
1b3f0 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65  uses are differe
1b400 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73  nt. If both this
1b410 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63   .          ** c
1b420 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
1b430 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76  e previous equiv
1b440 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74  alent constraint
1b450 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20   have explicit. 
1b460 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43           ** ON C
1b470 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
1b480 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  this is an error
1b490 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65  . Otherwise, use
1b4a0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
1b4b0 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  * explicitly spe
1b4c0 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 72 20  cified behavior 
1b4d0 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  for the index.. 
1b4e0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1b4f0 20 20 20 20 20 20 69 66 28 20 21 28 70 49 64 78        if( !(pIdx
1b500 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
1b510 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d  fault || pIndex-
1b520 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
1b530 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20  ault) ){.       
1b540 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1b550 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
1b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
1b570 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f  onflicting ON CO
1b580 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73  NFLICT clauses s
1b590 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20  pecified", 0);. 
1b5a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1b5b0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
1b5c0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
1b5d0 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  lt ){.          
1b5e0 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20    pIdx->onError 
1b5f0 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  = pIndex->onErro
1b600 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
1b610 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b620 20 69 66 28 20 69 64 78 54 79 70 65 3d 3d 53 51   if( idxType==SQ
1b630 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49  LITE_IDXTYPE_PRI
1b640 4d 41 52 59 4b 45 59 20 29 20 70 49 64 78 2d 3e  MARYKEY ) pIdx->
1b650 69 64 78 54 79 70 65 20 3d 20 69 64 78 54 79 70  idxType = idxTyp
1b660 65 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  e;.        goto 
1b670 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1b680 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
1b690 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  .  }..  /* Link 
1b6a0 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74  the new Index st
1b6b0 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74  ructure to its t
1b6c0 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20  able and to the 
1b6d0 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65  other.  ** in-me
1b6e0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74  mory database st
1b6f0 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a  ructures. .  */.
1b700 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1b710 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69  ->nErr==0 );.  i
1b720 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1b730 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
1b740 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 49  ;.    assert( !I
1b750 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
1b760 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
1b770 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
1b780 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64  Held(db, 0, pInd
1b790 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a  ex->pSchema) );.
1b7a0 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
1b7b0 61 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65  ashInsert(&pInde
1b7c0 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  x->pSchema->idxH
1b7d0 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ash, .          
1b7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7f0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70  pIndex->zName, p
1b800 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
1b810 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
1b820 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20  t( p==pIndex ); 
1b830 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
1b840 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
1b850 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
1b860 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20  ault(db);.      
1b870 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1b880 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
1b890 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c    db->mDbFlags |
1b8a0 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43  = DBFLAG_SchemaC
1b8b0 68 61 6e 67 65 3b 0a 20 20 20 20 69 66 28 20 70  hange;.    if( p
1b8c0 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  TblName!=0 ){.  
1b8d0 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
1b8e0 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
1b8f0 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  num;.    }.  }..
1b900 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1b910 74 68 65 20 69 6e 69 74 69 61 6c 20 43 52 45 41  the initial CREA
1b920 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
1b930 6e 74 20 28 6f 72 20 43 52 45 41 54 45 20 54 41  nt (or CREATE TA
1b940 42 4c 45 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  BLE if the.  ** 
1b950 69 6e 64 65 78 20 69 73 20 61 6e 20 69 6d 70 6c  index is an impl
1b960 69 65 64 20 69 6e 64 65 78 20 66 6f 72 20 61 20  ied index for a 
1b970 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52  UNIQUE or PRIMAR
1b980 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
1b990 29 20 74 68 65 6e 0a 20 20 2a 2a 20 65 6d 69 74  ) then.  ** emit
1b9a0 20 63 6f 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74   code to allocat
1b9b0 65 20 74 68 65 20 69 6e 64 65 78 20 72 6f 6f 74  e the index root
1b9c0 70 61 67 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64  page on disk and
1b9d0 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66   make an entry f
1b9e0 6f 72 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  or.  ** the inde
1b9f0 78 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  x in the sqlite_
1ba00 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
1ba10 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 69 6e   populate the in
1ba20 64 65 78 20 77 69 74 68 0a 20 20 2a 2a 20 63 6f  dex with.  ** co
1ba30 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20  ntent.  But, do 
1ba40 6e 6f 74 20 64 6f 20 74 68 69 73 20 69 66 20 77  not do this if w
1ba50 65 20 61 72 65 20 73 69 6d 70 6c 79 20 72 65 61  e are simply rea
1ba60 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
1ba70 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c  master.  ** tabl
1ba80 65 20 74 6f 20 70 61 72 73 65 20 74 68 65 20 73  e to parse the s
1ba90 63 68 65 6d 61 2c 20 6f 72 20 69 66 20 74 68 69  chema, or if thi
1baa0 73 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 50  s index is the P
1bab0 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
1bac0 0a 20 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f  .  ** of a WITHO
1bad0 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a  UT ROWID table..
1bae0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62    **.  ** If pTb
1baf0 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  lName==0 it mean
1bb00 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  s this index is 
1bb10 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 6e 20  generated as an 
1bb20 69 6d 70 6c 69 65 64 20 50 52 49 4d 41 52 59 20  implied PRIMARY 
1bb30 4b 45 59 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51  KEY.  ** or UNIQ
1bb40 55 45 20 69 6e 64 65 78 20 69 6e 20 61 20 43 52  UE index in a CR
1bb50 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
1bb60 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65  ment.  Since the
1bb70 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20   table.  ** has 
1bb80 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65  just been create
1bb90 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e  d, it contains n
1bba0 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69  o data and the i
1bbb0 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  ndex initializat
1bbc0 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61  ion.  ** step ca
1bbd0 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
1bbe0 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 48 61  */.  else if( Ha
1bbf0 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20  sRowid(pTab) || 
1bc00 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  pTblName!=0 ){. 
1bc10 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
1bc20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20  char *zStmt;.   
1bc30 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50   int iMem = ++pP
1bc40 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20  arse->nMem;..   
1bc50 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1bc60 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
1bc70 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
1bc80 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1bc90 65 78 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ex;..    sqlite3
1bca0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
1bcb0 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
1bcc0 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  Db);..    /* Cre
1bcd0 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65  ate the rootpage
1bce0 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 75   for the index u
1bcf0 73 69 6e 67 20 43 72 65 61 74 65 49 6e 64 65 78  sing CreateIndex
1bd00 2e 20 42 75 74 20 62 65 66 6f 72 65 0a 20 20 20  . But before.   
1bd10 20 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f   ** doing so, co
1bd20 64 65 20 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75  de a Noop instru
1bd30 63 74 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20  ction and store 
1bd40 69 74 73 20 61 64 64 72 65 73 73 20 69 6e 20 0a  its address in .
1bd50 20 20 20 20 2a 2a 20 49 6e 64 65 78 2e 74 6e 75      ** Index.tnu
1bd60 6d 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  m. This is requi
1bd70 72 65 64 20 69 6e 20 63 61 73 65 20 74 68 69 73  red in case this
1bd80 20 69 6e 64 65 78 20 69 73 20 61 63 74 75 61 6c   index is actual
1bd90 6c 79 20 61 20 0a 20 20 20 20 2a 2a 20 50 52 49  ly a .    ** PRI
1bda0 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 74 68 65  MARY KEY and the
1bdb0 20 74 61 62 6c 65 20 69 73 20 61 63 74 75 61 6c   table is actual
1bdc0 6c 79 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  ly a WITHOUT ROW
1bdd0 49 44 20 74 61 62 6c 65 2e 20 49 6e 20 0a 20 20  ID table. In .  
1bde0 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 74    ** that case t
1bdf0 68 65 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68  he convertToWith
1be00 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 29 20  outRowidTable() 
1be10 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 70  routine will rep
1be20 6c 61 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  lace.    ** the 
1be30 4e 6f 6f 70 20 77 69 74 68 20 61 20 47 6f 74 6f  Noop with a Goto
1be40 20 74 6f 20 6a 75 6d 70 20 6f 76 65 72 20 74 68   to jump over th
1be50 65 20 56 44 42 45 20 63 6f 64 65 20 67 65 6e 65  e VDBE code gene
1be60 72 61 74 65 64 20 62 65 6c 6f 77 2e 20 2a 2f 0a  rated below. */.
1be70 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
1be80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1be90 64 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29  dOp0(v, OP_Noop)
1bea0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1beb0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 72  eAddOp3(v, OP_Cr
1bec0 65 61 74 65 42 74 72 65 65 2c 20 69 44 62 2c 20  eateBtree, iDb, 
1bed0 69 4d 65 6d 2c 20 42 54 52 45 45 5f 42 4c 4f 42  iMem, BTREE_BLOB
1bee0 4b 45 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61  KEY);..    /* Ga
1bef0 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  ther the complet
1bf00 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
1bf10 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1bf20 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ment into.    **
1bf30 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61   the zStmt varia
1bf40 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ble.    */.    i
1bf50 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
1bf60 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29     int n = (int)
1bf70 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f  (pParse->sLastTo
1bf80 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a  ken.z - pName->z
1bf90 29 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  ) + pParse->sLas
1bfa0 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20  tToken.n;.      
1bfb0 69 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31  if( pName->z[n-1
1bfc0 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20  ]==';' ) n--;.  
1bfd0 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69      /* A named i
1bfe0 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70  ndex with an exp
1bff0 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44  licit CREATE IND
1c000 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EX statement */.
1c010 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
1c020 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1c030 20 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58   "CREATE%s INDEX
1c040 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20   %.*s",.        
1c050 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
1c060 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45   ? "" : " UNIQUE
1c070 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b  ", n, pName->z);
1c080 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c090 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69    /* An automati
1c0a0 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20  c index created 
1c0b0 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  by a PRIMARY KEY
1c0c0 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
1c0d0 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f  raint */.      /
1c0e0 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  * zStmt = sqlite
1c0f0 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f  3MPrintf(""); */
1c100 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30  .      zStmt = 0
1c110 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1c120 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  Add an entry in 
1c130 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f  sqlite_master fo
1c140 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20  r this index.   
1c150 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
1c160 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
1c170 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53  e, .        "INS
1c180 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56  ERT INTO %Q.%s V
1c190 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51  ALUES('index',%Q
1c1a0 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20  ,%Q,#%d,%Q);",. 
1c1b0 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
1c1c0 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41  Db].zDbSName, MA
1c1d0 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20  STER_NAME,.     
1c1e0 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
1c1f0 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
1c200 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 69  zName,.        i
1c210 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53 74  Mem,.        zSt
1c220 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  mt.    );.    sq
1c230 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1c240 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  zStmt);..    /* 
1c250 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77  Fill the index w
1c260 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70  ith data and rep
1c270 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e  arse the schema.
1c280 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69   Code an OP_Expi
1c290 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76  re.    ** to inv
1c2a0 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d  alidate all pre-
1c2b0 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
1c2c0 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nts..    */.    
1c2d0 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a  if( pTblName ){.
1c2e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
1c2f0 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
1c300 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a   pIndex, iMem);.
1c310 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61        sqlite3Cha
1c320 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
1c330 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
1c340 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
1c350 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62  eSchemaOp(v, iDb
1c360 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,.         sqlit
1c370 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e  e3MPrintf(db, "n
1c380 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70  ame='%q' AND typ
1c390 65 3d 27 69 6e 64 65 78 27 22 2c 20 70 49 6e 64  e='index'", pInd
1c3a0 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ex->zName));.   
1c3b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c3c0 64 4f 70 30 28 76 2c 20 4f 50 5f 45 78 70 69 72  dOp0(v, OP_Expir
1c3d0 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  e);.    }..    s
1c3e0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1c3f0 72 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 74 6e  re(v, pIndex->tn
1c400 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  um);.  }..  /* W
1c410 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e  hen adding an in
1c420 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20  dex to the list 
1c430 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61  of indices for a
1c440 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a   table, make.  *
1c450 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63  * sure all indic
1c460 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65  es labeled OE_Re
1c470 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72  place come after
1c480 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c   all those label
1c490 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72  ed.  ** OE_Ignor
1c4a0 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  e.  This is nece
1c4b0 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f  ssary for the co
1c4c0 72 72 65 63 74 20 63 6f 6e 73 74 72 61 69 6e 74  rrect constraint
1c4d0 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63   check.  ** proc
1c4e0 65 73 73 69 6e 67 20 28 69 6e 20 73 71 6c 69 74  essing (in sqlit
1c4f0 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72  e3GenerateConstr
1c500 61 69 6e 74 43 68 65 63 6b 73 28 29 29 20 61 73  aintChecks()) as
1c510 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50   part of.  ** UP
1c520 44 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20  DATE and INSERT 
1c530 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20  statements.  .  
1c540 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
1c550 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61  t.busy || pTblNa
1c560 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  me==0 ){.    if(
1c570 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70   onError!=OE_Rep
1c580 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49  lace || pTab->pI
1c590 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20  ndex==0.        
1c5a0 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
1c5b0 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ->onError==OE_Re
1c5c0 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49  place){.      pI
1c5d0 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54  ndex->pNext = pT
1c5e0 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
1c5f0 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d    pTab->pIndex =
1c600 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c   pIndex;.    }el
1c610 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
1c620 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e  *pOther = pTab->
1c630 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
1c640 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65  ile( pOther->pNe
1c650 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e  xt && pOther->pN
1c660 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  ext->onError!=OE
1c670 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20  _Replace ){.    
1c680 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74      pOther = pOt
1c690 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
1c6a0 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78    }.      pIndex
1c6b0 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72  ->pNext = pOther
1c6c0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70  ->pNext;.      p
1c6d0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Other->pNext = p
1c6e0 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  Index;.    }.   
1c6f0 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d   pIndex = 0;.  }
1c700 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20  ..  /* Clean up 
1c710 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
1c720 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  /.exit_create_in
1c730 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65  dex:.  if( pInde
1c740 78 20 29 20 66 72 65 65 49 6e 64 65 78 28 64 62  x ) freeIndex(db
1c750 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c  , pIndex);.  sql
1c760 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1c770 62 2c 20 70 50 49 57 68 65 72 65 29 3b 0a 20 20  b, pPIWhere);.  
1c780 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
1c790 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
1c7a0 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  ;.  sqlite3SrcLi
1c7b0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62  stDelete(db, pTb
1c7c0 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
1c7d0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
1c7e0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c  e);.}../*.** Fil
1c7f0 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f  l the Index.aiRo
1c800 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74  wEst[] array wit
1c810 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d  h default inform
1c820 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74  ation - informat
1c830 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65  ion.** to be use
1c840 64 20 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e  d when we have n
1c850 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59  ot run the ANALY
1c860 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  ZE command..**.*
1c870 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73  * aiRowEst[0] is
1c880 20 73 75 70 70 6f 73 65 64 20 74 6f 20 63 6f 6e   supposed to con
1c890 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  tain the number 
1c8a0 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  of elements in t
1c8b0 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e  he index..** Sin
1c8c0 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f  ce we do not kno
1c8d0 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69  w, guess 1 milli
1c8e0 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d  on.  aiRowEst[1]
1c8f0 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
1c900 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  of the.** number
1c910 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1c920 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68  table that match
1c930 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
1c940 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20  value of the.** 
1c950 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  first column of 
1c960 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f  the index.  aiRo
1c970 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73  wEst[2] is an es
1c980 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
1c990 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20  mber.** of rows 
1c9a0 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70  that match any p
1c9b0 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e  articular combin
1c9c0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72  ation of the fir
1c9d0 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  st 2 columns.** 
1c9e0 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41  of the index.  A
1c9f0 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74  nd so forth.  It
1ca00 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20   must always be 
1ca10 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a  the case that.*.
1ca20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52  **           aiR
1ca30 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45  owEst[N]<=aiRowE
1ca40 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20  st[N-1].**      
1ca50 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d       aiRowEst[N]
1ca60 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20  >=1.**.** Apart 
1ca70 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61  from that, we ha
1ca80 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20  ve little to go 
1ca90 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75 69  on besides intui
1caa0 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f  tion as to.** ho
1cab0 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f  w aiRowEst[] sho
1cac0 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  uld be initializ
1cad0 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73  ed.  The numbers
1cae0 20 67 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a   generated here.
1caf0 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20  ** are based on 
1cb00 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66  typical values f
1cb10 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69  ound in actual i
1cb20 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ndices..*/.void 
1cb30 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f  sqlite3DefaultRo
1cb40 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78  wEst(Index *pIdx
1cb50 29 7b 0a 20 20 2f 2a 20 20 20 20 20 20 20 20 20  ){.  /*         
1cb60 20 20 20 20 20 20 20 31 30 2c 20 20 39 2c 20 20         10,  9,  
1cb70 38 2c 20 20 37 2c 20 20 36 20 2a 2f 0a 20 20 4c  8,  7,  6 */.  L
1cb80 6f 67 45 73 74 20 61 56 61 6c 5b 5d 20 3d 20 7b  ogEst aVal[] = {
1cb90 20 33 33 2c 20 33 32 2c 20 33 30 2c 20 32 38 2c   33, 32, 30, 28,
1cba0 20 32 36 20 7d 3b 0a 20 20 4c 6f 67 45 73 74 20   26 };.  LogEst 
1cbb0 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77  *a = pIdx->aiRow
1cbc0 4c 6f 67 45 73 74 3b 0a 20 20 69 6e 74 20 6e 43  LogEst;.  int nC
1cbd0 6f 70 79 20 3d 20 4d 49 4e 28 41 72 72 61 79 53  opy = MIN(ArrayS
1cbe0 69 7a 65 28 61 56 61 6c 29 2c 20 70 49 64 78 2d  ize(aVal), pIdx-
1cbf0 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 69 6e 74  >nKeyCol);.  int
1cc00 20 69 3b 0a 0a 20 20 2f 2a 20 49 6e 64 65 78 65   i;..  /* Indexe
1cc10 73 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 72  s with default r
1cc20 6f 77 20 65 73 74 69 6d 61 74 65 73 20 73 68 6f  ow estimates sho
1cc30 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 73 74 61  uld not have sta
1cc40 74 31 20 64 61 74 61 20 2a 2f 0a 20 20 61 73 73  t1 data */.  ass
1cc50 65 72 74 28 20 21 70 49 64 78 2d 3e 68 61 73 53  ert( !pIdx->hasS
1cc60 74 61 74 31 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  tat1 );..  /* Se
1cc70 74 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  t the first entr
1cc80 79 20 28 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  y (number of row
1cc90 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 29 20  s in the index) 
1cca0 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  to the estimated
1ccb0 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66   .  ** number of
1ccc0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
1ccd0 6c 65 2c 20 6f 72 20 68 61 6c 66 20 74 68 65 20  le, or half the 
1cce0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1ccf0 6e 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a  n the table.  **
1cd00 20 66 6f 72 20 61 20 70 61 72 74 69 61 6c 20 69   for a partial i
1cd10 6e 64 65 78 2e 20 20 20 42 75 74 20 64 6f 20 6e  ndex.   But do n
1cd20 6f 74 20 6c 65 74 20 74 68 65 20 65 73 74 69 6d  ot let the estim
1cd30 61 74 65 20 64 72 6f 70 20 62 65 6c 6f 77 20 31  ate drop below 1
1cd40 30 2e 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20 70  0. */.  a[0] = p
1cd50 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f  Idx->pTable->nRo
1cd60 77 4c 6f 67 45 73 74 3b 0a 20 20 69 66 28 20 70  wLogEst;.  if( p
1cd70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
1cd80 72 65 21 3d 30 20 29 20 61 5b 30 5d 20 2d 3d 20  re!=0 ) a[0] -= 
1cd90 31 30 3b 20 20 61 73 73 65 72 74 28 20 31 30 3d  10;  assert( 10=
1cda0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
1cdb0 29 20 29 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3c  ) );.  if( a[0]<
1cdc0 33 33 20 29 20 61 5b 30 5d 20 3d 20 33 33 3b 20  33 ) a[0] = 33; 
1cdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cde0 20 61 73 73 65 72 74 28 20 33 33 3d 3d 73 71 6c   assert( 33==sql
1cdf0 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 29  ite3LogEst(10) )
1ce00 3b 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65  ;..  /* Estimate
1ce10 20 74 68 61 74 20 61 5b 31 5d 20 69 73 20 31 30   that a[1] is 10
1ce20 2c 20 61 5b 32 5d 20 69 73 20 39 2c 20 61 5b 33  , a[2] is 9, a[3
1ce30 5d 20 69 73 20 38 2c 20 61 5b 34 5d 20 69 73 20  ] is 8, a[4] is 
1ce40 37 2c 20 61 5b 35 5d 20 69 73 0a 20 20 2a 2a 20  7, a[5] is.  ** 
1ce50 36 20 61 6e 64 20 65 61 63 68 20 73 75 62 73 65  6 and each subse
1ce60 71 75 65 6e 74 20 76 61 6c 75 65 20 28 69 66 20  quent value (if 
1ce70 61 6e 79 29 20 69 73 20 35 2e 20 20 2a 2f 0a 20  any) is 5.  */. 
1ce80 20 6d 65 6d 63 70 79 28 26 61 5b 31 5d 2c 20 61   memcpy(&a[1], a
1ce90 56 61 6c 2c 20 6e 43 6f 70 79 2a 73 69 7a 65 6f  Val, nCopy*sizeo
1cea0 66 28 4c 6f 67 45 73 74 29 29 3b 0a 20 20 66 6f  f(LogEst));.  fo
1ceb0 72 28 69 3d 6e 43 6f 70 79 2b 31 3b 20 69 3c 3d  r(i=nCopy+1; i<=
1cec0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  pIdx->nKeyCol; i
1ced0 2b 2b 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20  ++){.    a[i] = 
1cee0 32 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  23;             
1cef0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32         assert( 2
1cf00 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
1cf10 28 35 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  (5) );.  }..  as
1cf20 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
1cf30 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20 69  LogEst(1) );.  i
1cf40 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  f( IsUniqueIndex
1cf50 28 70 49 64 78 29 20 29 20 61 5b 70 49 64 78 2d  (pIdx) ) a[pIdx-
1cf60 3e 6e 4b 65 79 43 6f 6c 5d 20 3d 20 30 3b 0a 7d  >nKeyCol] = 0;.}
1cf70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1cf80 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61  tine will drop a
1cf90 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64  n existing named
1cfa0 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f   index.  This ro
1cfb0 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  utine.** impleme
1cfc0 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44  nts the DROP IND
1cfd0 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  EX statement..*/
1cfe0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
1cff0 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  pIndex(Parse *pP
1d000 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
1d010 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73  Name, int ifExis
1d020 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ts){.  Index *pI
1d030 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ndex;.  Vdbe *v;
1d040 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1d050 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1d060 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73 65 72  nt iDb;..  asser
1d070 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
1d080 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76 65 72  =0 );   /* Never
1d090 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72 69   called with pri
1d0a0 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  or errors */.  i
1d0b0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1d0c0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
1d0d0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1d0e0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1d0f0 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
1d100 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1d110 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
1d120 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
1d130 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1d140 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70  p_index;.  }.  p
1d150 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46  Index = sqlite3F
1d160 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61  indIndex(db, pNa
1d170 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
1d180 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
1d190 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49  abase);.  if( pI
1d1a0 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ndex==0 ){.    i
1d1b0 66 28 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a  f( !ifExists ){.
1d1c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1d1d0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1d1e0 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53  o such index: %S
1d1f0 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ", pName, 0);.  
1d200 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1d210 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1d220 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72  NamedSchema(pPar
1d230 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  se, pName->a[0].
1d240 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
1d250 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
1d260 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
1d270 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1d280 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  p_index;.  }.  i
1d290 66 28 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79  f( pIndex->idxTy
1d2a0 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe!=SQLITE_IDXTY
1d2b0 50 45 5f 41 50 50 44 45 46 20 29 7b 0a 20 20 20  PE_APPDEF ){.   
1d2c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1d2d0 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
1d2e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1d2f0 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22  UNIQUE ".      "
1d300 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
1d310 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74  onstraint cannot
1d320 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29   be dropped", 0)
1d330 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
1d340 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
1d350 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
1d360 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
1d370 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
1d380 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1d390 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
1d3a0 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
1d3b0 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
1d3c0 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54  ROP_INDEX;.    T
1d3d0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
1d3e0 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  dex->pTable;.   
1d3f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1d400 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
1d410 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  zDbSName;.    co
1d420 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
1d430 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
1d440 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  b);.    if( sqli
1d450 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1d460 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
1d470 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
1d480 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
1d490 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1d4a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
1d4b0 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
1d4c0 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49  Db ) code = SQLI
1d4d0 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
1d4e0 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
1d4f0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1d500 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65  rse, code, pInde
1d510 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  x->zName, pTab->
1d520 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
1d530 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
1d540 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
1d550 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1d560 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1d570 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  to remove the in
1d580 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65  dex and from the
1d590 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f   master table */
1d5a0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1d5b0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1d5c0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
1d5d0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1d5e0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
1d5f0 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   1, iDb);.    sq
1d600 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
1d610 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
1d620 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
1d630 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  %s WHERE name=%Q
1d640 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78   AND type='index
1d650 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61  '",.       db->a
1d660 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
1d670 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70  , MASTER_NAME, p
1d680 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20  Index->zName.   
1d690 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   );.    sqlite3C
1d6a0 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
1d6b0 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78  Parse, iDb, "idx
1d6c0 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ", pIndex->zName
1d6d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
1d6e0 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
1d6f0 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73  e, iDb);.    des
1d700 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
1d710 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  rse, pIndex->tnu
1d720 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  m, iDb);.    sql
1d730 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1d740 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20  , OP_DropIndex, 
1d750 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65  iDb, 0, 0, pInde
1d760 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  x->zName, 0);.  
1d770 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  }..exit_drop_ind
1d780 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  ex:.  sqlite3Src
1d790 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1d7a0 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
1d7b0 70 41 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e  pArray is a poin
1d7c0 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20  ter to an array 
1d7d0 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68  of objects. Each
1d7e0 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a   object in the.*
1d7f0 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74  * array is szEnt
1d800 72 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ry bytes in size
1d810 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  . This routine u
1d820 73 65 73 20 73 71 6c 69 74 65 33 44 62 52 65 61  ses sqlite3DbRea
1d830 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74  lloc().** to ext
1d840 65 6e 64 20 74 68 65 20 61 72 72 61 79 20 73 6f  end the array so
1d850 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73   that there is s
1d860 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f  pace for a new o
1d870 62 6a 65 63 74 20 61 74 20 74 68 65 20 65 6e 64  bject at the end
1d880 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1d890 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1d8a0 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63  lled, *pnEntry c
1d8b0 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 75 72 72  ontains the curr
1d8c0 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74  ent size of.** t
1d8d0 68 65 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74  he array (in ent
1d8e0 72 69 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c  ries - so the al
1d8f0 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70  location is ((*p
1d900 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72  nEntry) * szEntr
1d910 79 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74  y) bytes.** in t
1d920 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  otal)..**.** If 
1d930 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73  the realloc() is
1d940 20 73 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65   successful (i.e
1d950 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64  . if no OOM cond
1d960 69 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74  ition occurs), t
1d970 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f  he.** space allo
1d980 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65  cated for the ne
1d990 77 20 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f  w object is zero
1d9a0 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64  ed, *pnEntry upd
1d9b0 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65  ated to.** refle
1d9c0 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20  ct the new size 
1d9d0 6f 66 20 74 68 65 20 61 72 72 61 79 20 61 6e 64  of the array and
1d9e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1d9f0 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
1da00 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70  .** returned. *p
1da10 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  Idx is set to th
1da20 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
1da30 65 77 20 61 72 72 61 79 20 65 6e 74 72 79 20 69  ew array entry i
1da40 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
1da50 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
1da60 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66   the realloc() f
1da70 61 69 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73  ails, *pIdx is s
1da80 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74  et to -1, *pnEnt
1da90 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e  ry remains.** un
1daa0 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f  changed and a co
1dab0 70 79 20 6f 66 20 70 41 72 72 61 79 20 72 65 74  py of pArray ret
1dac0 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  urned..*/.void *
1dad0 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
1dae0 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20  cate(.  sqlite3 
1daf0 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  *db,      /* Con
1db00 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
1db10 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  y of malloc fail
1db20 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ures */.  void *
1db30 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41  pArray,     /* A
1db40 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e  rray of objects.
1db50 20 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c    Might be reall
1db60 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ocated */.  int 
1db70 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a  szEntry,      /*
1db80 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62   Size of each ob
1db90 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72 72 61  ject in the arra
1dba0 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e  y */.  int *pnEn
1dbb0 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  try,     /* Numb
1dbc0 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75  er of objects cu
1dbd0 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a  rrently in use *
1dbe0 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20  /.  int *pIdx   
1dbf0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1dc00 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65  he index of a ne
1dc10 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29  w slot here */.)
1dc20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  {.  char *z;.  i
1dc30 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b  nt n = *pnEntry;
1dc40 0a 20 20 69 66 28 20 28 6e 20 26 20 28 6e 2d 31  .  if( (n & (n-1
1dc50 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))==0 ){.    int
1dc60 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31   sz = (n==0) ? 1
1dc70 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64   : 2*n;.    void
1dc80 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
1dc90 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41  DbRealloc(db, pA
1dca0 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79  rray, sz*szEntry
1dcb0 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
1dcc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64  =0 ){.      *pId
1dcd0 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  x = -1;.      re
1dce0 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20  turn pArray;.   
1dcf0 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20   }.    pArray = 
1dd00 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  pNew;.  }.  z = 
1dd10 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20  (char*)pArray;. 
1dd20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73   memset(&z[n * s
1dd30 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e  zEntry], 0, szEn
1dd40 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  try);.  *pIdx = 
1dd50 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b  n;.  ++*pnEntry;
1dd60 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79  .  return pArray
1dd70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1dd80 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
1dd90 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c  to the given IdL
1dda0 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
1ddb0 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20  ew IdList if.** 
1ddc0 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41  need be..**.** A
1ddd0 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72   new IdList is r
1dde0 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
1ddf0 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
1de00 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  ls..*/.IdList *s
1de10 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
1de20 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nd(sqlite3 *db, 
1de30 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  IdList *pList, T
1de40 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
1de50 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1de60 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
1de70 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
1de80 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
1de90 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a  zeof(IdList) );.
1dea0 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
1deb0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
1dec0 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71  .  pList->a = sq
1ded0 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
1dee0 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20  te(.      db,.  
1def0 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20      pList->a,.  
1df00 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74      sizeof(pList
1df10 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26  ->a[0]),.      &
1df20 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20  pList->nId,.    
1df30 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20    &i.  );.  if( 
1df40 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  i<0 ){.    sqlit
1df50 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
1df60 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  b, pList);.    r
1df70 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1df80 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1df90 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1dfa0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
1dfb0 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  en);.  return pL
1dfc0 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ist;.}../*.** De
1dfd0 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a  lete an IdList..
1dfe0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49  */.void sqlite3I
1dff0 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  dListDelete(sqli
1e000 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
1e010 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1e020 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1e030 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1e040 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1e050 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
1e060 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1e070 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1e080 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
1e090 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
1e0a0 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
1e0b0 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69  DbFreeNN(db, pLi
1e0c0 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
1e0d0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
1e0e0 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69  n pList of the i
1e0f0 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20  dentifier named 
1e100 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  zId.  Return -1.
1e110 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ** if not found.
1e120 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
1e130 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73  dListIndex(IdLis
1e140 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20  t *pList, const 
1e150 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
1e160 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1e170 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d  st==0 ) return -
1e180 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
1e190 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
1e1a0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1e1b0 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
1e1c0 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  a[i].zName, zNam
1e1d0 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  e)==0 ) return i
1e1e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
1e1f0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61  1;.}../*.** Expa
1e200 6e 64 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c  nd the space all
1e210 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 67  ocated for the g
1e220 69 76 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a  iven SrcList obj
1e230 65 63 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69  ect by.** creati
1e240 6e 67 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c  ng nExtra new sl
1e250 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ots beginning at
1e260 20 69 53 74 61 72 74 2e 20 20 69 53 74 61 72 74   iStart.  iStart
1e270 20 69 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a   is zero based..
1e280 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65  ** New slots are
1e290 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46   zeroed..**.** F
1e2a0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70  or example, supp
1e2b0 6f 73 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e  ose a SrcList in
1e2c0 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73  itially contains
1e2d0 20 74 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c   two entries: A,
1e2e0 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20  B..** To append 
1e2f0 33 20 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e  3 new entries on
1e300 74 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74  to the end, do t
1e310 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71  his:.**.**    sq
1e320 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
1e330 72 67 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74  rge(db, pSrclist
1e340 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41  , 3, 2);.**.** A
1e350 66 74 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62  fter the call ab
1e360 6f 76 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e  ove it would con
1e370 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c  tain:  A, B, nil
1e380 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49  , nil, nil..** I
1e390 66 20 74 68 65 20 69 53 74 61 72 74 20 61 72 67  f the iStart arg
1e3a0 75 6d 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31  ument had been 1
1e3b0 20 69 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74   instead of 2, t
1e3c0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  hen the result.*
1e3d0 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  * would have bee
1e3e0 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  n:  A, nil, nil,
1e3f0 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65   nil, B.  To pre
1e400 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f  pend the new slo
1e410 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72  ts,.** the iStar
1e420 74 20 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65  t value would be
1e430 20 30 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20   0.  The result 
1e440 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65  then would.** be
1e450 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  : nil, nil, nil,
1e460 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   A, B..**.** If 
1e470 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
1e480 69 6f 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72  ion fails the Sr
1e490 63 4c 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67  cList is unchang
1e4a0 65 64 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e  ed.  The.** db->
1e4b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
1e4c0 67 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  g will be set to
1e4d0 20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73   true..*/.SrcLis
1e4e0 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
1e4f0 74 45 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69  tEnlarge(.  sqli
1e500 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f  te3 *db,       /
1e510 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
1e520 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
1e530 6f 66 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f  of OOM errors */
1e540 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1e550 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63  ,     /* The Src
1e560 4c 69 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72  List to be enlar
1e570 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ged */.  int nEx
1e580 74 72 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  tra,        /* N
1e590 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f  umber of new slo
1e5a0 74 73 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72  ts to add to pSr
1e5b0 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  c->a[] */.  int 
1e5c0 69 53 74 61 72 74 20 20 20 20 20 20 20 20 20 2f  iStart         /
1e5d0 2a 20 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d  * Index in pSrc-
1e5e0 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65  >a[] of first ne
1e5f0 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69  w slot */.){.  i
1e600 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69  nt i;..  /* Sani
1e610 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63  ty checking on c
1e620 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72  alling parameter
1e630 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
1e640 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73  Start>=0 );.  as
1e650 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20  sert( nExtra>=1 
1e660 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
1e670 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  c!=0 );.  assert
1e680 28 20 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e  ( iStart<=pSrc->
1e690 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  nSrc );..  /* Al
1e6a0 6c 6f 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61  locate additiona
1e6b0 6c 20 73 70 61 63 65 20 69 66 20 6e 65 65 64 65  l space if neede
1e6c0 64 20 2a 2f 0a 20 20 69 66 28 20 28 75 33 32 29  d */.  if( (u32)
1e6d0 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72  pSrc->nSrc+nExtr
1e6e0 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29  a>pSrc->nAlloc )
1e6f0 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  {.    SrcList *p
1e700 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c  New;.    int nAl
1e710 6c 6f 63 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63  loc = pSrc->nSrc
1e720 2a 32 2b 6e 45 78 74 72 61 3b 0a 20 20 20 20 69  *2+nExtra;.    i
1e730 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20 70 4e 65  nt nGot;.    pNe
1e740 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
1e750 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a 20  lloc(db, pSrc,. 
1e760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
1e770 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20 28 6e  zeof(*pSrc) + (n
1e780 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28  Alloc-1)*sizeof(
1e790 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  pSrc->a[0]) );. 
1e7a0 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1e7b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1e7c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1e7d0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1e7e0 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20   pSrc;.    }.   
1e7f0 20 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20   pSrc = pNew;.  
1e800 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c 69 74 65    nGot = (sqlite
1e810 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62  3DbMallocSize(db
1e820 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a 65 6f 66  , pNew) - sizeof
1e830 28 2a 70 53 72 63 29 29 2f 73 69 7a 65 6f 66 28  (*pSrc))/sizeof(
1e840 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20  pSrc->a[0])+1;. 
1e850 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20     pSrc->nAlloc 
1e860 3d 20 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f  = nGot;.  }..  /
1e870 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67 20  * Move existing 
1e880 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65 20  slots that come 
1e890 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79 20  after the newly 
1e8a0 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a 20  inserted slots. 
1e8b0 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 77   ** out of the w
1e8c0 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53  ay */.  for(i=pS
1e8d0 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69  rc->nSrc-1; i>=i
1e8e0 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20  Start; i--){.   
1e8f0 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72   pSrc->a[i+nExtr
1e900 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b  a] = pSrc->a[i];
1e910 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72  .  }.  pSrc->nSr
1e920 63 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a 20 20  c += nExtra;..  
1e930 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c  /* Zero the newl
1e940 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74  y allocated slot
1e950 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70  s */.  memset(&p
1e960 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20  Src->a[iStart], 
1e970 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  0, sizeof(pSrc->
1e980 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20  a[0])*nExtra);. 
1e990 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69   for(i=iStart; i
1e9a0 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20  <iStart+nExtra; 
1e9b0 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e  i++){.    pSrc->
1e9c0 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d  a[i].iCursor = -
1e9d0 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74  1;.  }..  /* Ret
1e9e0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1e9f0 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72   the enlarged Sr
1ea00 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72  cList */.  retur
1ea10 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n pSrc;.}.../*.*
1ea20 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74  * Append a new t
1ea30 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65  able name to the
1ea40 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20   given SrcList. 
1ea50 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72   Create a new Sr
1ea60 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  cList if.** need
1ea70 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72   be.  A new entr
1ea80 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  y is created in 
1ea90 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e  the SrcList even
1eaa0 20 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55   if pTable is NU
1eab0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c  LL..**.** A SrcL
1eac0 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
1ead0 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72   or NULL if ther
1eae0 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  e is an OOM erro
1eaf0 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64  r.  The returned
1eb00 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68  .** SrcList migh
1eb10 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
1eb20 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
1eb30 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69  t was input or i
1eb40 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20  t might be.** a 
1eb50 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20  new one.  If an 
1eb60 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f  OOM error does o
1eb70 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
1eb80 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70  prior value of p
1eb90 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20  List.** that is 
1eba0 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f  input to this ro
1ebb0 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74  utine is automat
1ebc0 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a  ically freed..**
1ebd0 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65  .** If pDatabase
1ebe0 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74   is not null, it
1ebf0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1ec00 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74  table has an opt
1ec10 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ional.** databas
1ec20 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20  e name prefix.  
1ec30 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74  Like this:  "dat
1ec40 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54  abase.table".  T
1ec50 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  he pDatabase.** 
1ec60 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61  points to the ta
1ec70 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
1ec80 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74   pTable points t
1ec90 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  o the database n
1eca0 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c  ame..** The SrcL
1ecb0 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69  ist.a[].zName fi
1ecc0 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69  eld is filled wi
1ecd0 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  th the table nam
1ece0 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a  e which might.**
1ecf0 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   come from pTabl
1ed00 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20  e (if pDatabase 
1ed10 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d  is NULL) or from
1ed20 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a   pDatabase.  .**
1ed30 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61   SrcList.a[].zDa
1ed40 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64  tabase is filled
1ed50 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
1ed60 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61  se name from pTa
1ed70 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20  ble,.** or with 
1ed80 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62  NULL if no datab
1ed90 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ase is specified
1eda0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ..**.** In other
1edb0 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20   words, if call 
1edc0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1edd0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ede0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
1edf0 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,0);.**.** Th
1ee00 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20  en B is a table 
1ee10 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
1ee20 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e  abase name is un
1ee30 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63  specified.  If c
1ee40 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68  alled.** like th
1ee50 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
1ee60 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1ee70 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b  Append(D,A,B,C);
1ee80 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73  .**.** Then C is
1ee90 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
1eea0 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74  and B is the dat
1eeb0 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20  abase name.  If 
1eec0 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20  C is defined.** 
1eed0 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49  then so is B.  I
1eee0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  n other words, w
1eef0 65 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 63  e never have a c
1ef00 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a  ase where:.**.**
1ef10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ef20 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
1ef30 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f  A,0,C);.**.** Bo
1ef40 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  th pTable and pD
1ef50 61 74 61 62 61 73 65 20 61 72 65 20 61 73 73 75  atabase are assu
1ef60 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64  med to be quoted
1ef70 2e 20 20 54 68 65 79 20 61 72 65 20 64 65 71 75  .  They are dequ
1ef80 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62  oted.** before b
1ef90 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68  eing added to th
1efa0 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72  e SrcList..*/.Sr
1efb0 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
1efc0 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73  cListAppend(.  s
1efd0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1efe0 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1eff0 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61   to notify of ma
1f000 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f  lloc failures */
1f010 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  .  SrcList *pLis
1f020 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  t,     /* Append
1f030 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74   to this SrcList
1f040 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61  . NULL creates a
1f050 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a   new SrcList */.
1f060 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
1f070 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
1f080 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f  o append */.  To
1f090 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20  ken *pDatabase  
1f0a0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66    /* Database of
1f0b0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b   the table */.){
1f0c0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1f0d0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1f0e0 20 61 73 73 65 72 74 28 20 70 44 61 74 61 62 61   assert( pDataba
1f0f0 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21  se==0 || pTable!
1f100 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74  =0 );  /* Cannot
1f110 20 68 61 76 65 20 43 20 77 69 74 68 6f 75 74 20   have C without 
1f120 42 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64  B */.  assert( d
1f130 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  b!=0 );.  if( pL
1f140 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
1f150 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
1f160 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
1f170 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
1f180 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
1f190 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1f1a0 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
1f1b0 20 3d 20 31 3b 0a 20 20 20 20 70 4c 69 73 74 2d   = 1;.    pList-
1f1c0 3e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 6d  >nSrc = 1;.    m
1f1d0 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b  emset(&pList->a[
1f1e0 30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c  0], 0, sizeof(pL
1f1f0 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
1f200 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75   pList->a[0].iCu
1f210 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c  rsor = -1;.  }el
1f220 73 65 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  se{.    pList = 
1f230 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
1f240 6c 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c  large(db, pList,
1f250 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29   1, pList->nSrc)
1f260 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
1f270 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1f280 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
1f290 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
1f2a0 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  st);.    return 
1f2b0 30 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  0;.  }.  pItem =
1f2c0 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
1f2d0 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28  ->nSrc-1];.  if(
1f2e0 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44   pDatabase && pD
1f2f0 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b  atabase->z==0 ){
1f300 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
1f310 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44   0;.  }.  if( pD
1f320 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 70  atabase ){.    p
1f330 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
1f340 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1f350 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73 65  en(db, pDatabase
1f360 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44  );.    pItem->zD
1f370 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
1f380 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1f390 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65  b, pTable);.  }e
1f3a0 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  lse{.    pItem->
1f3b0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
1f3c0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
1f3d0 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 49   pTable);.    pI
1f3e0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
1f3f0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1f400 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
1f410 20 41 73 73 69 67 6e 20 56 64 62 65 43 75 72 73   Assign VdbeCurs
1f420 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 73  or index numbers
1f430 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   to all tables i
1f440 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76  n a SrcList.*/.v
1f450 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
1f460 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
1f470 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1f480 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
1f490 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1f4a0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1f4b0 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  pItem;.  assert(
1f4c0 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d  pList || pParse-
1f4d0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1f4e0 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  d );.  if( pList
1f4f0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c   ){.    for(i=0,
1f500 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
1f510 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20   i<pList->nSrc; 
1f520 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
1f530 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1f540 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65  iCursor>=0 ) bre
1f550 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ak;.      pItem-
1f560 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  >iCursor = pPars
1f570 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
1f580 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
1f590 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
1f5a0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
1f5b0 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
1f5c0 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
1f5d0 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20  t->pSrc);.      
1f5e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
1f5f0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
1f600 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e  ntire SrcList in
1f610 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20  cluding all its 
1f620 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  substructure..*/
1f630 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
1f640 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
1f650 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20  e3 *db, SrcList 
1f660 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1f670 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1f680 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1f690 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1f6a0 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70   return;.  for(p
1f6b0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
1f6c0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
1f6d0 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
1f6e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
1f6f0 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
1f700 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73  Database);.    s
1f710 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1f720 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
1f730 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1f740 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  e(db, pItem->zAl
1f750 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ias);.    if( pI
1f760 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
1f770 64 42 79 20 29 20 73 71 6c 69 74 65 33 44 62 46  dBy ) sqlite3DbF
1f780 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75  ree(db, pItem->u
1f790 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20  1.zIndexedBy);. 
1f7a0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
1f7b0 2e 69 73 54 61 62 46 75 6e 63 20 29 20 73 71 6c  .isTabFunc ) sql
1f7c0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
1f7d0 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31  te(db, pItem->u1
1f7e0 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20 20 20 20  .pFuncArg);.    
1f7f0 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
1f800 6c 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54  le(db, pItem->pT
1f810 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ab);.    sqlite3
1f820 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1f830 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29   pItem->pSelect)
1f840 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1f850 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  rDelete(db, pIte
1f860 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c  m->pOn);.    sql
1f870 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
1f880 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69  (db, pItem->pUsi
1f890 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ng);.  }.  sqlit
1f8a0 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
1f8b0 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
1f8c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1f8d0 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
1f8e0 72 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65  rser to add a ne
1f8f0 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a  w term to the.**
1f900 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e   end of a growin
1f910 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  g FROM clause.  
1f920 54 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  The "p" paramete
1f930 72 20 69 73 20 74 68 65 20 70 61 72 74 20 6f 66  r is the part of
1f940 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
1f950 75 73 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  use that has alr
1f960 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72  eady been constr
1f970 75 63 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e  ucted.  "p" is N
1f980 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69  ULL.** if this i
1f990 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
1f9a0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1f9b0 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64  use.  pTable and
1f9c0 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72   pDatabase.** ar
1f9d0 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
1f9e0 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61  e table and data
1f9f0 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  base named in th
1fa00 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
1fa10 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  rm..** pDatabase
1fa20 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
1fa30 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75  database name qu
1fa40 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73 69  alifier is missi
1fa50 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61  ng - the.** usua
1fa60 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68 65 20  l case.  If the 
1fa70 74 65 72 6d 20 68 61 73 20 61 6e 20 61 6c 69 61  term has an alia
1fa80 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20 70  s, then pAlias p
1fa90 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
1faa0 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66  alias token.  If
1fab0 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20 73   the term is a s
1fac0 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70 53  ubquery, then pS
1fad0 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a 2a  ubquery is the.*
1fae0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
1faf0 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62 71  nt that the subq
1fb00 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20 54  uery encodes.  T
1fb10 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a  he pTable and.**
1fb20 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61 6d   pDatabase param
1fb30 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20 66  eters are NULL f
1fb40 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20 20  or subqueries.  
1fb50 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73 69  The pOn and pUsi
1fb60 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  ng.** parameters
1fb70 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74   are the content
1fb80 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20 55   of the ON and U
1fb90 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SING clauses..**
1fba0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65 77  .** Return a new
1fbb0 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20 65   SrcList which e
1fbc0 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46 52  ncodes is the FR
1fbd0 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a  OM with the new.
1fbe0 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a  ** term added..*
1fbf0 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
1fc00 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
1fc10 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73 65  romTerm(.  Parse
1fc20 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1fc30 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1fc40 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
1fc50 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  st *p,          
1fc60 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 70     /* The left p
1fc70 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  art of the FROM 
1fc80 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 73  clause already s
1fc90 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  een */.  Token *
1fca0 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  pTable,         
1fcb0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1fcc0 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f 20  table to add to 
1fcd0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1fce0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
1fcf0 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  abase,       /* 
1fd00 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
1fd10 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
1fd20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65  pTable */.  Toke
1fd30 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20 20  n *pAlias,      
1fd40 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
1fd50 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
1fd60 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73 69  e AS subexpressi
1fd70 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
1fd80 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20 20  pSubquery,      
1fd90 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75 73  /* A subquery us
1fda0 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
1fdb0 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   table name */. 
1fdc0 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20   Expr *pOn,     
1fdd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1fde0 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a  ON clause of a j
1fdf0 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  oin */.  IdList 
1fe00 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20 20  *pUsing         
1fe10 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c   /* The USING cl
1fe20 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a  ause of a join *
1fe30 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
1fe40 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1fe50 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
1fe60 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1fe70 20 69 66 28 20 21 70 20 26 26 20 28 70 4f 6e 20   if( !p && (pOn 
1fe80 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a 20 20  || pUsing) ){.  
1fe90 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1fea0 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a 4f 49  g(pParse, "a JOI
1feb0 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75  N clause is requ
1fec0 69 72 65 64 20 62 65 66 6f 72 65 20 25 73 22 2c  ired before %s",
1fed0 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f 20 22   .      (pOn ? "
1fee0 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29 0a 20  ON" : "USING"). 
1fef0 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61     );.    goto a
1ff00 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
1ff10 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
1ff20 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1ff30 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20  (db, p, pTable, 
1ff40 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  pDatabase);.  if
1ff50 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  ( p==0 ){.    go
1ff60 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  to append_from_e
1ff70 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rror;.  }.  asse
1ff80 72 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20 29 3b  rt( p->nSrc>0 );
1ff90 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61  .  pItem = &p->a
1ffa0 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61  [p->nSrc-1];.  a
1ffb0 73 73 65 72 74 28 20 70 41 6c 69 61 73 21 3d 30  ssert( pAlias!=0
1ffc0 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73   );.  if( pAlias
1ffd0 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d  ->n ){.    pItem
1ffe0 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
1fff0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
20000 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d  db, pAlias);.  }
20010 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  .  pItem->pSelec
20020 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20  t = pSubquery;. 
20030 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f   pItem->pOn = pO
20040 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69  n;.  pItem->pUsi
20050 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72  ng = pUsing;.  r
20060 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e  eturn p;.. appen
20070 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20  d_from_error:.  
20080 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
20090 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
200a0 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20  ete(db, pOn);.  
200b0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
200c0 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b  ete(db, pUsing);
200d0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
200e0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 71  Delete(db, pSubq
200f0 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20  uery);.  return 
20100 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
20110 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72  an INDEXED BY or
20120 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
20130 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74 20  use to the most 
20140 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 0a  recently added .
20150 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ** element of th
20160 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70 61  e source-list pa
20170 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
20180 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
20190 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
201a0 69 73 74 49 6e 64 65 78 65 64 42 79 28 50 61 72  istIndexedBy(Par
201b0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
201c0 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70  ist *p, Token *p
201d0 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 61 73  IndexedBy){.  as
201e0 73 65 72 74 28 20 70 49 6e 64 65 78 65 64 42 79  sert( pIndexedBy
201f0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 20 26  !=0 );.  if( p &
20200 26 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3e  & pIndexedBy->n>
20210 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
20220 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
20230 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  tem;.    assert(
20240 20 70 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20   p->nSrc>0 );.  
20250 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b    pItem = &p->a[
20260 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
20270 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
20280 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  g.notIndexed==0 
20290 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
202a0 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
202b0 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61  edBy==0 );.    a
202c0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
202d0 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b  .isTabFunc==0 );
202e0 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 65  .    if( pIndexe
202f0 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49  dBy->n==1 && !pI
20300 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20  ndexedBy->z ){. 
20310 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49       /* A "NOT I
20320 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65 20 77  NDEXED" clause w
20330 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65  as supplied. See
20340 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20   parse.y .      
20350 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e  ** construct "in
20360 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64  dexed_opt" for d
20370 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20  etails. */.     
20380 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e   pItem->fg.notIn
20390 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  dexed = 1;.    }
203a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
203b0 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
203c0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
203d0 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
203e0 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b  db, pIndexedBy);
203f0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
20400 2e 69 73 49 6e 64 65 78 65 64 42 79 20 3d 20 31  .isIndexedBy = 1
20410 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
20420 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 6c 69 73  *.** Add the lis
20430 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  t of function ar
20440 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 53  guments to the S
20450 72 63 4c 69 73 74 20 65 6e 74 72 79 20 66 6f 72  rcList entry for
20460 20 61 0a 2a 2a 20 74 61 62 6c 65 2d 76 61 6c 75   a.** table-valu
20470 65 64 2d 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ed-function..*/.
20480 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
20490 69 73 74 46 75 6e 63 41 72 67 73 28 50 61 72 73  istFuncArgs(Pars
204a0 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
204b0 73 74 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20  st *p, ExprList 
204c0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70  *pList){.  if( p
204d0 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53   ){.    struct S
204e0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
204f0 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53  em = &p->a[p->nS
20500 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  rc-1];.    asser
20510 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74  t( pItem->fg.not
20520 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20  Indexed==0 );.  
20530 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
20540 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 3d  >fg.isIndexedBy=
20550 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
20560 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61  ( pItem->fg.isTa
20570 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  bFunc==0 );.    
20580 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  pItem->u1.pFuncA
20590 72 67 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  rg = pList;.    
205a0 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pItem->fg.isTabF
205b0 75 6e 63 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  unc = 1;.  }else
205c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
205d0 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
205e0 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a  se->db, pList);.
205f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
20600 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20  n building up a 
20610 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
20620 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a  he parser, the j
20630 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  oin operator.** 
20640 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74  is initially att
20650 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
20660 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20  t operand.  But 
20670 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
20680 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68  or.** expects th
20690 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
206a0 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67  to be on the rig
206b0 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  ht operand.  Thi
206c0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69  s routine.** Shi
206d0 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65  fts all join ope
206e0 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74  rators from left
206f0 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e   to right for an
20700 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20   entire FROM.** 
20710 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78  clause..**.** Ex
20720 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74  ample: Suppose t
20730 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20  he join is like 
20740 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
20750 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20        A natural 
20760 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a  cross join B.**.
20770 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  ** The operator 
20780 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73  is "natural cros
20790 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20  s join".  The A 
207a0 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61  and B operands a
207b0 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  re stored.** in 
207c0 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61  p->a[0] and p->a
207d0 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c  [1], respectivel
207e0 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  y.  The parser i
207f0 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20  nitially stores 
20800 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20  the.** operator 
20810 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f  with A.  This ro
20820 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68 61  utine shifts tha
20830 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20  t operator over 
20840 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  to B..*/.void sq
20850 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66  lite3SrcListShif
20860 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73  tJoinType(SrcLis
20870 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  t *p){.  if( p )
20880 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
20890 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31   for(i=p->nSrc-1
208a0 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20  ; i>0; i--){.   
208b0 20 20 20 70 2d 3e 61 5b 69 5d 2e 66 67 2e 6a 6f     p->a[i].fg.jo
208c0 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d  intype = p->a[i-
208d0 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a  1].fg.jointype;.
208e0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30      }.    p->a[0
208f0 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  ].fg.jointype = 
20900 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
20910 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
20920 64 65 20 66 6f 72 20 61 20 42 45 47 49 4e 20 73  de for a BEGIN s
20930 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
20940 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72  d sqlite3BeginTr
20950 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
20960 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70  *pParse, int typ
20970 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
20980 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
20990 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74  int i;..  assert
209a0 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
209b0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
209c0 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
209d0 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
209e0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
209f0 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
20a00 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c  ACTION, "BEGIN",
20a10 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65   0, 0) ){.    re
20a20 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  turn;.  }.  v = 
20a30 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
20a40 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76  Parse);.  if( !v
20a50 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
20a60 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52   type!=TK_DEFERR
20a70 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ED ){.    for(i=
20a80 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
20a90 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
20aa0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20ab0 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
20ac0 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c  , (type==TK_EXCL
20ad0 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20  USIVE)+1);.     
20ae0 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
20af0 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20  Btree(v, i);.   
20b00 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
20b10 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
20b20 5f 41 75 74 6f 43 6f 6d 6d 69 74 29 3b 0a 7d 0a  _AutoCommit);.}.
20b30 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
20b40 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20  VDBE code for a 
20b50 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41  COMMIT or ROLLBA
20b60 43 4b 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CK statement..**
20b70 20 43 6f 64 65 20 66 6f 72 20 52 4f 4c 4c 42 41   Code for ROLLBA
20b80 43 4b 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  CK is generated 
20b90 69 66 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c  if eType==TK_ROL
20ba0 4c 42 41 43 4b 2e 20 20 4f 74 68 65 72 77 69 73  LBACK.  Otherwis
20bb0 65 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65 6e  e.** code is gen
20bc0 65 72 61 74 65 64 20 66 6f 72 20 61 20 43 4f 4d  erated for a COM
20bd0 4d 49 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  MIT..*/.void sql
20be0 69 74 65 33 45 6e 64 54 72 61 6e 73 61 63 74 69  ite3EndTransacti
20bf0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
20c00 2c 20 69 6e 74 20 65 54 79 70 65 29 7b 0a 20 20  , int eType){.  
20c10 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
20c20 73 52 6f 6c 6c 62 61 63 6b 3b 0a 0a 20 20 61 73  sRollback;..  as
20c30 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
20c40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20c50 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  rse->db!=0 );.  
20c60 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 54  assert( eType==T
20c70 4b 5f 43 4f 4d 4d 49 54 20 7c 7c 20 65 54 79 70  K_COMMIT || eTyp
20c80 65 3d 3d 54 4b 5f 45 4e 44 20 7c 7c 20 65 54 79  e==TK_END || eTy
20c90 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 20  pe==TK_ROLLBACK 
20ca0 29 3b 0a 20 20 69 73 52 6f 6c 6c 62 61 63 6b 20  );.  isRollback 
20cb0 3d 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c  = eType==TK_ROLL
20cc0 42 41 43 4b 3b 0a 20 20 69 66 28 20 73 71 6c 69  BACK;.  if( sqli
20cd0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
20ce0 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
20cf0 53 41 43 54 49 4f 4e 2c 20 0a 20 20 20 20 20 20  SACTION, .      
20d00 20 69 73 52 6f 6c 6c 62 61 63 6b 20 3f 20 22 52   isRollback ? "R
20d10 4f 4c 4c 42 41 43 4b 22 20 3a 20 22 43 4f 4d 4d  OLLBACK" : "COMM
20d20 49 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  IT", 0, 0) ){.  
20d30 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
20d40 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
20d50 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
20d60 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
20d70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20d80 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
20d90 2c 20 69 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20  , isRollback);. 
20da0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
20db0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
20dc0 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
20dd0 72 20 77 68 65 6e 20 69 74 20 70 61 72 73 65 73  r when it parses
20de0 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72   a command to cr
20df0 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65  eate,.** release
20e00 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20   or rollback an 
20e10 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a  SQL savepoint. .
20e20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
20e30 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20 2a  avepoint(Parse *
20e40 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20  pParse, int op, 
20e50 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
20e60 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73   char *zName = s
20e70 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
20e80 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
20e90 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
20ea0 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ame ){.    Vdbe 
20eb0 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
20ec0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69 66  dbe(pParse);.#if
20ed0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20ee0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
20ef0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
20f00 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b  char * const az[
20f10 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22  ] = { "BEGIN", "
20f20 52 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42  RELEASE", "ROLLB
20f30 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65  ACK" };.    asse
20f40 72 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42  rt( !SAVEPOINT_B
20f50 45 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e  EGIN && SAVEPOIN
20f60 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20  T_RELEASE==1 && 
20f70 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
20f80 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a  CK==2 );.#endif.
20f90 20 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71      if( !v || sq
20fa0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
20fb0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41  Parse, SQLITE_SA
20fc0 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c  VEPOINT, az[op],
20fd0 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20   zName, 0) ){.  
20fe0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
20ff0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e  e(pParse->db, zN
21000 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
21010 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rn;.    }.    sq
21020 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
21030 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c  v, OP_Savepoint,
21040 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65   op, 0, 0, zName
21050 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
21060 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
21070 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64   sure the TEMP d
21080 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20  atabase is open 
21090 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  and available fo
210a0 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a  r use.  Return.*
210b0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
210c0 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61  errors.  Leave a
210d0 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
210e0 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  s in the pParse 
210f0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
21100 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d  t sqlite3OpenTem
21110 70 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20  pDatabase(Parse 
21120 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
21130 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
21140 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ->db;.  if( db->
21150 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26  aDb[1].pBt==0 &&
21160 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
21170 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  n ){.    int rc;
21180 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b  .    Btree *pBt;
21190 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
211a0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20  t int flags = . 
211b0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
211c0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
211d0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
211e0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
211f0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
21200 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
21210 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
21220 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
21230 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20  CLOSE |.        
21240 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
21250 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d  MP_DB;..    rc =
21260 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
21270 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64  n(db->pVfs, 0, d
21280 62 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c 61 67  b, &pBt, 0, flag
21290 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
212a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
212b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
212c0 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
212d0 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  le to open a tem
212e0 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
212f0 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20  ".        "file 
21300 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70  for storing temp
21310 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a  orary tables");.
21320 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
21330 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
21340 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
21350 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20   db->aDb[1].pBt 
21360 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  = pBt;.    asser
21370 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  t( db->aDb[1].pS
21380 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28  chema );.    if(
21390 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73   SQLITE_NOMEM==s
213a0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
213b0 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e  geSize(pBt, db->
213c0 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d 31  nextPagesize, -1
213d0 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  , 0) ){.      sq
213e0 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
213f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
21400 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
21410 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
21420 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63  * Record the fac
21430 74 20 74 68 61 74 20 74 68 65 20 73 63 68 65 6d  t that the schem
21440 61 20 63 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e 65  a cookie will ne
21450 65 64 20 74 6f 20 62 65 20 76 65 72 69 66 69 65  ed to be verifie
21460 64 0a 2a 2a 20 66 6f 72 20 64 61 74 61 62 61 73  d.** for databas
21470 65 20 69 44 62 2e 20 20 54 68 65 20 63 6f 64 65  e iDb.  The code
21480 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 76 65 72   to actually ver
21490 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
214a0 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63  ookie.** will oc
214b0 63 75 72 20 61 74 20 74 68 65 20 65 6e 64 20 6f  cur at the end o
214c0 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
214d0 56 44 42 45 20 61 6e 64 20 77 69 6c 6c 20 62 65  VDBE and will be
214e0 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 6c 61   generated.** la
214f0 74 65 72 2c 20 62 79 20 73 71 6c 69 74 65 33 46  ter, by sqlite3F
21500 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a  inishCoding()..*
21510 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
21520 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50  deVerifySchema(P
21530 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
21540 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20  t iDb){.  Parse 
21550 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
21560 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
21570 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 61 73  l(pParse);..  as
21580 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
21590 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e  iDb<pParse->db->
215a0 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
215b0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
215c0 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20  [iDb].pBt!=0 || 
215d0 69 44 62 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  iDb==1 );.  asse
215e0 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d  rt( iDb<SQLITE_M
215f0 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b  AX_ATTACHED+2 );
21600 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
21610 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
21620 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 69 44  d(pParse->db, iD
21630 62 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 44  b, 0) );.  if( D
21640 62 4d 61 73 6b 54 65 73 74 28 70 54 6f 70 6c 65  bMaskTest(pTople
21650 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c  vel->cookieMask,
21660 20 69 44 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20   iDb)==0 ){.    
21670 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65  DbMaskSet(pTople
21680 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c  vel->cookieMask,
21690 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21   iDb);.    if( !
216a0 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
216b0 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  Db==1 ){.      s
216c0 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
216d0 74 61 62 61 73 65 28 70 54 6f 70 6c 65 76 65 6c  tabase(pToplevel
216e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
216f0 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  /*.** If argumen
21700 74 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74  t zDb is NULL, t
21710 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  hen call sqlite3
21720 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
21730 28 29 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20  () for each .** 
21740 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
21750 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 6e  e. Otherwise, in
21760 76 6f 6b 65 20 69 74 20 66 6f 72 20 74 68 65 20  voke it for the 
21770 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 7a  database named z
21780 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  Db only..*/.void
21790 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
217a0 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 50 61  fyNamedSchema(Pa
217b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
217c0 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
217d0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
217e0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
217f0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
21800 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
21810 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
21820 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
21830 66 28 20 70 44 62 2d 3e 70 42 74 20 26 26 20 28  f( pDb->pBt && (
21840 21 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74  !zDb || 0==sqlit
21850 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 70  e3StrICmp(zDb, p
21860 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 29 20 29  Db->zDbSName)) )
21870 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
21880 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
21890 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20  pParse, i);.    
218a0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
218b0 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
218c0 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20  e that prepares 
218d0 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65  for doing an ope
218e0 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d  ration that.** m
218f0 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20  ight change the 
21900 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
21910 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61  This routine sta
21920 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61  rts a new transa
21930 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20  ction if we are 
21940 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68  not already with
21950 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  in.** a transact
21960 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20  ion.  If we are 
21970 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61  already within a
21980 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
21990 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a  en a checkpoint.
219a0 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65  ** is set if the
219b0 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61   setStatement pa
219c0 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e  rameter is true.
219d0 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73    A checkpoint s
219e0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20  hould.** be set 
219f0 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  for operations t
21a00 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28  hat might fail (
21a10 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61  due to a constra
21a20 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20  int) part of.** 
21a30 74 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20  the way through 
21a40 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e  and which will n
21a50 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65  eed to undo some
21a60 20 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20   writes without 
21a70 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c  having to.** rol
21a80 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20  lback the whole 
21a90 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f  transaction.  Fo
21aa0 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65  r operations whe
21ab0 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  re all constrain
21ac0 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65  ts.** can be che
21ad0 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  cked before any 
21ae0 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
21af0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
21b00 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a  , it is never.**
21b10 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e   necessary to un
21b20 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74  do a write and t
21b30 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68  he checkpoint sh
21b40 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e  ould not be set.
21b50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21b60 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
21b70 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
21b80 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d  e, int setStatem
21b90 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  ent, int iDb){. 
21ba0 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
21bb0 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
21bc0 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
21bd0 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  ;.  sqlite3CodeV
21be0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
21bf0 73 65 2c 20 69 44 62 29 3b 0a 20 20 44 62 4d 61  se, iDb);.  DbMa
21c00 73 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d  skSet(pToplevel-
21c10 3e 77 72 69 74 65 4d 61 73 6b 2c 20 69 44 62 29  >writeMask, iDb)
21c20 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69  ;.  pToplevel->i
21c30 73 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d 20 73  sMultiWrite |= s
21c40 65 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a  etStatement;.}..
21c50 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74  /*.** Indicate t
21c60 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
21c70 74 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  t currently unde
21c80 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d  r construction m
21c90 69 67 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f  ight write.** mo
21ca0 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72  re than one entr
21cb0 79 20 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65  y (example: dele
21cc0 74 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68 65  ting one row the
21cd0 6e 20 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74  n inserting anot
21ce0 68 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e  her,.** insertin
21cf0 67 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  g multiple rows 
21d00 69 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72 20 69  in a table, or i
21d10 6e 73 65 72 74 69 6e 67 20 61 20 72 6f 77 20 61  nserting a row a
21d20 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  nd index entries
21d30 2e 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72  .).** If an abor
21d40 74 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 73  t occurs after s
21d50 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 77 72 69  ome of these wri
21d60 74 65 73 20 68 61 76 65 20 63 6f 6d 70 6c 65 74  tes have complet
21d70 65 64 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  ed, then it will
21d80 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79  .** be necessary
21d90 20 74 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d   to undo the com
21da0 70 6c 65 74 65 64 20 77 72 69 74 65 73 2e 0a 2a  pleted writes..*
21db0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 75  /.void sqlite3Mu
21dc0 6c 74 69 57 72 69 74 65 28 50 61 72 73 65 20 2a  ltiWrite(Parse *
21dd0 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65  pParse){.  Parse
21de0 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
21df0 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
21e00 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54  el(pParse);.  pT
21e10 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69  oplevel->isMulti
21e20 57 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  Write = 1;.}../*
21e30 20 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65   .** The code ge
21e40 6e 65 72 61 74 6f 72 20 63 61 6c 6c 73 20 74 68  nerator calls th
21e50 69 73 20 72 6f 75 74 69 6e 65 20 69 66 20 69 73  is routine if is
21e60 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20   discovers that 
21e70 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c  it is.** possibl
21e80 65 20 74 6f 20 61 62 6f 72 74 20 61 20 73 74 61  e to abort a sta
21e90 74 65 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f 20  tement prior to 
21ea0 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20  completion.  In 
21eb0 6f 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72  order to .** per
21ec0 66 6f 72 6d 20 74 68 69 73 20 61 62 6f 72 74 20  form this abort 
21ed0 77 69 74 68 6f 75 74 20 63 6f 72 72 75 70 74 69  without corrupti
21ee0 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ng the database,
21ef0 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65   we need to make
21f00 0a 2a 2a 20 73 75 72 65 20 74 68 61 74 20 74 68  .** sure that th
21f10 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  e statement is p
21f20 72 6f 74 65 63 74 65 64 20 62 79 20 61 20 73 74  rotected by a st
21f30 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
21f40 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e  ion..**.** Techn
21f50 69 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20  ically, we only 
21f60 6e 65 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  need to set the 
21f70 6d 61 79 41 62 6f 72 74 20 66 6c 61 67 20 69 66  mayAbort flag if
21f80 20 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57   the.** isMultiW
21f90 72 69 74 65 20 66 6c 61 67 20 77 61 73 20 70 72  rite flag was pr
21fa0 65 76 69 6f 75 73 6c 79 20 73 65 74 2e 20 20 54  eviously set.  T
21fb0 68 65 72 65 20 69 73 20 61 20 74 69 6d 65 20 64  here is a time d
21fc0 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63  ependency.** suc
21fd0 68 20 74 68 61 74 20 74 68 65 20 61 62 6f 72 74  h that the abort
21fe0 20 6d 75 73 74 20 6f 63 63 75 72 20 61 66 74 65   must occur afte
21ff0 72 20 74 68 65 20 6d 75 6c 74 69 77 72 69 74 65  r the multiwrite
22000 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a  .  This makes.**
22010 20 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74 73   some statements
22020 20 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20 52   involving the R
22030 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20  EPLACE conflict 
22040 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
22050 69 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74  ithm.** go a lit
22060 74 6c 65 20 66 61 73 74 65 72 2e 20 20 42 75 74  tle faster.  But
22070 20 74 61 6b 69 6e 67 20 61 64 76 61 6e 74 61 67   taking advantag
22080 65 20 6f 66 20 74 68 69 73 20 74 69 6d 65 20 64  e of this time d
22090 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b  ependency.** mak
220a0 65 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66 69  es it more diffi
220b0 63 75 6c 74 20 74 6f 20 70 72 6f 76 65 20 74 68  cult to prove th
220c0 61 74 20 74 68 65 20 63 6f 64 65 20 69 73 20 63  at the code is c
220d0 6f 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70  orrect (in .** p
220e0 61 72 74 69 63 75 6c 61 72 2c 20 69 74 20 70 72  articular, it pr
220f0 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 77  events us from w
22100 72 69 74 69 6e 67 20 61 6e 20 65 66 66 65 63 74  riting an effect
22110 69 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ive.** implement
22120 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  ation of sqlite3
22130 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29  AssertMayAbort()
22140 29 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65  ) and so we have
22150 20 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61   chosen.** to ta
22160 6b 65 20 74 68 65 20 73 61 66 65 20 72 6f 75 74  ke the safe rout
22170 65 20 61 6e 64 20 73 6b 69 70 20 74 68 65 20 6f  e and skip the o
22180 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a  ptimization..*/.
22190 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 79 41  void sqlite3MayA
221a0 62 6f 72 74 28 50 61 72 73 65 20 2a 70 50 61 72  bort(Parse *pPar
221b0 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  se){.  Parse *pT
221c0 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
221d0 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
221e0 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65  Parse);.  pTople
221f0 76 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20  vel->mayAbort = 
22200 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  1;.}../*.** Code
22210 20 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61 74   an OP_Halt that
22220 20 63 61 75 73 65 73 20 74 68 65 20 76 64 62 65   causes the vdbe
22230 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 53 51   to return an SQ
22240 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a  LITE_CONSTRAINT.
22250 2a 2a 20 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e  ** error. The on
22260 45 72 72 6f 72 20 70 61 72 61 6d 65 74 65 72 20  Error parameter 
22270 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
22280 20 28 69 66 20 61 6e 79 29 20 6f 66 20 74 68 65   (if any) of the
22290 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e   statement.** an
222a0 64 2f 6f 72 20 63 75 72 72 65 6e 74 20 74 72 61  d/or current tra
222b0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
222c0 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64  ed back..*/.void
222d0 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73   sqlite3HaltCons
222e0 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
222f0 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
22300 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
22310 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 2c  /.  int errCode,
22320 20 20 20 20 20 20 2f 2a 20 65 78 74 65 6e 64 65        /* extende
22330 64 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  d error code */.
22340 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
22350 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e      /* Constrain
22360 74 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72  t type */.  char
22370 20 2a 70 34 2c 20 20 20 20 20 20 20 20 20 2f 2a   *p4,         /*
22380 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a   Error message *
22390 2f 0a 20 20 69 38 20 70 34 74 79 70 65 2c 20 20  /.  i8 p4type,  
223a0 20 20 20 20 20 20 2f 2a 20 50 34 5f 53 54 41 54        /* P4_STAT
223b0 49 43 20 6f 72 20 50 34 5f 54 52 41 4e 53 49 45  IC or P4_TRANSIE
223c0 4e 54 20 2a 2f 0a 20 20 75 38 20 70 35 45 72 72  NT */.  u8 p5Err
223d0 6d 73 67 20 20 20 20 20 20 20 2f 2a 20 50 35 5f  msg       /* P5_
223e0 45 72 72 4d 73 67 20 74 79 70 65 20 2a 2f 0a 29  ErrMsg type */.)
223f0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
22400 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
22410 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
22420 28 65 72 72 43 6f 64 65 26 30 78 66 66 29 3d 3d  (errCode&0xff)==
22430 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
22440 54 20 29 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72  T );.  if( onErr
22450 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  or==OE_Abort ){.
22460 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
22470 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ort(pParse);.  }
22480 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
22490 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  dOp4(v, OP_Halt,
224a0 20 65 72 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f   errCode, onErro
224b0 72 2c 20 30 2c 20 70 34 2c 20 70 34 74 79 70 65  r, 0, p4, p4type
224c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
224d0 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 45 72  ChangeP5(v, p5Er
224e0 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rmsg);.}../*.** 
224f0 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20  Code an OP_Halt 
22500 64 75 65 20 74 6f 20 55 4e 49 51 55 45 20 6f 72  due to UNIQUE or
22510 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
22520 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f  straint violatio
22530 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
22540 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69  e3UniqueConstrai
22550 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
22560 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
22570 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
22580 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
22590 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20    /* Constraint 
225a0 74 79 70 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  type */.  Index 
225b0 2a 70 49 64 78 20 20 20 20 20 20 20 2f 2a 20 54  *pIdx       /* T
225c0 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 74 72  he index that tr
225d0 69 67 67 65 72 73 20 74 68 65 20 63 6f 6e 73 74  iggers the const
225e0 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68  raint */.){.  ch
225f0 61 72 20 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20  ar *zErr;.  int 
22600 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 65 72  j;.  StrAccum er
22610 72 4d 73 67 3b 0a 20 20 54 61 62 6c 65 20 2a 70  rMsg;.  Table *p
22620 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  Tab = pIdx->pTab
22630 6c 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53 74  le;..  sqlite3St
22640 72 41 63 63 75 6d 49 6e 69 74 28 26 65 72 72 4d  rAccumInit(&errM
22650 73 67 2c 20 70 50 61 72 73 65 2d 3e 64 62 2c 20  sg, pParse->db, 
22660 30 2c 20 30 2c 20 32 30 30 29 3b 0a 20 20 69 66  0, 0, 200);.  if
22670 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72  ( pIdx->aColExpr
22680 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58   ){.    sqlite3X
22690 50 72 69 6e 74 66 28 26 65 72 72 4d 73 67 2c 20  Printf(&errMsg, 
226a0 22 69 6e 64 65 78 20 27 25 71 27 22 2c 20 70 49  "index '%q'", pI
226b0 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  dx->zName);.  }e
226c0 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  lse{.    for(j=0
226d0 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; j<pIdx->nKeyCo
226e0 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; j++){.      c
226f0 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20  har *zCol;.     
22700 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
22710 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b  iColumn[j]>=0 );
22720 0a 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54  .      zCol = pT
22730 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61  ab->aCol[pIdx->a
22740 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d  iColumn[j]].zNam
22750 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 20 29  e;.      if( j )
22760 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
22770 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20  Append(&errMsg, 
22780 22 2c 20 22 2c 20 32 29 3b 0a 20 20 20 20 20 20  ", ", 2);.      
22790 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
227a0 70 70 65 6e 64 41 6c 6c 28 26 65 72 72 4d 73 67  ppendAll(&errMsg
227b0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
227c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
227d0 41 63 63 75 6d 41 70 70 65 6e 64 28 26 65 72 72  AccumAppend(&err
227e0 4d 73 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20  Msg, ".", 1);.  
227f0 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
22800 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 65 72  cumAppendAll(&er
22810 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  rMsg, zCol);.   
22820 20 7d 0a 20 20 7d 0a 20 20 7a 45 72 72 20 3d 20   }.  }.  zErr = 
22830 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
22840 69 6e 69 73 68 28 26 65 72 72 4d 73 67 29 3b 0a  inish(&errMsg);.
22850 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
22860 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
22870 0a 20 20 20 20 49 73 50 72 69 6d 61 72 79 4b 65  .    IsPrimaryKe
22880 79 49 6e 64 65 78 28 70 49 64 78 29 20 3f 20 53  yIndex(pIdx) ? S
22890 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
228a0 5f 50 52 49 4d 41 52 59 4b 45 59 20 0a 20 20 20  _PRIMARYKEY .   
228b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228c0 20 20 20 20 20 20 20 20 20 3a 20 53 51 4c 49 54           : SQLIT
228d0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49  E_CONSTRAINT_UNI
228e0 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72 72 6f 72  QUE,.    onError
228f0 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d  , zErr, P4_DYNAM
22900 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e  IC, P5_Constrain
22910 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a  tUnique);.}.../*
22920 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48  .** Code an OP_H
22930 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f 6e 2d 75  alt due to non-u
22940 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a  nique rowid..*/.
22950 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 77 69  void sqlite3Rowi
22960 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  dConstraint(.  P
22970 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
22980 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
22990 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  ext */.  int onE
229a0 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f  rror,      /* Co
229b0 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
229c0 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20  n algorithm */. 
229d0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 20 20 20   Table *pTab    
229e0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
229f0 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d 75 6e 69  with the non-uni
22a00 71 75 65 20 72 6f 77 69 64 20 2a 2f 20 0a 29 7b  que rowid */ .){
22a10 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20  .  char *zMsg;. 
22a20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
22a30 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b  Tab->iPKey>=0 ){
22a40 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
22a50 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
22a60 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  e->db, "%s.%s", 
22a70 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
22a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a90 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f         pTab->aCo
22aa0 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a  l[pTab->iPKey].z
22ab0 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Name);.    rc = 
22ac0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
22ad0 54 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20  T_PRIMARYKEY;.  
22ae0 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d 73 67 20  }else{.    zMsg 
22af0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
22b00 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73  (pParse->db, "%s
22b10 2e 72 6f 77 69 64 22 2c 20 70 54 61 62 2d 3e 7a  .rowid", pTab->z
22b20 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Name);.    rc = 
22b30 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
22b40 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20 73  T_ROWID;.  }.  s
22b50 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
22b60 61 69 6e 74 28 70 50 61 72 73 65 2c 20 72 63 2c  aint(pParse, rc,
22b70 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73 67 2c 20   onError, zMsg, 
22b80 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20 20 20 20  P4_DYNAMIC,.    
22b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ba0 20 20 20 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e      P5_Constrain
22bb0 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a  tUnique);.}../*.
22bc0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
22bd0 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20 74  if pIndex uses t
22be0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
22bf0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65  uence pColl.  Re
22c00 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
22c10 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73  it does and fals
22c20 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  e if it does not
22c30 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
22c40 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
22c50 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c  .static int coll
22c60 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74  ationMatch(const
22c70 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e   char *zColl, In
22c80 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20  dex *pIndex){.  
22c90 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
22ca0 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66   zColl!=0 );.  f
22cb0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78  or(i=0; i<pIndex
22cc0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
22cd0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
22ce0 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43  *z = pIndex->azC
22cf0 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  oll[i];.    asse
22d00 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70 49 6e 64  rt( z!=0 || pInd
22d10 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c  ex->aiColumn[i]<
22d20 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
22d30 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
22d40 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  >=0 && 0==sqlite
22d50 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c  3StrICmp(z, zCol
22d60 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  l) ){.      retu
22d70 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
22d80 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
22d90 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ndif../*.** Reco
22da0 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
22db0 73 20 6f 66 20 70 54 61 62 20 74 68 61 74 20 75  s of pTab that u
22dc0 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  se the collating
22dd0 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
22de0 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20  .** If pColl==0 
22df0 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61  then recompute a
22e00 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54  ll indices of pT
22e10 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ab..*/.#ifndef S
22e20 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
22e30 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  EX.static void r
22e40 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73  eindexTable(Pars
22e50 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
22e60 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e   *pTab, char con
22e70 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e  st *zColl){.  In
22e80 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
22e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
22ea0 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
22eb0 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20   with pTab */.. 
22ec0 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62   for(pIndex=pTab
22ed0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ->pIndex; pIndex
22ee0 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d  ; pIndex=pIndex-
22ef0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
22f00 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c   zColl==0 || col
22f10 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c  lationMatch(zCol
22f20 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  l, pIndex) ){.  
22f30 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
22f40 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
22f50 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
22f60 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
22f70 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
22f80 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
22f90 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
22fa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
22fb0 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
22fc0 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20  , pIndex, -1);. 
22fd0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
22fe0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
22ff0 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
23000 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  f all tables in 
23010 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 68  all databases wh
23020 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63  ere the.** indic
23030 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61  es use the colla
23040 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
23050 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d  oll.  If pColl==
23060 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65  0 then recompute
23070 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  .** all indices 
23080 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23  everywhere..*/.#
23090 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
230a0 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
230b0 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61  c void reindexDa
230c0 74 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70  tabases(Parse *p
230d0 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73  Parse, char cons
230e0 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20  t *zColl){.  Db 
230f0 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
23100 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
23110 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f  ngle database */
23120 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
23130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23140 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69  * The database i
23150 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
23160 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
23170 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
23180 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
23190 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73  nection */.  Has
231a0 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20  hElem *k;       
231b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
231c0 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62  looping over tab
231d0 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20  les in pDb */.  
231e0 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
231f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
23200 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
23210 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  tabase */..  ass
23220 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
23230 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
23240 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64  (db) );  /* Need
23250 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63  ed for schema ac
23260 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44  cess */.  for(iD
23270 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62  b=0, pDb=db->aDb
23280 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
23290 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20  Db++, pDb++){.  
232a0 20 20 61 73 73 65 72 74 28 20 70 44 62 21 3d 30    assert( pDb!=0
232b0 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71   );.    for(k=sq
232c0 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
232d0 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
232e0 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c  Hash);  k; k=sql
232f0 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b  iteHashNext(k)){
23300 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54  .      pTab = (T
23310 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  able*)sqliteHash
23320 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72  Data(k);.      r
23330 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
23340 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29  se, pTab, zColl)
23350 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
23360 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
23370 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
23380 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  e REINDEX comman
23390 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  d..**.**        
233a0 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20  REINDEX         
233b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233c0 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20     -- 1.**      
233d0 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c    REINDEX  <coll
233e0 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20  ation>          
233f0 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20       -- 2.**    
23400 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
23410 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65  atabase>.?<table
23420 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20  name>  -- 3.**  
23430 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
23440 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64  <database>.?<ind
23450 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a  exname>  -- 4.**
23460 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65  .** Form 1 cause
23470 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
23480 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
23490 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 65  tabases to be re
234a0 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32  built..** Form 2
234b0 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e   rebuilds all in
234c0 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  dices in all dat
234d0 61 62 61 73 65 73 20 74 68 61 74 20 75 73 65 20  abases that use 
234e0 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c  the named.** col
234f0 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  lating function.
23500 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20    Forms 3 and 4 
23510 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65  rebuild the name
23520 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a  d index or all.*
23530 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  * indices associ
23540 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
23550 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69  med table..*/.#i
23560 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23570 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73  T_REINDEX.void s
23580 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 61  qlite3Reindex(Pa
23590 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
235a0 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65  en *pName1, Toke
235b0 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f  n *pName2){.  Co
235c0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
235d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
235e0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
235f0 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c  to be reindexed,
23600 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68   or NULL */.  ch
23610 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
23620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
23630 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
23640 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74  index */.  const
23650 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20   char *zDb;     
23660 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
23670 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
23680 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
23690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236a0 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
236b0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
236c0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
236d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
236e0 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  n index associat
236f0 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a  ed with pTab */.
23700 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
23710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23720 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
23730 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
23740 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
23750 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
23760 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
23770 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ection */.  Toke
23780 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20  n *pObjName;    
23790 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
237a0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
237b0 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e  index to be rein
237c0 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52  dexed */..  /* R
237d0 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
237e0 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
237f0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
23800 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
23810 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
23820 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
23830 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
23840 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
23850 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
23860 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
23870 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
23880 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29   if( pName1==0 )
23890 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74  {.    reindexDat
238a0 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30  abases(pParse, 0
238b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
238c0 20 7d 65 6c 73 65 20 69 66 28 20 4e 45 56 45 52   }else if( NEVER
238d0 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70  (pName2==0) || p
238e0 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  Name2->z==0 ){. 
238f0 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a     char *zColl;.
23900 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
23910 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f  e1->z );.    zCo
23920 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ll = sqlite3Name
23930 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
23940 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20  ->db, pName1);. 
23950 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20     if( !zColl ) 
23960 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c  return;.    pCol
23970 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
23980 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
23990 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20  b), zColl, 0);. 
239a0 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
239b0 20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74        reindexDat
239c0 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a  abases(pParse, z
239d0 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Coll);.      sql
239e0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
239f0 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74  Coll);.      ret
23a00 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  urn;.    }.    s
23a10 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
23a20 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69   zColl);.  }.  i
23a30 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
23a40 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
23a50 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
23a60 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66  &pObjName);.  if
23a70 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
23a80 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e  ;.  z = sqlite3N
23a90 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
23aa0 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66   pObjName);.  if
23ab0 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
23ac0 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  zDb = db->aDb
23ad0 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
23ae0 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
23af0 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c  FindTable(db, z,
23b00 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61   zDb);.  if( pTa
23b10 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78  b ){.    reindex
23b20 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
23b30 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ab, 0);.    sqli
23b40 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
23b50 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
23b60 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
23b70 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
23b80 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c  , z, zDb);.  sql
23b90 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
23ba0 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  );.  if( pIndex 
23bb0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
23bc0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
23bd0 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
23be0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
23bf0 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
23c00 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20  , pIndex, -1);. 
23c10 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
23c20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
23c30 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
23c40 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65   to identify the
23c50 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65   object to be re
23c60 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e  indexed");.}.#en
23c70 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
23c80 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  n a KeyInfo stru
23c90 63 74 75 72 65 20 74 68 61 74 20 69 73 20 61 70  cture that is ap
23ca0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
23cb0 65 20 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a  e given Index..*
23cc0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
23cd0 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71  should invoke sq
23ce0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
23cf0 66 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72  f() on the retur
23d00 6e 65 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 68  ned object.** wh
23d10 65 6e 20 69 74 20 68 61 73 20 66 69 6e 69 73 68  en it has finish
23d20 65 64 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a  ed using it..*/.
23d30 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
23d40 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 50  KeyInfoOfIndex(P
23d50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
23d60 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e  dex *pIdx){.  in
23d70 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20  t i;.  int nCol 
23d80 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  = pIdx->nColumn;
23d90 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49  .  int nKey = pI
23da0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b  dx->nKeyCol;.  K
23db0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20  eyInfo *pKey;.  
23dc0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
23dd0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
23de0 66 28 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74  f( pIdx->uniqNot
23df0 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4b 65 79  Null ){.    pKey
23e00 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
23e10 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  oAlloc(pParse->d
23e20 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b  b, nKey, nCol-nK
23e30 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ey);.  }else{.  
23e40 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
23e50 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61  KeyInfoAlloc(pPa
23e60 72 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30  rse->db, nCol, 0
23e70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b 65  );.  }.  if( pKe
23e80 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  y ){.    assert(
23e90 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
23ea0 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 29  sWriteable(pKey)
23eb0 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
23ec0 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
23ed0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
23ee0 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61  *zColl = pIdx->a
23ef0 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zColl[i];.      
23f00 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pKey->aColl[i] =
23f10 20 7a 43 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33 53   zColl==sqlite3S
23f20 74 72 42 49 4e 41 52 59 20 3f 20 30 20 3a 0a 20  trBINARY ? 0 :. 
23f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
23f50 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
23f60 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  se, zColl);.    
23f70 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64    pKey->aSortOrd
23f80 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53  er[i] = pIdx->aS
23f90 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20  ortOrder[i];.   
23fa0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72 73   }.    if( pPars
23fb0 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20  e->nErr ){.     
23fc0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
23fd0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f  >rc==SQLITE_ERRO
23fe0 52 5f 4d 49 53 53 49 4e 47 5f 43 4f 4c 4c 53 45  R_MISSING_COLLSE
23ff0 51 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Q );.      if( p
24000 49 64 78 2d 3e 62 4e 6f 51 75 65 72 79 3d 3d 30  Idx->bNoQuery==0
24010 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44   ){.        /* D
24020 65 61 63 74 69 76 61 74 65 20 74 68 65 20 69 6e  eactivate the in
24030 64 65 78 20 62 65 63 61 75 73 65 20 69 74 20 63  dex because it c
24040 6f 6e 74 61 69 6e 73 20 61 6e 20 75 6e 6b 6e 6f  ontains an unkno
24050 77 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 20  wn collating.   
24060 20 20 20 20 20 2a 2a 20 73 65 71 75 65 6e 63 65       ** sequence
24070 2e 20 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 20  .  The only way 
24080 74 6f 20 72 65 61 63 74 69 76 65 20 74 68 65 20  to reactive the 
24090 69 6e 64 65 78 20 69 73 20 74 6f 20 72 65 6c 6f  index is to relo
240a0 61 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ad the.        *
240b0 2a 20 73 63 68 65 6d 61 2e 20 20 41 64 64 69 6e  * schema.  Addin
240c0 67 20 74 68 65 20 6d 69 73 73 69 6e 67 20 63 6f  g the missing co
240d0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
240e0 20 6c 61 74 65 72 20 64 6f 65 73 20 6e 6f 74 0a   later does not.
240f0 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61 63 74          ** react
24100 69 76 65 20 74 68 65 20 69 6e 64 65 78 2e 20 20  ive the index.  
24110 54 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  The application 
24120 68 61 64 20 74 68 65 20 63 68 61 6e 63 65 20 74  had the chance t
24130 6f 20 72 65 67 69 73 74 65 72 0a 20 20 20 20 20  o register.     
24140 20 20 20 2a 2a 20 74 68 65 20 6d 69 73 73 69 6e     ** the missin
24150 67 20 69 6e 64 65 78 20 75 73 69 6e 67 20 74 68  g index using th
24160 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65 64  e collation-need
24170 65 64 20 63 61 6c 6c 62 61 63 6b 2e 20 20 46 6f  ed callback.  Fo
24180 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6d  r.        ** sim
24190 70 6c 69 63 69 74 79 2c 20 53 51 4c 69 74 65 20  plicity, SQLite 
241a0 77 69 6c 6c 20 6e 6f 74 20 67 69 76 65 20 74 68  will not give th
241b0 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 61 20  e application a 
241c0 73 65 63 6f 6e 64 20 63 68 61 6e 63 65 2e 0a 20  second chance.. 
241d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
241e0 20 20 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72 79    pIdx->bNoQuery
241f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50   = 1;.        pP
24200 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
24210 45 5f 45 52 52 4f 52 5f 52 45 54 52 59 3b 0a 20  E_ERROR_RETRY;. 
24220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
24230 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
24240 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 70 4b  (pKey);.      pK
24250 65 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ey = 0;.    }.  
24260 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b  }.  return pKey;
24270 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
24280 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a  TE_OMIT_CTE./* .
24290 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
242a0 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
242b0 70 65 72 20 43 54 45 20 62 79 20 74 68 65 20 70  per CTE by the p
242c0 61 72 73 65 72 20 77 68 69 6c 65 20 70 61 72 73  arser while pars
242d0 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48 20 63  ing a .** WITH c
242e0 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68 20  lause. .*/.With 
242f0 2a 73 71 6c 69 74 65 33 57 69 74 68 41 64 64 28  *sqlite3WithAdd(
24300 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
24310 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
24320 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
24330 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  .  With *pWith, 
24340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
24350 69 73 74 69 6e 67 20 57 49 54 48 20 63 6c 61 75  isting WITH clau
24360 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  se, or NULL */. 
24370 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20   Token *pName,  
24380 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
24390 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74   of the common-t
243a0 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
243b0 73 74 20 2a 70 41 72 67 6c 69 73 74 2c 20 20 20  st *pArglist,   
243c0 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63 6f    /* Optional co
243d0 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20 66  lumn name list f
243e0 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  or the table */.
243f0 20 20 53 65 6c 65 63 74 20 2a 70 51 75 65 72 79    Select *pQuery
24400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65            /* Que
24410 72 79 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69  ry used to initi
24420 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65 20  alize the table 
24430 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
24440 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
24450 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65 77 3b 0a  ;.  With *pNew;.
24460 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a    char *zName;..
24470 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
24480 74 68 65 20 43 54 45 20 6e 61 6d 65 20 69 73 20  the CTE name is 
24490 75 6e 69 71 75 65 20 77 69 74 68 69 6e 20 74 68  unique within th
244a0 69 73 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20  is WITH clause. 
244b0 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f  If.  ** not, sto
244c0 72 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74  re an error in t
244d0 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74 75  he Parse structu
244e0 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d  re. */.  zName =
244f0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
24500 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
24510 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
24520 7a 4e 61 6d 65 20 26 26 20 70 57 69 74 68 20 29  zName && pWith )
24530 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
24540 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74   for(i=0; i<pWit
24550 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  h->nCte; i++){. 
24560 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
24570 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70  StrICmp(zName, p
24580 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  With->a[i].zName
24590 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
245a0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
245b0 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61  pParse, "duplica
245c0 74 65 20 57 49 54 48 20 74 61 62 6c 65 20 6e 61  te WITH table na
245d0 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  me: %s", zName);
245e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
245f0 20 7d 0a 0a 20 20 69 66 28 20 70 57 69 74 68 20   }..  if( pWith 
24600 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  ){.    int nByte
24610 20 3d 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68   = sizeof(*pWith
24620 29 20 2b 20 28 73 69 7a 65 6f 66 28 70 57 69 74  ) + (sizeof(pWit
24630 68 2d 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74 68  h->a[1]) * pWith
24640 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e 65  ->nCte);.    pNe
24650 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
24660 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74 68 2c 20  lloc(db, pWith, 
24670 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  nByte);.  }else{
24680 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
24690 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
246a0 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69 74  db, sizeof(*pWit
246b0 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  h));.  }.  asser
246c0 74 28 20 28 70 4e 65 77 21 3d 30 20 26 26 20 7a  t( (pNew!=0 && z
246d0 4e 61 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d 3e  Name!=0) || db->
246e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
246f0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
24700 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
24710 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
24720 6c 65 74 65 28 64 62 2c 20 70 41 72 67 6c 69 73  lete(db, pArglis
24730 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  t);.    sqlite3S
24740 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
24750 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c  pQuery);.    sql
24760 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
24770 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 20  Name);.    pNew 
24780 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65  = pWith;.  }else
24790 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e  {.    pNew->a[pN
247a0 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63  ew->nCte].pSelec
247b0 74 20 3d 20 70 51 75 65 72 79 3b 0a 20 20 20 20  t = pQuery;.    
247c0 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43  pNew->a[pNew->nC
247d0 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67  te].pCols = pArg
247e0 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  list;.    pNew->
247f0 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e  a[pNew->nCte].zN
24800 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
24810 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
24820 43 74 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20 30  Cte].zCteErr = 0
24830 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65  ;.    pNew->nCte
24840 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ++;.  }..  retur
24850 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
24860 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e   Free the conten
24870 74 73 20 6f 66 20 74 68 65 20 57 69 74 68 20 6f  ts of the With o
24880 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
24890 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
248a0 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
248b0 69 74 65 33 57 69 74 68 44 65 6c 65 74 65 28 73  ite3WithDelete(s
248c0 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68  qlite3 *db, With
248d0 20 2a 70 57 69 74 68 29 7b 0a 20 20 69 66 28 20   *pWith){.  if( 
248e0 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74  pWith ){.    int
248f0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
24900 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20   i<pWith->nCte; 
24910 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
24920 63 74 20 43 74 65 20 2a 70 43 74 65 20 3d 20 26  ct Cte *pCte = &
24930 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20  pWith->a[i];.   
24940 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
24950 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74  stDelete(db, pCt
24960 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20  e->pCols);.     
24970 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
24980 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70  lete(db, pCte->p
24990 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73  Select);.      s
249a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
249b0 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
249c0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
249d0 44 62 46 72 65 65 28 64 62 2c 20 70 57 69 74 68  DbFree(db, pWith
249e0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
249f0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
24a00 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a  TE_OMIT_CTE) */.