/ Hex Artifact Content
Login

Artifact c4227d058d52c24ffce2d33cd3a11234d8e8603901243cdb5165eddf64ee2177:


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 20 20 73 71    Table *p;.  sq
2d20: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2d30: 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65  se->db;..  /* Re
2d40: 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
2d50: 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72  schema. If an er
2d60: 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76  ror occurs, leav
2d70: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
2d80: 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65  ge.  ** and code
2d90: 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
2da0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  eturn NULL. */. 
2db0: 20 69 66 28 20 28 64 62 2d 3e 6d 44 62 46 6c 61   if( (db->mDbFla
2dc0: 67 73 20 26 20 44 42 46 4c 41 47 5f 53 63 68 65  gs & DBFLAG_Sche
2dd0: 6d 61 4b 6e 6f 77 6e 4f 6b 29 3d 3d 30 20 0a 20  maKnownOk)==0 . 
2de0: 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
2df0: 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
2e00: 61 28 70 50 61 72 73 65 29 0a 20 20 29 7b 0a 20  a(pParse).  ){. 
2e10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2e20: 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46  ..  p = sqlite3F
2e30: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
2e40: 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69  me, zDbase);.  i
2e50: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63  f( p==0 ){.    c
2e60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 20  onst char *zMsg 
2e70: 3d 20 66 6c 61 67 73 20 26 20 4c 4f 43 41 54 45  = flags & LOCATE
2e80: 5f 56 49 45 57 20 3f 20 22 6e 6f 20 73 75 63 68  _VIEW ? "no such
2e90: 20 76 69 65 77 22 20 3a 20 22 6e 6f 20 73 75 63   view" : "no suc
2ea0: 68 20 74 61 62 6c 65 22 3b 0a 23 69 66 6e 64 65  h table";.#ifnde
2eb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2ec0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
2ed0: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62  f( sqlite3FindDb
2ee0: 4e 61 6d 65 28 64 62 2c 20 7a 44 62 61 73 65 29  Name(db, zDbase)
2ef0: 3c 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  <1 ){.      /* I
2f00: 66 20 7a 4e 61 6d 65 20 69 73 20 74 68 65 20 6e  f zName is the n
2f10: 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ot the name of a
2f20: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 73 63   table in the sc
2f30: 68 65 6d 61 20 63 72 65 61 74 65 64 20 75 73 69  hema created usi
2f40: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 43 52 45 41  ng.      ** CREA
2f50: 54 45 2c 20 74 68 65 6e 20 63 68 65 63 6b 20 74  TE, then check t
2f60: 6f 20 73 65 65 20 69 66 20 69 74 20 69 73 20 74  o see if it is t
2f70: 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 76 69  he name of an vi
2f80: 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74  rtual table that
2f90: 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65  .      ** can be
2fa0: 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69   an eponymous vi
2fb0: 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a  rtual table. */.
2fc0: 20 20 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d        Module *pM
2fd0: 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29 73 71  od = (Module*)sq
2fe0: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
2ff0: 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d  b->aModule, zNam
3000: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  e);.      if( pM
3010: 6f 64 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33  od==0 && sqlite3
3020: 5f 73 74 72 6e 69 63 6d 70 28 7a 4e 61 6d 65 2c  _strnicmp(zName,
3030: 20 22 70 72 61 67 6d 61 5f 22 2c 20 37 29 3d 3d   "pragma_", 7)==
3040: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 6f  0 ){.        pMo
3050: 64 20 3d 20 73 71 6c 69 74 65 33 50 72 61 67 6d  d = sqlite3Pragm
3060: 61 56 74 61 62 52 65 67 69 73 74 65 72 28 64 62  aVtabRegister(db
3070: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
3080: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4d 6f 64  }.      if( pMod
3090: 20 26 26 20 73 71 6c 69 74 65 33 56 74 61 62 45   && sqlite3VtabE
30a0: 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 49 6e 69  ponymousTableIni
30b0: 74 28 70 50 61 72 73 65 2c 20 70 4d 6f 64 29 20  t(pParse, pMod) 
30c0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
30d0: 6e 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 3b  n pMod->pEpoTab;
30e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
30f0: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 66  endif.    if( (f
3100: 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f 4e 4f  lags & LOCATE_NO
3110: 45 52 52 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ERR)==0 ){.     
3120: 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20   if( zDbase ){. 
3130: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3140: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3150: 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73 67  %s: %s.%s", zMsg
3160: 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29  , zDbase, zName)
3170: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3180: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3190: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
31a0: 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20 7a  %s: %s", zMsg, z
31b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
31c0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65       pParse->che
31d0: 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
31e0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
31f0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  n p;.}../*.** Lo
3200: 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  cate the table i
3210: 64 65 6e 74 69 66 69 65 64 20 62 79 20 2a 70 2e  dentified by *p.
3220: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
3230: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
3240: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
3250: 6c 65 28 29 2e 20 54 68 65 20 64 69 66 66 65 72  le(). The differ
3260: 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a 2a 20  ence between.** 
3270: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
3280: 6c 65 28 29 20 61 6e 64 20 74 68 69 73 20 66 75  le() and this fu
3290: 6e 63 74 69 6f 6e 20 69 73 20 74 68 61 74 20 74  nction is that t
32a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73  his function res
32b0: 74 72 69 63 74 73 0a 2a 2a 20 74 68 65 20 73 65  tricts.** the se
32c0: 61 72 63 68 20 74 6f 20 73 63 68 65 6d 61 20 28  arch to schema (
32d0: 70 2d 3e 70 53 63 68 65 6d 61 29 20 69 66 20 69  p->pSchema) if i
32e0: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 70  t is not NULL. p
32f0: 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79 20 62 65  ->pSchema may be
3300: 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20  .** non-NULL if 
3310: 69 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  it is part of a 
3320: 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20  view or trigger 
3330: 70 72 6f 67 72 61 6d 20 64 65 66 69 6e 69 74 69  program definiti
3340: 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c 69 74  on. See.** sqlit
3350: 65 33 46 69 78 53 72 63 4c 69 73 74 28 29 20 66  e3FixSrcList() f
3360: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 54  or details..*/.T
3370: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63  able *sqlite3Loc
3380: 61 74 65 54 61 62 6c 65 49 74 65 6d 28 0a 20 20  ateTableItem(.  
3390: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
33a0: 20 20 75 33 32 20 66 6c 61 67 73 2c 0a 20 20 73    u32 flags,.  s
33b0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
33c0: 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e 73 74  em *p.){.  const
33d0: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 61 73   char *zDb;.  as
33e0: 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65 6d 61  sert( p->pSchema
33f0: 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74 61 62  ==0 || p->zDatab
3400: 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ase==0 );.  if( 
3410: 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  p->pSchema ){.  
3420: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
3430: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
3440: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
3450: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7a 44  pSchema);.    zD
3460: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  b = pParse->db->
3470: 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
3480: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
3490: 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61 62 61  zDb = p->zDataba
34a0: 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  se;.  }.  return
34b0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
34c0: 62 6c 65 28 70 50 61 72 73 65 2c 20 66 6c 61 67  ble(pParse, flag
34d0: 73 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  s, p->zName, zDb
34e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  );.}../*.** Loca
34f0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
3500: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
3510: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
3520: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
3530: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
3540: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a  of that index.**
3550: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   and the name of
3560: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
3570: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
3580: 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e  index..** Return
3590: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
35a0: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
35b0: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
35c0: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
35d0: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a  earched for the.
35e0: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  ** table and the
35f0: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
3600: 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65  index is returne
3610: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
3620: 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74  .** for duplicat
3630: 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73  e index names is
3640: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
3650: 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20  rch order is.** 
3660: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
3670: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20   MAIN, then any 
3680: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
3690: 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69  ses added.** usi
36a0: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
36b0: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  mmand..*/.Index 
36c0: 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65  *sqlite3FindInde
36d0: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  x(sqlite3 *db, c
36e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
36f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
3700: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  b){.  Index *p =
3710: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 2f   0;.  int i;.  /
3720: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
3730: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
3740: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
3750: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
3760: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
3770: 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71  rt( zDb!=0 || sq
3780: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
3790: 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
37a0: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
37b0: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
37c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
37d0: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
37e0: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
37f0: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
3800: 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
3810: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
3820: 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [j].pSchema;.   
3830: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
3840: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20   );.    if( zDb 
3850: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
3860: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
3870: 5d 2e 7a 44 62 53 4e 61 6d 65 29 20 29 20 63 6f  ].zDbSName) ) co
3880: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
3890: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
38a0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a  aMutexHeld(db, j
38b0: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20  , 0) );.    p = 
38c0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
38d0: 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  &pSchema->idxHas
38e0: 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  h, zName);.    i
38f0: 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20  f( p ) break;.  
3900: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
3910: 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74  ./*.** Reclaim t
3920: 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  he memory used b
3930: 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74  y an index.*/.st
3940: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e  atic void freeIn
3950: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
3960: 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23 69 66 6e   Index *p){.#ifn
3970: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3980: 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69 74 65  ANALYZE.  sqlite
3990: 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61 6d 70  3DeleteIndexSamp
39a0: 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23 65 6e 64  les(db, p);.#end
39b0: 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  if.  sqlite3Expr
39c0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50  Delete(db, p->pP
39d0: 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a 20 20  artIdxWhere);.  
39e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
39f0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 61 43 6f  elete(db, p->aCo
3a00: 6c 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  lExpr);.  sqlite
3a10: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
3a20: 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66 28 20 70  ColAff);.  if( p
3a30: 2d 3e 69 73 52 65 73 69 7a 65 64 20 29 20 73 71  ->isResized ) sq
3a40: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3a50: 28 76 6f 69 64 20 2a 29 70 2d 3e 61 7a 43 6f 6c  (void *)p->azCol
3a60: 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  l);.#ifdef SQLIT
3a70: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
3a80: 52 5f 53 54 41 54 34 0a 20 20 73 71 6c 69 74 65  R_STAT4.  sqlite
3a90: 33 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f 77 45  3_free(p->aiRowE
3aa0: 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  st);.#endif.  sq
3ab0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3ac0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  p);.}../*.** For
3ad0: 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c 6c 65   the index calle
3ae0: 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69 63 68  d zIdxName which
3af0: 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   is found in the
3b00: 20 64 61 74 61 62 61 73 65 20 69 44 62 2c 0a 2a   database iDb,.*
3b10: 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20 69 6e  * unlike that in
3b20: 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54 61 62  dex from its Tab
3b30: 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  le then remove t
3b40: 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a  he index from.**
3b50: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
3b60: 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20 61  table and free a
3b70: 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ll memory struct
3b80: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ures associated.
3b90: 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64 65  ** with the inde
3ba0: 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
3bb0: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
3bc0: 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  eIndex(sqlite3 *
3bd0: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
3be0: 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d  st char *zIdxNam
3bf0: 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  e){.  Index *pIn
3c00: 64 65 78 3b 0a 20 20 48 61 73 68 20 2a 70 48 61  dex;.  Hash *pHa
3c10: 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  sh;..  assert( s
3c20: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
3c30: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
3c40: 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d 20 26  ) );.  pHash = &
3c50: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
3c60: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20  hema->idxHash;. 
3c70: 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
3c80: 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73  3HashInsert(pHas
3c90: 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30 29 3b  h, zIdxName, 0);
3ca0: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49  .  if( ALWAYS(pI
3cb0: 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69 66 28  ndex) ){.    if(
3cc0: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
3cd0: 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20  >pIndex==pIndex 
3ce0: 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
3cf0: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20  >pTable->pIndex 
3d00: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
3d10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3d20: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
3d30: 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69    /* Justificati
3d40: 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b 20  on of ALWAYS(); 
3d50: 20 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20   The index must 
3d60: 62 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f  be on the list o
3d70: 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63  f.      ** indic
3d80: 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d  es. */.      p =
3d90: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
3da0: 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77  >pIndex;.      w
3db0: 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29 20  hile( ALWAYS(p) 
3dc0: 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e  && p->pNext!=pIn
3dd0: 64 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  dex ){ p = p->pN
3de0: 65 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  ext; }.      if(
3df0: 20 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d 3e   ALWAYS(p && p->
3e00: 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20 29  pNext==pIndex) )
3e10: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65  {.        p->pNe
3e20: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
3e30: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
3e40: 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28  }.    freeIndex(
3e50: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  db, pIndex);.  }
3e60: 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20  .  db->mDbFlags 
3e70: 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61  |= DBFLAG_Schema
3e80: 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
3e90: 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20 74 68   Look through th
3ea0: 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20 64  e list of open d
3eb0: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 69 6e  atabase files in
3ec0: 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64 20 69   db->aDb[] and i
3ed0: 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20 62 65  f.** any have be
3ee0: 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d 6f 76  en closed, remov
3ef0: 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20  e them from the 
3f00: 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63 61 74  list.  Reallocat
3f10: 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61 44 62  e the.** db->aDb
3f20: 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  [] structure to 
3f30: 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65 2c 20  a smaller size, 
3f40: 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a  if possible..**.
3f50: 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68 65 20  ** Entry 0 (the 
3f60: 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73 65 29  "main" database)
3f70: 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28 74 68   and entry 1 (th
3f80: 65 20 22 74 65 6d 70 22 20 64 61 74 61 62 61 73  e "temp" databas
3f90: 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65 72 20  e).** are never 
3fa0: 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 62  candidates for b
3fb0: 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64 2e 0a  eing collapsed..
3fc0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
3fd0: 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41  ollapseDatabaseA
3fe0: 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62  rray(sqlite3 *db
3ff0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
4000: 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62   for(i=j=2; i<db
4010: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
4020: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
4030: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
4040: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
4050: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
4060: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
4070: 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a 20 20  b->zDbSName);.  
4080: 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d      pDb->zDbSNam
4090: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  e = 0;.      con
40a0: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
40b0: 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20   if( j<i ){.    
40c0: 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64    db->aDb[j] = d
40d0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d  b->aDb[i];.    }
40e0: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
40f0: 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69  db->nDb = j;.  i
4100: 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26  f( db->nDb<=2 &&
4110: 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44   db->aDb!=db->aD
4120: 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d  bStatic ){.    m
4130: 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61  emcpy(db->aDbSta
4140: 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a  tic, db->aDb, 2*
4150: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30  sizeof(db->aDb[0
4160: 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ]));.    sqlite3
4170: 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61  DbFree(db, db->a
4180: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
4190: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
41a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
41b0: 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20  eset the schema 
41c0: 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
41d0: 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e 20 20   at index iDb.  
41e0: 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65 0a 2a  Also reset the.*
41f0: 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 20 20  * TEMP schema.  
4200: 54 68 65 20 72 65 73 65 74 20 69 73 20 64 65 66  The reset is def
4210: 65 72 72 65 64 20 69 66 20 64 62 2d 3e 6e 53 63  erred if db->nSc
4220: 68 65 6d 61 4c 6f 63 6b 20 69 73 20 6e 6f 74 20  hemaLock is not 
4230: 7a 65 72 6f 2e 0a 2a 2a 20 44 65 66 65 72 72 65  zero..** Deferre
4240: 64 20 72 65 73 65 74 73 20 6d 61 79 20 62 65 20  d resets may be 
4250: 72 75 6e 20 62 79 20 63 61 6c 6c 69 6e 67 20 77  run by calling w
4260: 69 74 68 20 69 44 62 3c 30 2e 0a 2a 2f 0a 76 6f  ith iDb<0..*/.vo
4270: 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f  id sqlite3ResetO
4280: 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  neSchema(sqlite3
4290: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
42a0: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
42b0: 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  t( iDb<db->nDb )
42c0: 3b 0a 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20  ;..  if( iDb>=0 
42d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
42e0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
42f0: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
4300: 29 20 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72  ) );.    DbSetPr
4310: 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20  operty(db, iDb, 
4320: 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29 3b  DB_ResetWanted);
4330: 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72  .    DbSetProper
4340: 74 79 28 64 62 2c 20 31 2c 20 44 42 5f 52 65 73  ty(db, 1, DB_Res
4350: 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 20 20 64  etWanted);.    d
4360: 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e  b->mDbFlags &= ~
4370: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e 6f  DBFLAG_SchemaKno
4380: 77 6e 4f 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  wnOk;.  }..  if(
4390: 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b   db->nSchemaLock
43a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ==0 ){.    for(i
43b0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
43c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 44  ++){.      if( D
43d0: 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
43e0: 20 69 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74   i, DB_ResetWant
43f0: 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ed) ){.        s
4400: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
4410: 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63  r(db->aDb[i].pSc
4420: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20  hema);.      }. 
4430: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
4440: 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65  * Erase all sche
4450: 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ma information f
4460: 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68 65 64  rom all attached
4470: 20 64 61 74 61 62 61 73 65 73 20 28 69 6e 63 6c   databases (incl
4480: 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22 20  uding.** "main" 
4490: 61 6e 64 20 22 74 65 6d 70 22 29 20 66 6f 72 20  and "temp") for 
44a0: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
44b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
44c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73  .void sqlite3Res
44d0: 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f  etAllSchemasOfCo
44e0: 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74 65 33  nnection(sqlite3
44f0: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *db){.  int i;.
4500: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
4510: 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 61 73  terAll(db);.  as
4520: 73 65 72 74 28 20 64 62 2d 3e 6e 53 63 68 65 6d  sert( db->nSchem
4530: 61 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 66 6f  aLock==0 );.  fo
4540: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
4550: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a  ; i++){.    Db *
4560: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
4570: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
4580: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
4590: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
45a0: 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61  ear(pDb->pSchema
45b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64  );.    }.  }.  d
45c0: 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e  b->mDbFlags &= ~
45d0: 28 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68  (DBFLAG_SchemaCh
45e0: 61 6e 67 65 7c 44 42 46 4c 41 47 5f 53 63 68 65  ange|DBFLAG_Sche
45f0: 6d 61 4b 6e 6f 77 6e 4f 6b 29 3b 0a 20 20 73 71  maKnownOk);.  sq
4600: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
4610: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
4620: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
4630: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  db);.  sqlite3Co
4640: 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72  llapseDatabaseAr
4650: 72 61 79 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ray(db);.}../*.*
4660: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4670: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4680: 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a  commit occurs..*
4690: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
46a0: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
46b0: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
46c0: 7b 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73  {.  db->mDbFlags
46d0: 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63 68 65   &= ~DBFLAG_Sche
46e0: 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  maChange;.}../*.
46f0: 2a 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79  ** Delete memory
4700: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
4710: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
4720: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
4730: 65 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65  ew (the.** Table
4740: 2e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a  .aCol[] array)..
4750: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
4760: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
4770: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
4780: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
4790: 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20  int i;.  Column 
47a0: 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28  *pCol;.  assert(
47b0: 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20   pTable!=0 );.  
47c0: 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62  if( (pCol = pTab
47d0: 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a  le->aCol)!=0 ){.
47e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
47f0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
4800: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
4810: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4820: 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  b, pCol->zName);
4830: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
4840: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  prDelete(db, pCo
4850: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->pDflt);.     
4860: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4870: 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b  b, pCol->zColl);
4880: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4890: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
48a0: 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a  ble->aCol);.  }.
48b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
48c0: 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20  the memory data 
48d0: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
48e0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
48f0: 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20  iven.** Table.  
4900: 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
4910: 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74  ade to disk by t
4920: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
4930: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4940: 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65  just deletes the
4950: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e   data structure.
4960: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e    It does not un
4970: 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c  link.** the tabl
4980: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
4990: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
49a0: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
49b0: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
49c0: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
49d0: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
49e0: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
49f0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4a00: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
4a10: 2a 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61  *.** The db para
4a20: 6d 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61  meter is optiona
4a30: 6c 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65 64  l.  It is needed
4a40: 20 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62   if the Table ob
4a50: 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  ject .** contain
4a60: 73 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  s lookaside memo
4a70: 72 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65  ry.  (Table obje
4a80: 63 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d  cts in the schem
4a90: 61 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  a do not use.** 
4aa0: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
4ab0: 2c 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d  , but some ephem
4ac0: 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63  eral Table objec
4ad0: 74 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a  ts do.)  Or the.
4ae0: 2a 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72 20  ** db parameter 
4af0: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
4b00: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4b10: 64 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65  d to measure the
4b20: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20   memory.** used 
4b30: 62 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  by the Table obj
4b40: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
4b50: 6f 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  oid SQLITE_NOINL
4b60: 49 4e 45 20 64 65 6c 65 74 65 54 61 62 6c 65 28  INE deleteTable(
4b70: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
4b80: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49  le *pTable){.  I
4b90: 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70  ndex *pIndex, *p
4ba0: 4e 65 78 74 3b 0a 0a 23 69 66 64 65 66 20 53 51  Next;..#ifdef SQ
4bb0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
4bc0: 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  Record the numbe
4bd0: 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
4be0: 20 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f 63   lookaside alloc
4bf0: 61 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d 61  ations in schema
4c00: 20 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72 69   Tables.  ** pri
4c10: 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20  or to doing any 
4c20: 66 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f 6e  free() operation
4c30: 73 2e 20 20 53 69 6e 63 65 20 73 63 68 65 6d 61  s.  Since schema
4c40: 20 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 75   Tables do not u
4c50: 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64  se.  ** lookasid
4c60: 65 2c 20 74 68 69 73 20 6e 75 6d 62 65 72 20 73  e, this number s
4c70: 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65  hould not change
4c80: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b  . */.  int nLook
4c90: 61 73 69 64 65 20 3d 20 30 3b 0a 20 20 69 66 28  aside = 0;.  if(
4ca0: 20 64 62 20 26 26 20 28 70 54 61 62 6c 65 2d 3e   db && (pTable->
4cb0: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
4cc0: 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20  hemeral)==0 ){. 
4cd0: 20 20 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20     nLookaside = 
4ce0: 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65  sqlite3Lookaside
4cf0: 55 73 65 64 28 64 62 2c 20 30 29 3b 0a 20 20 7d  Used(db, 0);.  }
4d00: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65  .#endif..  /* De
4d10: 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  lete all indices
4d20: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4d30: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a   this table. */.
4d40: 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70    for(pIndex = p
4d50: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
4d60: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e  Index; pIndex=pN
4d70: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
4d80: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
4d90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
4da0: 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  dex->pSchema==pT
4db0: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 0a 20 20  able->pSchema.  
4dc0: 20 20 20 20 20 20 20 7c 7c 20 28 49 73 56 69 72         || (IsVir
4dd0: 74 75 61 6c 28 70 54 61 62 6c 65 29 20 26 26 20  tual(pTable) && 
4de0: 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 21  pIndex->idxType!
4df0: 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
4e00: 41 50 50 44 45 46 29 20 29 3b 0a 20 20 20 20 69  APPDEF) );.    i
4e10: 66 28 20 28 64 62 3d 3d 30 20 7c 7c 20 64 62 2d  f( (db==0 || db-
4e20: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4e30: 29 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  ) && !IsVirtual(
4e40: 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20  pTable) ){.     
4e50: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
4e60: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20  Index->zName; . 
4e70: 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20       TESTONLY ( 
4e80: 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20  Index *pOld = ) 
4e90: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
4ea0: 74 28 0a 20 20 20 20 20 20 20 20 20 26 70 49 6e  t(.         &pIn
4eb0: 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  dex->pSchema->id
4ec0: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a  xHash, zName, 0.
4ed0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
4ee0: 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20  ssert( db==0 || 
4ef0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
4f00: 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49  exHeld(db, 0, pI
4f10: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29  ndex->pSchema) )
4f20: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4f30: 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20  pOld==pIndex || 
4f40: 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  pOld==0 );.    }
4f50: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
4f60: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
4f70: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
4f80: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74   foreign keys at
4f90: 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74  tached to this t
4fa0: 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  able. */.  sqlit
4fb0: 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70  e3FkDelete(db, p
4fc0: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65  Table);..  /* De
4fd0: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
4fe0: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
4ff0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
5000: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
5010: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
5020: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5030: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
5040: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
5050: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43  e(db, pTable->zC
5060: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
5070: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
5080: 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
5090: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
50a0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
50b0: 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b  pTable->pCheck);
50c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
50d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
50e0: 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43  E.  sqlite3VtabC
50f0: 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29  lear(db, pTable)
5100: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
5110: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
5120: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  ble);..  /* Veri
5130: 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61  fy that no looka
5140: 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20  side memory was 
5150: 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74  used by schema t
5160: 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  ables */.  asser
5170: 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30  t( nLookaside==0
5180: 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d   || nLookaside==
5190: 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65  sqlite3Lookaside
51a0: 55 73 65 64 28 64 62 2c 30 29 20 29 3b 0a 7d 0a  Used(db,0) );.}.
51b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
51c0: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
51d0: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
51e0: 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  le){.  /* Do not
51f0: 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c   delete the tabl
5200: 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65  e until the refe
5210: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
5220: 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69  hes zero. */.  i
5230: 66 28 20 21 70 54 61 62 6c 65 20 29 20 72 65 74  f( !pTable ) ret
5240: 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62  urn;.  if( ((!db
5250: 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   || db->pnBytesF
5260: 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70  reed==0) && (--p
5270: 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 29 3e  Table->nTabRef)>
5280: 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
5290: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
52a0: 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Table);.}.../*.*
52b0: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
52c0: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
52d0: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
52e0: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
52f0: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
5300: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
5310: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
5320: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
5330: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
5340: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
5350: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
5360: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
5370: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
5380: 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44  ble *p;.  Db *pD
5390: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  b;..  assert( db
53a0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
53b0: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
53c0: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
53d0: 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a  rt( zTabName );.
53e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
53f0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
5400: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
5410: 20 20 74 65 73 74 63 61 73 65 28 20 7a 54 61 62    testcase( zTab
5420: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f  Name[0]==0 );  /
5430: 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61  * Zero-length ta
5440: 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c  ble names are al
5450: 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d  lowed */.  pDb =
5460: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
5470: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
5480: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
5490: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
54a0: 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  zTabName, 0);.  
54b0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
54c0: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
54d0: 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46  >mDbFlags |= DBF
54e0: 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
54f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
5500: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
5510: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
5520: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
5530: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
5540: 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  oken.  Space to 
5550: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
5560: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f  d string.** is o
5570: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
5580: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
5590: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
55a0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
55b0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
55c0: 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61  Any quotation ma
55d0: 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22  rks (ex:  "name"
55e0: 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d  , 'name', [name]
55f0: 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61  , or `name`) tha
5600: 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68  t.** surround th
5610: 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f  e body of the to
5620: 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e  ken are removed.
5630: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
5640: 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69  e often just poi
5650: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
5660: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
5670: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
5680: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
5690: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
56a0: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
56b0: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
56c0: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
56d0: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
56e0: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
56f0: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
5700: 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a  mToken(sqlite3 *
5710: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
5720: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
5730: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  ;.  if( pName ){
5740: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
5750: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
5760: 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e  , (char*)pName->
5770: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
5780: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
5790: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (zName);.  }else
57a0: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
57b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
57c0: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
57d0: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
57e0: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
57f0: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
5800: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
5810: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
5820: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
5830: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
5840: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
5850: 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73  MasterTable(Pars
5860: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *p, int iDb){.
5870: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
5880: 74 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20  te3GetVdbe(p);. 
5890: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
58a0: 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52  k(p, iDb, MASTER
58b0: 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53 54 45 52  _ROOT, 1, MASTER
58c0: 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c 69 74 65  _NAME);.  sqlite
58d0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
58e0: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
58f0: 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  0, MASTER_ROOT, 
5900: 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70  iDb, 5);.  if( p
5910: 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ->nTab==0 ){.   
5920: 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20   p->nTab = 1;.  
5930: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  }.}../*.** Param
5940: 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74  eter zName point
5950: 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69  s to a nul-termi
5960: 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e  nated buffer con
5970: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
5980: 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73  .** of a databas
5990: 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  e ("main", "temp
59a0: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
59b0: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
59c0: 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
59d0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69  on returns the i
59e0: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
59f0: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
5a00: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d  ->aDb[], or.** -
5a10: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
5a20: 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  b cannot be foun
5a30: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5a40: 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69  3FindDbName(sqli
5a50: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
5a60: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
5a70: 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20  nt i = -1;      
5a80: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
5a90: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a  umber */.  if( z
5aa0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a  Name ){.    Db *
5ab0: 70 44 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28  pDb;.    for(i=(
5ac0: 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d  db->nDb-1), pDb=
5ad0: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d  &db->aDb[i]; i>=
5ae0: 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a  0; i--, pDb--){.
5af0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
5b00: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 44 62  ite3_stricmp(pDb
5b10: 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4e 61 6d  ->zDbSName, zNam
5b20: 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  e) ) break;.    
5b30: 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69 73 20 61    /* "main" is a
5b40: 6c 77 61 79 73 20 61 6e 20 61 63 63 65 70 74 61  lways an accepta
5b50: 62 6c 65 20 61 6c 69 61 73 20 66 6f 72 20 74 68  ble alias for th
5b60: 65 20 70 72 69 6d 61 72 79 20 64 61 74 61 62 61  e primary databa
5b70: 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  se.      ** even
5b80: 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20   if it has been 
5b90: 72 65 6e 61 6d 65 64 20 75 73 69 6e 67 20 53 51  renamed using SQ
5ba0: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41  LITE_DBCONFIG_MA
5bb0: 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a 20 20 20  INDBNAME. */.   
5bc0: 20 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20 30     if( i==0 && 0
5bd0: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
5be0: 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65 29  p("main", zName)
5bf0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
5c00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
5c10: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
5c20: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
5c30: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
5c40: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
5c50: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
5c60: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
5c70: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
5c80: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
5c90: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
5ca0: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
5cb0: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
5cc0: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
5cd0: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
5ce0: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
5cf0: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  xist..*/.int sql
5d00: 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74  ite3FindDb(sqlit
5d10: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
5d20: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Name){.  int i; 
5d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5d50: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
5d60: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
5d70: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
5d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
5d90: 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68  me we are search
5da0: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61  ing for */.  zNa
5db0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
5dc0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
5dd0: 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69  ame);.  i = sqli
5de0: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
5df0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
5e00: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
5e10: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ame);.  return i
5e20: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c  ;.}../* The tabl
5e30: 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69  e or view or tri
5e40: 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73  gger name is pas
5e50: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
5e60: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a  ine via tokens.*
5e70: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
5e80: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
5e90: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
5ea0: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
5eb0: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43  example:.**.** C
5ec0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
5ed0: 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a  yyy (...);.** .*
5ee0: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
5ef0: 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e   set to "xxx" an
5f00: 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20  d pName2 "yyy". 
5f10: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
5f20: 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d if.** the tabl
5f30: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
5f40: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
5f50: 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  .e.:.**.** CREAT
5f60: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
5f70: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  ;.**.** Then pNa
5f80: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
5f90: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
5fa0: 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  s ""..**.** This
5fb0: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
5fc0: 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e  e *ppUnqual poin
5fd0: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
5fe0: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
5ff0: 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20  1 or.** pName2) 
6000: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
6010: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
6020: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64  e name.  The ind
6030: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ex of the.** dat
6040: 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72  abase "xxx" is r
6050: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
6060: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
6070: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
6080: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
6090: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
60a0: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
60b0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
60c0: 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me1,      /* The
60d0: 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61   "xxx" in the na
60e0: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20  me "xxx.yyy" or 
60f0: 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  "xxx" */.  Token
6100: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f   *pName2,      /
6110: 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74  * The "yyy" in t
6120: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
6130: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70  " */.  Token **p
6140: 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72  Unqual     /* Wr
6150: 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66  ite the unqualif
6160: 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ied object name 
6170: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
6180: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
6190: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
61a0: 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
61b0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
61c0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
61d0: 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  e->db;..  assert
61e0: 28 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a 20  ( pName2!=0 );. 
61f0: 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30   if( pName2->n>0
6200: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
6210: 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20  init.busy ) {.  
6220: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6230: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72  Msg(pParse, "cor
6240: 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b  rupt database");
6250: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
6260: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e  ;.    }.    *pUn
6270: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20  qual = pName2;. 
6280: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
6290: 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65  FindDb(db, pName
62a0: 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  1);.    if( iDb<
62b0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
62c0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
62d0: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  e, "unknown data
62e0: 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31  base %T", pName1
62f0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6300: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
6310: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
6320: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c  b->init.iDb==0 |
6330: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 0a  | db->init.busy.
6340: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
6350: 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20  (db->mDbFlags & 
6360: 44 42 46 4c 41 47 5f 56 61 63 75 75 6d 29 21 3d  DBFLAG_Vacuum)!=
6370: 30 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62  0);.    iDb = db
6380: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
6390: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
63a0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
63b0: 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  iDb;.}../*.** Th
63c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
63d0: 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
63e0: 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  he UTF-8 string 
63f0: 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c  zName is a legal
6400: 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20  .** unqualified 
6410: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73  name for a new s
6420: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61  chema object (ta
6430: 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77  ble, index, view
6440: 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e   or.** trigger).
6450: 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c   All names are l
6460: 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73  egal except thos
6470: 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  e that begin wit
6480: 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  h the string.** 
6490: 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70  "sqlite_" (in up
64a0: 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69  per, lower or mi
64b0: 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20  xed case). This 
64c0: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  portion of the n
64d0: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72  amespace.** is r
64e0: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
64f0: 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74  rnal use..*/.int
6500: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a   sqlite3CheckObj
6510: 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70  ectName(Parse *p
6520: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
6530: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
6540: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
6550: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
6560: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20  e->nested==0 .  
6570: 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72          && (pPar
6580: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
6590: 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
65a0: 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ma)==0.         
65b0: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
65c0: 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  rNICmp(zName, "s
65d0: 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20  qlite_", 7) ){. 
65e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
65f0: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65  sg(pParse, "obje
6600: 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64  ct name reserved
6610: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73   for internal us
6620: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
6630: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6640: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
6650: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6670: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
6680: 20 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62 6c   index of a tabl
6690: 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  e.*/.Index *sqli
66a0: 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
66b0: 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  ex(Table *pTab){
66c0: 0a 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 66  .  Index *p;.  f
66d0: 6f 72 28 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65  or(p=pTab->pInde
66e0: 78 3b 20 70 20 26 26 20 21 49 73 50 72 69 6d 61  x; p && !IsPrima
66f0: 72 79 4b 65 79 49 6e 64 65 78 28 70 29 3b 20 70  ryKeyIndex(p); p
6700: 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 72  =p->pNext){}.  r
6710: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
6720: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6c  * Return the col
6730: 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64  umn of index pId
6740: 78 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  x that correspon
6750: 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a 2a 20 63  ds to table.** c
6760: 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20 52 65 74  olumn iCol.  Ret
6770: 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74 20 66 6f  urn -1 if not fo
6780: 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c 69  und..*/.i16 sqli
6790: 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
67a0: 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 31  (Index *pIdx, i1
67b0: 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69  6 iCol){.  int i
67c0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
67d0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
67e0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  +){.    if( iCol
67f0: 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
6800: 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  [i] ) return i;.
6810: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
6820: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
6830: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e  constructing a n
6840: 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65  ew table represe
6850: 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72  ntation in memor
6860: 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74  y.  This is.** t
6870: 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65  he first of seve
6880: 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  ral action routi
6890: 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c  nes that get cal
68a0: 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a  led in response.
68b0: 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54  ** to a CREATE T
68c0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
68d0: 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20   In particular, 
68e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
68f0: 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20  called.** after 
6900: 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43  seeing tokens "C
6910: 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c  REATE" and "TABL
6920: 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  E" and the table
6930: 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d   name. The isTem
6940: 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  p.** flag is tru
6950: 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  e if the table s
6960: 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
6970: 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
6980: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
6990: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20  e instead of in 
69a0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
69b0: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  e file.  This is
69c0: 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61   normally the ca
69d0: 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22  se.** when the "
69e0: 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52  TEMP" or "TEMPOR
69f0: 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63  ARY" keyword occ
6a00: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a  urs in between.*
6a10: 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42  * CREATE and TAB
6a20: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  LE..**.** The ne
6a30: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  w table record i
6a40: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  s initialized an
6a50: 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d  d put in pParse-
6a60: 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41  >pNewTable..** A
6a70: 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52  s more of the CR
6a80: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
6a90: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20  ment is parsed, 
6aa0: 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f  additional actio
6ab0: 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69  n.** routines wi
6ac0: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  ll be called to 
6ad0: 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  add more informa
6ae0: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63  tion to this rec
6af0: 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ord..** At the e
6b00: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
6b10: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
6b20: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64  , the sqlite3End
6b30: 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a  Table() routine.
6b40: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ** is called to 
6b50: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e  complete the con
6b60: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65  struction of the
6b70: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
6b80: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
6b90: 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20  e3StartTable(.  
6ba0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
6bb0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
6bc0: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
6bd0: 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73  Name1,   /* Firs
6be0: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  t part of the na
6bf0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
6c00: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  or view */.  Tok
6c10: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a  en *pName2,   /*
6c20: 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
6c30: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
6c40: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
6c50: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
6c60: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
6c70: 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61  his is a TEMP ta
6c80: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ble */.  int isV
6c90: 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  iew,      /* Tru
6ca0: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
6cb0: 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  IEW */.  int isV
6cc0: 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75  irtual,   /* Tru
6cd0: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
6ce0: 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a  IRTUAL table */.
6cf0: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
6d00: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
6d10: 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64   if table alread
6d20: 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
6d30: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a   Table *pTable;.
6d40: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
6d50: 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f  0; /* The name o
6d60: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
6d70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
6d80: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
6d90: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
6da0: 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
6db0: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
6dc0: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
6dd0: 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ble in */.  Toke
6de0: 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  n *pName;    /* 
6df0: 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
6e00: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
6e10: 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66   create */..  if
6e20: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
6e30: 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  && db->init.newT
6e40: 6e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  num==1 ){.    /*
6e50: 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20   Special case:  
6e60: 50 61 72 73 69 6e 67 20 74 68 65 20 73 71 6c 69  Parsing the sqli
6e70: 74 65 5f 6d 61 73 74 65 72 20 6f 72 20 73 71 6c  te_master or sql
6e80: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
6e90: 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69 44  schema */.    iD
6ea0: 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  b = db->init.iDb
6eb0: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  ;.    zName = sq
6ec0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
6ed0: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
6ee0: 44 62 29 29 3b 0a 20 20 20 20 70 4e 61 6d 65 20  Db));.    pName 
6ef0: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 65 6c 73  = pName1;.  }els
6f00: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  e{.    /* The co
6f10: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20  mmon case */.   
6f20: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
6f30: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
6f40: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
6f50: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
6f60: 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
6f70: 6e 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  n;.    if( !OMIT
6f80: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
6f90: 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  p && pName2->n>0
6fa0: 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20   && iDb!=1 ){.  
6fb0: 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69      /* If creati
6fc0: 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c  ng a temp table,
6fd0: 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f   the name may no
6fe0: 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20  t be qualified. 
6ff0: 55 6e 6c 65 73 73 20 0a 20 20 20 20 20 20 2a 2a  Unless .      **
7000: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
7010: 6d 65 20 69 73 20 22 74 65 6d 70 22 20 61 6e 79  me is "temp" any
7020: 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73  way.  */.      s
7030: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7040: 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72  Parse, "temporar
7050: 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73  y table name mus
7060: 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64  t be unqualified
7070: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
7080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7090: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
70a0: 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31  isTemp ) iDb = 1
70b0: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  ;.    zName = sq
70c0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
70d0: 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
70e0: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61   }.  pParse->sNa
70f0: 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65  meToken = *pName
7100: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
7110: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
7120: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
7130: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
7140: 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
7150: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65  ) ){.    goto be
7160: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7170: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69  .  }.  if( db->i
7180: 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54  nit.iDb==1 ) isT
7190: 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  emp = 1;.#ifndef
71a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
71b0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73  HORIZATION.  ass
71c0: 65 72 74 28 20 69 73 54 65 6d 70 3d 3d 30 20 7c  ert( isTemp==0 |
71d0: 7c 20 69 73 54 65 6d 70 3d 3d 31 20 29 3b 0a 20  | isTemp==1 );. 
71e0: 20 61 73 73 65 72 74 28 20 69 73 56 69 65 77 3d   assert( isView=
71f0: 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 31 20  =0 || isView==1 
7200: 29 3b 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69  );.  {.    stati
7210: 63 20 63 6f 6e 73 74 20 75 38 20 61 43 6f 64 65  c const u8 aCode
7220: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 53 51  [] = {.       SQ
7230: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
7240: 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45  E,.       SQLITE
7250: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  _CREATE_TEMP_TAB
7260: 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54  LE,.       SQLIT
7270: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 2c 0a 20  E_CREATE_VIEW,. 
7280: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45        SQLITE_CRE
7290: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 0a 20 20  ATE_TEMP_VIEW.  
72a0: 20 20 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a    };.    char *z
72b0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
72c0: 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
72d0: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
72e0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
72f0: 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
7300: 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29  MA_TABLE(isTemp)
7310: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
7320: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
7330: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
7340: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74  .    if( !isVirt
7350: 75 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75  ual && sqlite3Au
7360: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
7370: 28 69 6e 74 29 61 43 6f 64 65 5b 69 73 54 65 6d  (int)aCode[isTem
7380: 70 2b 32 2a 69 73 56 69 65 77 5d 2c 0a 20 20 20  p+2*isView],.   
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73b0: 20 20 20 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44      zName, 0, zD
73c0: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
73d0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
73e0: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  or;.    }.  }.#e
73f0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
7400: 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62  sure the new tab
7410: 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74  le name does not
7420: 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e   collide with an
7430: 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69   existing.  ** i
7440: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61  ndex or table na
7450: 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  me in the same d
7460: 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65 20  atabase.  Issue 
7470: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
7480: 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73   if.  ** it does
7490: 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20  . The exception 
74a0: 69 73 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  is if the statem
74b0: 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65 64  ent being parsed
74c0: 20 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a   was passed.  **
74d0: 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64   to an sqlite3_d
74e0: 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61  eclare_vtab() ca
74f0: 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ll. In that case
7500: 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   only the column
7510: 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20   names.  ** and 
7520: 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73  types will be us
7530: 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20  ed, so there is 
7540: 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20  no need to test 
7550: 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20  for namespace.  
7560: 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20  ** collisions.. 
7570: 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44 45   */.  if( !IN_DE
7580: 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20  CLARE_VTAB ){.  
7590: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
75a0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
75b0: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  ame;.    if( SQL
75c0: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
75d0: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
75e0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
75f0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
7600: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  r;.    }.    pTa
7610: 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ble = sqlite3Fin
7620: 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
7630: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
7640: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  pTable ){.      
7650: 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20  if( !noErr ){.  
7660: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7670: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
7680: 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20  able %T already 
7690: 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b  exists", pName);
76a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
76b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
76c0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
76d0: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
76e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
76f0: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
7700: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
7710: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62    }.      goto b
7720: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7730: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7740: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
7750: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29  (db, zName, zDb)
7760: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
7770: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7780: 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
7790: 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20  lready an index 
77a0: 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
77b0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  );.      goto be
77c0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
77d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54  .    }.  }..  pT
77e0: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62  able = sqlite3Db
77f0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
7800: 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
7810: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
7820: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
7830: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7840: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
7850: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
7860: 42 4b 50 54 3b 0a 20 20 20 20 70 50 61 72 73 65  BKPT;.    pParse
7870: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
7880: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7890: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
78a0: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
78b0: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b  e;.  pTable->iPK
78c0: 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c  ey = -1;.  pTabl
78d0: 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  e->pSchema = db-
78e0: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
78f0: 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 54 61  a;.  pTable->nTa
7900: 62 52 65 66 20 3d 20 31 3b 0a 23 69 66 64 65 66  bRef = 1;.#ifdef
7910: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
7920: 52 4f 57 45 53 54 0a 20 20 70 54 61 62 6c 65 2d  ROWEST.  pTable-
7930: 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71  >nRowLogEst = sq
7940: 6c 69 74 65 33 4c 6f 67 45 73 74 28 53 51 4c 49  lite3LogEst(SQLI
7950: 54 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45 53  TE_DEFAULT_ROWES
7960: 54 29 3b 0a 23 65 6c 73 65 0a 20 20 70 54 61 62  T);.#else.  pTab
7970: 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  le->nRowLogEst =
7980: 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
7990: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
79a0: 28 31 30 34 38 35 37 36 29 20 29 3b 0a 23 65 6e  (1048576) );.#en
79b0: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 50  dif.  assert( pP
79c0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
79d0: 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =0 );.  pParse->
79e0: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
79f0: 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  le;..  /* If thi
7a00: 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73  s is the magic s
7a10: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
7a20: 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74  able used by aut
7a30: 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a  oincrement,.  **
7a40: 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70   then record a p
7a50: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74  ointer to this t
7a60: 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  able in the main
7a70: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
7a80: 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ure.  ** so that
7a90: 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64   INSERT can find
7aa0: 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c   the table easil
7ab0: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
7ac0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
7ad0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20  INCREMENT.  if( 
7ae0: 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20  !pParse->nested 
7af0: 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  && strcmp(zName,
7b00: 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
7b10: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  e")==0 ){.    as
7b20: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
7b30: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
7b40: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
7b50: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
7b60: 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c  >pSeqTab = pTabl
7b70: 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
7b80: 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
7b90: 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68  ting the code th
7ba0: 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74  at will insert t
7bb0: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
7bc0: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51  into.  ** the SQ
7bd0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
7be0: 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74  e.  Note in part
7bf0: 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d  icular that we m
7c00: 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a  ust go ahead.  *
7c10: 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74  * and allocate t
7c20: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
7c30: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65   for the table e
7c40: 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72  ntry now.  Befor
7c50: 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41  e any.  ** PRIMA
7c60: 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
7c70: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61   keywords are pa
7c80: 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79  rsed.  Those key
7c90: 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65  words will cause
7ca0: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f  .  ** indices to
7cb0: 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20   be created and 
7cc0: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
7cd0: 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72   must come befor
7ce0: 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69  e the .  ** indi
7cf0: 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ces.  Hence, the
7d00: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
7d10: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73  or the table mus
7d20: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20  t be allocated. 
7d30: 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   ** now..  */.  
7d40: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
7d50: 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74  sy && (v = sqlit
7d60: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
7d70: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))!=0 ){.    int
7d80: 20 61 64 64 72 31 3b 0a 20 20 20 20 69 6e 74 20   addr1;.    int 
7d90: 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20  fileFormat;.    
7da0: 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20  int reg1, reg2, 
7db0: 72 65 67 33 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c  reg3;.    /* nul
7dc0: 6c 52 6f 77 5b 5d 20 69 73 20 61 6e 20 4f 50 5f  lRow[] is an OP_
7dd0: 52 65 63 6f 72 64 20 65 6e 63 6f 64 69 6e 67 20  Record encoding 
7de0: 6f 66 20 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e  of a row contain
7df0: 69 6e 67 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20  ing 5 NULLs */. 
7e00: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
7e10: 63 68 61 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d  char nullRow[] =
7e20: 20 7b 20 36 2c 20 30 2c 20 30 2c 20 30 2c 20 30   { 6, 0, 0, 0, 0
7e30: 2c 20 30 20 7d 3b 0a 20 20 20 20 73 71 6c 69 74  , 0 };.    sqlit
7e40: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
7e50: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
7e60: 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
7e70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
7e80: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
7e90: 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20   isVirtual ){.  
7ea0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7eb0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67  ddOp0(v, OP_VBeg
7ec0: 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  in);.    }.#endi
7ed0: 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  f..    /* If the
7ee0: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64   file format and
7ef0: 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65   encoding in the
7f00: 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20 6e   database have n
7f10: 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20  ot been set, .  
7f20: 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f    ** set them no
7f30: 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  w..    */.    re
7f40: 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67  g1 = pParse->reg
7f50: 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
7f60: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32  ->nMem;.    reg2
7f70: 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f   = pParse->regRo
7f80: 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ot = ++pParse->n
7f90: 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20  Mem;.    reg3 = 
7fa0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
7fb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7fc0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64  ddOp3(v, OP_Read
7fd0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67  Cookie, iDb, reg
7fe0: 33 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  3, BTREE_FILE_FO
7ff0: 52 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  RMAT);.    sqlit
8000: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
8010: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 61 64 64  v, iDb);.    add
8020: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
8030: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
8040: 20 72 65 67 33 29 3b 20 56 64 62 65 43 6f 76 65   reg3); VdbeCove
8050: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 66 69 6c  rage(v);.    fil
8060: 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66  eFormat = (db->f
8070: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65  lags & SQLITE_Le
8080: 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20  gacyFileFmt)!=0 
8090: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
80a0: 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d      1 : SQLITE_M
80b0: 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a  AX_FILE_FORMAT;.
80c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
80d0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
80e0: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45  ookie, iDb, BTRE
80f0: 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 66  E_FILE_FORMAT, f
8100: 69 6c 65 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  ileFormat);.    
8110: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8120: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
8130: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 54 45  e, iDb, BTREE_TE
8140: 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 45 4e 43  XT_ENCODING, ENC
8150: 28 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  (db));.    sqlit
8160: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
8170: 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 20 20 2f  , addr1);..    /
8180: 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65 61  * This just crea
8190: 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64  tes a place-hold
81a0: 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  er record in the
81b0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
81c0: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  able..    ** The
81d0: 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64 20   record created 
81e0: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
81f0: 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20   anything yet.  
8200: 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61  It will be repla
8210: 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ced.    ** by th
8220: 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20  e real entry in 
8230: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 61  code generated a
8240: 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  t sqlite3EndTabl
8250: 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
8260: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
8270: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
8280: 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74  s left in regist
8290: 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  er pParse->regRo
82a0: 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  wid..    ** The 
82b0: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
82c0: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
82d0: 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  e is left in reg
82e0: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
82f0: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  ..    ** The row
8300: 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  id and root page
8310: 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20 61   number values a
8320: 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  re needed by the
8330: 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 2a   code that.    *
8340: 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  * sqlite3EndTabl
8350: 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e  e will generate.
8360: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  .    */.#if !def
8370: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
8380: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
8390: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
83a0: 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
83b0: 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69   if( isView || i
83c0: 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20  sVirtual ){.    
83d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
83e0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
83f0: 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20 20  r, 0, reg2);.   
8400: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
8410: 20 20 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65    {.      pParse
8420: 2d 3e 61 64 64 72 43 72 54 61 62 20 3d 0a 20 20  ->addrCrTab =.  
8430: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8440: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
8450: 72 65 61 74 65 42 74 72 65 65 2c 20 69 44 62 2c  reateBtree, iDb,
8460: 20 72 65 67 32 2c 20 42 54 52 45 45 5f 49 4e 54   reg2, BTREE_INT
8470: 4b 45 59 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  KEY);.    }.    
8480: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
8490: 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  rTable(pParse, i
84a0: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
84b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
84c0: 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 72 65  _NewRowid, 0, re
84d0: 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g1);.    sqlite3
84e0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
84f0: 5f 42 6c 6f 62 2c 20 36 2c 20 72 65 67 33 2c 20  _Blob, 6, reg3, 
8500: 30 2c 20 6e 75 6c 6c 52 6f 77 2c 20 50 34 5f 53  0, nullRow, P4_S
8510: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
8520: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8530: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72   OP_Insert, 0, r
8540: 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  eg3, reg1);.    
8550: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8560: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
8570: 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74  PEND);.    sqlit
8580: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
8590: 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a  OP_Close);.  }..
85a0: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e    /* Normal (non
85b0: 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20  -error) return. 
85c0: 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  */.  return;..  
85d0: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
85e0: 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68  ccurs, we jump h
85f0: 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62  ere */.begin_tab
8600: 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  le_error:.  sqli
8610: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
8620: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
8630: 7d 0a 0a 2f 2a 20 53 65 74 20 70 72 6f 70 65 72  }../* Set proper
8640: 74 69 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20  ties of a table 
8650: 63 6f 6c 75 6d 6e 20 62 61 73 65 64 20 6f 6e 20  column based on 
8660: 74 68 65 20 28 6d 61 67 69 63 61 6c 29 0a 2a 2a  the (magical).**
8670: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   name of the col
8680: 75 6d 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  umn..*/.#if SQLI
8690: 54 45 5f 45 4e 41 42 4c 45 5f 48 49 44 44 45 4e  TE_ENABLE_HIDDEN
86a0: 5f 43 4f 4c 55 4d 4e 53 0a 76 6f 69 64 20 73 71  _COLUMNS.void sq
86b0: 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65  lite3ColumnPrope
86c0: 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 54 61  rtiesFromName(Ta
86d0: 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f 6c 75 6d  ble *pTab, Colum
86e0: 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20 69 66 28 20  n *pCol){.  if( 
86f0: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
8700: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 5f  (pCol->zName, "_
8710: 5f 68 69 64 64 65 6e 5f 5f 22 2c 20 31 30 29 3d  _hidden__", 10)=
8720: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e  =0 ){.    pCol->
8730: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
8740: 4c 41 47 5f 48 49 44 44 45 4e 3b 0a 20 20 7d 65  LAG_HIDDEN;.  }e
8750: 6c 73 65 20 69 66 28 20 70 54 61 62 20 26 26 20  lse if( pTab && 
8760: 70 43 6f 6c 21 3d 70 54 61 62 2d 3e 61 43 6f 6c  pCol!=pTab->aCol
8770: 20 26 26 20 28 70 43 6f 6c 5b 2d 31 5d 2e 63 6f   && (pCol[-1].co
8780: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
8790: 5f 48 49 44 44 45 4e 29 20 29 7b 0a 20 20 20 20  _HIDDEN) ){.    
87a0: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
87b0: 3d 20 54 46 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a  = TF_OOOHidden;.
87c0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
87d0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63  *.** Add a new c
87e0: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62  olumn to the tab
87f0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
8800: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a  ng constructed..
8810: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
8820: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
8830: 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ine once for eac
8840: 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  h column declara
8850: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45  tion.** in a CRE
8860: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
8870: 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61  ent.  sqlite3Sta
8880: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
8890: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
88a0: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
88b0: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
88c0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
88d0: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
88e0: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
88f0: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61  ite3AddColumn(Pa
8900: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
8910: 65 6e 20 2a 70 4e 61 6d 65 2c 20 54 6f 6b 65 6e  en *pName, Token
8920: 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c   *pType){.  Tabl
8930: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
8940: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72   char *z;.  char
8950: 20 2a 7a 54 79 70 65 3b 0a 20 20 43 6f 6c 75 6d   *zType;.  Colum
8960: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74  n *pCol;.  sqlit
8970: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
8980: 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  >db;.  if( (p = 
8990: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
89a0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
89b0: 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e    if( p->nCol+1>
89c0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
89d0: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
89e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
89f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8a00: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
8a10: 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d   on %s", p->zNam
8a20: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
8a30: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
8a40: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
8a50: 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 70 54 79 70   pName->n + pTyp
8a60: 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20 20 69 66 28  e->n + 2);.  if(
8a70: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
8a80: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d    memcpy(z, pNam
8a90: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
8aa0: 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20 3d  .  z[pName->n] =
8ab0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71   0;.  sqlite3Deq
8ac0: 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69  uote(z);.  for(i
8ad0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
8ae0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
8af0: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c 20  ite3_stricmp(z, 
8b00: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
8b10: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
8b20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8b30: 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65  arse, "duplicate
8b40: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73   column name: %s
8b50: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", z);.      sql
8b60: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
8b70: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
8b80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
8b90: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
8ba0: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
8bb0: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
8bc0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
8bd0: 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c  lloc(db,p->aCol,
8be0: 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65  (p->nCol+8)*size
8bf0: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
8c00: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
8c10: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8c20: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
8c30: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
8c40: 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20    }.    p->aCol 
8c50: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43  = aNew;.  }.  pC
8c60: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
8c70: 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCol];.  memset
8c80: 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCol, 0, sizeof
8c90: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
8ca0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
8cb0: 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  ;.  sqlite3Colum
8cc0: 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e  nPropertiesFromN
8cd0: 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a 20 0a  ame(p, pCol);. .
8ce0: 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d    if( pType->n==
8cf0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
8d00: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
8d10: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
8d20: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
8d30: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 20  ult affinity.   
8d40: 20 2a 2a 20 27 42 4c 4f 42 27 20 77 69 74 68 20   ** 'BLOB' with 
8d50: 61 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f  a default size o
8d60: 66 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  f 4 bytes. */.  
8d70: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
8d80: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
8d90: 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a  OB;.    pCol->sz
8da0: 45 73 74 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  Est = 1;.#ifdef 
8db0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
8dc0: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
8dd0: 20 20 20 20 69 66 28 20 34 3e 3d 73 71 6c 69 74      if( 4>=sqlit
8de0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
8df0: 7a 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20  zSorterRef ){.  
8e00: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
8e10: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53 4f  gs |= COLFLAG_SO
8e20: 52 54 45 52 52 45 46 3b 0a 20 20 20 20 7d 0a 23  RTERREF;.    }.#
8e30: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
8e40: 20 20 20 7a 54 79 70 65 20 3d 20 7a 20 2b 20 73     zType = z + s
8e50: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
8e60: 29 20 2b 20 31 3b 0a 20 20 20 20 6d 65 6d 63 70  ) + 1;.    memcp
8e70: 79 28 7a 54 79 70 65 2c 20 70 54 79 70 65 2d 3e  y(zType, pType->
8e80: 7a 2c 20 70 54 79 70 65 2d 3e 6e 29 3b 0a 20 20  z, pType->n);.  
8e90: 20 20 7a 54 79 70 65 5b 70 54 79 70 65 2d 3e 6e    zType[pType->n
8ea0: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
8eb0: 65 33 44 65 71 75 6f 74 65 28 7a 54 79 70 65 29  e3Dequote(zType)
8ec0: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  ;.    pCol->affi
8ed0: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66  nity = sqlite3Af
8ee0: 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65  finityType(zType
8ef0: 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 70 43 6f  , pCol);.    pCo
8f00: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
8f10: 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a  OLFLAG_HASTYPE;.
8f20: 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b    }.  p->nCol++;
8f30: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  .  pParse->const
8f40: 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b  raintName.n = 0;
8f50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
8f60: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8f70: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
8f80: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
8f90: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
8fa0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
8fb0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e  statement.  A "N
8fc0: 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
8fd0: 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  int has.** been 
8fe0: 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  seen on a column
8ff0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
9000: 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c  sets the notNull
9010: 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20   flag on.** the 
9020: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
9030: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
9040: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
9050: 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50  ite3AddNotNull(P
9060: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
9070: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
9080: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
9090: 20 2a 70 43 6f 6c 3b 0a 20 20 70 20 3d 20 70 50   *pCol;.  p = pP
90a0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
90b0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e  .  if( p==0 || N
90c0: 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20  EVER(p->nCol<1) 
90d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
90e0: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
90f0: 43 6f 6c 2d 31 5d 3b 0a 20 20 70 43 6f 6c 2d 3e  Col-1];.  pCol->
9100: 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e  notNull = (u8)on
9110: 45 72 72 6f 72 3b 0a 20 20 70 2d 3e 74 61 62 46  Error;.  p->tabF
9120: 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 4e 6f  lags |= TF_HasNo
9130: 74 4e 75 6c 6c 3b 0a 0a 20 20 2f 2a 20 53 65 74  tNull;..  /* Set
9140: 20 74 68 65 20 75 6e 69 71 4e 6f 74 4e 75 6c 6c   the uniqNotNull
9150: 20 66 6c 61 67 20 6f 6e 20 61 6e 79 20 55 4e 49   flag on any UNI
9160: 51 55 45 20 6f 72 20 50 4b 20 69 6e 64 65 78 65  QUE or PK indexe
9170: 73 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65  s already create
9180: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 63  d.  ** on this c
9190: 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  olumn.  */.  if(
91a0: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
91b0: 26 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45  & COLFLAG_UNIQUE
91c0: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
91d0: 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
91e0: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
91f0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
9200: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
9210: 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  rt( pIdx->nKeyCo
9220: 6c 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e  l==1 && pIdx->on
9230: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
9240: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
9250: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 70  ->aiColumn[0]==p
9260: 2d 3e 6e 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20  ->nCol-1 ){.    
9270: 20 20 20 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f      pIdx->uniqNo
9280: 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20  tNull = 1;.     
9290: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
92a0: 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63  /*.** Scan the c
92b0: 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20  olumn type name 
92c0: 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54  zType (length nT
92d0: 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ype) and return 
92e0: 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  the.** associate
92f0: 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e  d affinity type.
9300: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9310: 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d  ine does a case-
9320: 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72  independent sear
9330: 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20  ch of zType for 
9340: 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e  the .** substrin
9350: 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  gs in the follow
9360: 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e  ing table. If on
9370: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
9380: 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c  ngs is.** found,
9390: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
93a0: 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72  ng affinity is r
93b0: 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70  eturned. If zTyp
93c0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f  e contains.** mo
93d0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74  re than one of t
93e0: 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65  he substrings, e
93f0: 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68  ntries toward th
9400: 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65  e top of .** the
9410: 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f   table take prio
9420: 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c  rity. For exampl
9430: 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27  e, if zType is '
9440: 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51  BLOBINT', .** SQ
9450: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
9460: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
9470: 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20  .** Substring   
9480: 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20    | Affinity.** 
9490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94b0: 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20  .** 'INT'       
94c0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49    | SQLITE_AFF_I
94d0: 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27  NTEGER.** 'CHAR'
94e0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
94f0: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c  _AFF_TEXT.** 'CL
9500: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
9510: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
9520: 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20  'TEXT'        | 
9530: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
9540: 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20  ** 'BLOB'       
9550: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   | SQLITE_AFF_BL
9560: 4f 42 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20  OB.** 'REAL'    
9570: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
9580: 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20  _REAL.** 'FLOA' 
9590: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
95a0: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55  AFF_REAL.** 'DOU
95b0: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
95c0: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a  TE_AFF_REAL.**.*
95d0: 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
95e0: 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74   substrings in t
95f0: 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61  he above table a
9600: 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c  re found,.** SQL
9610: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9620: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
9630: 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69  char sqlite3Affi
9640: 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63  nityType(const c
9650: 68 61 72 20 2a 7a 49 6e 2c 20 43 6f 6c 75 6d 6e  har *zIn, Column
9660: 20 2a 70 43 6f 6c 29 7b 0a 20 20 75 33 32 20 68   *pCol){.  u32 h
9670: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66   = 0;.  char aff
9680: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55   = SQLITE_AFF_NU
9690: 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63  MERIC;.  const c
96a0: 68 61 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a  har *zChar = 0;.
96b0: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 6e 21 3d  .  assert( zIn!=
96c0: 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49  0 );.  while( zI
96d0: 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20  n[0] ){.    h = 
96e0: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
96f0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a  UpperToLower[(*z
9700: 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a  In)&0xff];.    z
9710: 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d  In++;.    if( h=
9720: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27  =(('c'<<24)+('h'
9730: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
9740: 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  r') ){          
9750: 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20     /* CHAR */.  
9760: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9770: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20  _AFF_TEXT;.     
9780: 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20   zChar = zIn;.  
9790: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
97a0: 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('c'<<24)+('l'<<
97b0: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
97c0: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c  ) ){       /* CL
97d0: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  OB */.      aff 
97e0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
97f0: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
9800: 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28   h==(('t'<<24)+(
9810: 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38  'e'<<16)+('x'<<8
9820: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20  )+'t') ){       
9830: 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20  /* TEXT */.     
9840: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9850: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
9860: 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c  e if( h==(('b'<<
9870: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
9880: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  o'<<8)+'b')     
9890: 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a       /* BLOB */.
98a0: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
98b0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
98c0: 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  RIC || aff==SQLI
98d0: 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a  TE_AFF_REAL) ){.
98e0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
98f0: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
9900: 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27     if( zIn[0]=='
9910: 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e  (' ) zChar = zIn
9920: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
9930: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
9940: 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69  OINT.    }else i
9950: 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29  f( h==(('r'<<24)
9960: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c  +('e'<<16)+('a'<
9970: 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20  <8)+'l')        
9980: 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20    /* REAL */.   
9990: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
99a0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
99b0: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
99c0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
99d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
99e0: 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('f'<<24)+('l'
99f0: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
9a00: 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a')          /* 
9a10: 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20  FLOA */.        
9a20: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
9a30: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
9a40: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9a50: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
9a60: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64  else if( h==(('d
9a70: 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29  '<<24)+('o'<<16)
9a80: 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20  +('u'<<8)+'b')  
9a90: 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20          /* DOUB 
9aa0: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
9ab0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
9ac0: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
9ad0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9ae0: 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  REAL;.#endif.   
9af0: 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78   }else if( (h&0x
9b00: 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27  00FFFFFF)==(('i'
9b10: 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27  <<16)+('n'<<8)+'
9b20: 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54  t') ){    /* INT
9b30: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
9b40: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
9b50: 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ER;.      break;
9b60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9b70: 20 49 66 20 70 43 6f 6c 20 69 73 20 6e 6f 74 20   If pCol is not 
9b80: 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65  NULL, store an e
9b90: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66  stimate of the f
9ba0: 69 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a  ield size.  The.
9bb0: 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73    ** estimate is
9bc0: 20 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20   scaled so that 
9bd0: 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69  the size of an i
9be0: 6e 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f  nteger is 1.  */
9bf0: 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20  .  if( pCol ){. 
9c00: 20 20 20 69 6e 74 20 76 20 3d 20 30 3b 20 20 20     int v = 0;   
9c10: 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20  /* default size 
9c20: 69 73 20 61 70 70 72 6f 78 20 34 20 62 79 74 65  is approx 4 byte
9c30: 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66  s */.    if( aff
9c40: 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  <SQLITE_AFF_NUME
9c50: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28  RIC ){.      if(
9c60: 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20   zChar ){.      
9c70: 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30    while( zChar[0
9c80: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ] ){.          i
9c90: 66 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  f( sqlite3Isdigi
9ca0: 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20  t(zChar[0]) ){. 
9cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c             /* BL
9cc0: 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28 6b  OB(k), VARCHAR(k
9cd0: 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d  ), CHAR(k) -> r=
9ce0: 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20  (k/4+1) */.     
9cf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65         sqlite3Ge
9d00: 74 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76  tInt32(zChar, &v
9d10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
9d20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
9d30: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68 61  }.          zCha
9d40: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  r++;.        }. 
9d50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9d60: 20 20 20 20 76 20 3d 20 31 36 3b 20 20 20 2f 2a      v = 16;   /*
9d70: 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f   BLOB, TEXT, CLO
9d80: 42 20 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f  B -> r=5  (appro
9d90: 78 20 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20  x 20 bytes)*/.  
9da0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64      }.    }.#ifd
9db0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
9dc0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
9dd0: 45 53 0a 20 20 20 20 69 66 28 20 76 3e 3d 73 71  ES.    if( v>=sq
9de0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
9df0: 67 2e 73 7a 53 6f 72 74 65 72 52 65 66 20 29 7b  g.szSorterRef ){
9e00: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c  .      pCol->col
9e10: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
9e20: 5f 53 4f 52 54 45 52 52 45 46 3b 0a 20 20 20 20  _SORTERREF;.    
9e30: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 76 20 3d  }.#endif.    v =
9e40: 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 69 66   v/4 + 1;.    if
9e50: 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32 35  ( v>255 ) v = 25
9e60: 35 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45  5;.    pCol->szE
9e70: 73 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65  st = v;.  }.  re
9e80: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
9e90: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
9ea0: 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  n is the default
9eb0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d   value for the m
9ec0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
9ed0: 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20  ed column.** of 
9ee0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
9ef0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
9f00: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65  uction..**.** De
9f10: 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72  fault value expr
9f20: 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  essions must be 
9f30: 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65  constant.  Raise
9f40: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66   an exception if
9f50: 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20   this.** is not 
9f60: 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  the case..**.** 
9f70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
9f80: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
9f90: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
9fa0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
9fb0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
9fc0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
9fd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9fe0: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
9ff0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a000: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
a010: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
a020: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
a030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a040: 54 68 65 20 70 61 72 73 65 64 20 65 78 70 72 65  The parsed expre
a050: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 64 65 66  ssion of the def
a060: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20  ault value */.  
a070: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61  const char *zSta
a080: 72 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 61 72  rt,      /* Star
a090: 74 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  t of the default
a0a0: 20 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 20   value text */. 
a0b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e   const char *zEn
a0c0: 64 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  d         /* Fir
a0d0: 73 74 20 63 68 61 72 61 63 74 65 72 20 70 61 73  st character pas
a0e0: 74 20 65 6e 64 20 6f 66 20 64 65 66 61 75 74 20  t end of defaut 
a0f0: 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 29 7b  value text */.){
a100: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
a110: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73  olumn *pCol;.  s
a120: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
a130: 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70  rse->db;.  p = p
a140: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
a150: 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a  ;.  if( p!=0 ){.
a160: 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e      pCol = &(p->
a170: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29  aCol[p->nCol-1])
a180: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
a190: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
a1a0: 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70 72  OrFunction(pExpr
a1b0: 2c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29  , db->init.busy)
a1c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a1d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a1e0: 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65  , "default value
a1f0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20   of column [%s] 
a200: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22  is not constant"
a210: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  ,.          pCol
a220: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ->zName);.    }e
a230: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
a240: 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73  copy of pExpr is
a250: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
a260: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61   the original, a
a270: 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73  s pExpr contains
a280: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73  .      ** tokens
a290: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76   that point to v
a2a0: 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 0a  olatile memory..
a2b0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45        */.      E
a2c0: 78 70 72 20 78 3b 0a 20 20 20 20 20 20 73 71 6c  xpr x;.      sql
a2d0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
a2e0: 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b  b, pCol->pDflt);
a2f0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 78  .      memset(&x
a300: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b  , 0, sizeof(x));
a310: 0a 20 20 20 20 20 20 78 2e 6f 70 20 3d 20 54 4b  .      x.op = TK
a320: 5f 53 50 41 4e 3b 0a 20 20 20 20 20 20 78 2e 75  _SPAN;.      x.u
a330: 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65  .zToken = sqlite
a340: 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a  3DbSpanDup(db, z
a350: 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20  Start, zEnd);.  
a360: 20 20 20 20 78 2e 70 4c 65 66 74 20 3d 20 70 45      x.pLeft = pE
a370: 78 70 72 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61  xpr;.      x.fla
a380: 67 73 20 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20  gs = EP_Skip;.  
a390: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
a3a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a3b0: 28 64 62 2c 20 26 78 2c 20 45 58 50 52 44 55 50  (db, &x, EXPRDUP
a3c0: 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20  _REDUCE);.      
a3d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a3e0: 2c 20 78 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  , x.u.zToken);. 
a3f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
a400: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
a410: 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
a420: 2a 20 42 61 63 6b 77 61 72 64 73 20 43 6f 6d 70  * Backwards Comp
a430: 61 74 69 62 69 6c 69 74 79 20 48 61 63 6b 3a 0a  atibility Hack:.
a440: 2a 2a 20 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61  ** .** Historica
a450: 6c 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  l versions of SQ
a460: 4c 69 74 65 20 61 63 63 65 70 74 65 64 20 73 74  Lite accepted st
a470: 72 69 6e 67 73 20 61 73 20 63 6f 6c 75 6d 6e 20  rings as column 
a480: 6e 61 6d 65 73 20 69 6e 0a 2a 2a 20 69 6e 64 65  names in.** inde
a490: 78 65 73 20 61 6e 64 20 50 52 49 4d 41 52 59 20  xes and PRIMARY 
a4a0: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  KEY constraints 
a4b0: 61 6e 64 20 69 6e 20 55 4e 49 51 55 45 20 63 6f  and in UNIQUE co
a4c0: 6e 73 74 72 61 69 6e 74 73 2e 20 20 45 78 61 6d  nstraints.  Exam
a4d0: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43  ple:.**.**     C
a4e0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 79 7a 28  REATE TABLE xyz(
a4f0: 61 2c 62 2c 63 2c 64 2c 65 2c 50 52 49 4d 41 52  a,b,c,d,e,PRIMAR
a500: 59 20 4b 45 59 28 27 61 27 29 2c 55 4e 49 51 55  Y KEY('a'),UNIQU
a510: 45 28 27 62 27 2c 27 63 27 20 43 4f 4c 4c 41 54  E('b','c' COLLAT
a520: 45 20 74 72 69 6d 29 0a 2a 2a 20 20 20 20 20 43  E trim).**     C
a530: 52 45 41 54 45 20 49 4e 44 45 58 20 61 62 63 20  REATE INDEX abc 
a540: 4f 4e 20 78 79 7a 28 27 63 27 2c 27 64 27 20 44  ON xyz('c','d' D
a550: 45 53 43 2c 27 65 27 20 43 4f 4c 4c 41 54 45 20  ESC,'e' COLLATE 
a560: 6e 6f 63 61 73 65 20 44 45 53 43 29 3b 0a 2a 2a  nocase DESC);.**
a570: 0a 2a 2a 20 54 68 69 73 20 69 73 20 67 6f 6f 66  .** This is goof
a580: 79 2e 20 20 42 75 74 20 74 6f 20 70 72 65 73 65  y.  But to prese
a590: 72 76 65 20 62 61 63 6b 77 61 72 64 73 20 63 6f  rve backwards co
a5a0: 6d 70 61 74 69 62 69 6c 69 74 79 20 77 65 20 63  mpatibility we c
a5b0: 6f 6e 74 69 6e 75 65 20 74 6f 0a 2a 2a 20 61 63  ontinue to.** ac
a5c0: 63 65 70 74 20 69 74 2e 20 20 54 68 69 73 20 72  cept it.  This r
a5d0: 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
a5e0: 6e 65 63 65 73 73 61 72 79 20 63 6f 6e 76 65 72  necessary conver
a5f0: 73 69 6f 6e 2e 20 20 49 74 20 63 6f 6e 76 65 72  sion.  It conver
a600: 74 73 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  ts.** the expres
a610: 73 69 6f 6e 20 67 69 76 65 6e 20 69 6e 20 69 74  sion given in it
a620: 73 20 61 72 67 75 6d 65 6e 74 20 66 72 6f 6d 20  s argument from 
a630: 61 20 54 4b 5f 53 54 52 49 4e 47 20 69 6e 74 6f  a TK_STRING into
a640: 20 61 20 54 4b 5f 49 44 0a 2a 2a 20 69 66 20 74   a TK_ID.** if t
a650: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
a660: 20 6a 75 73 74 20 61 20 54 4b 5f 53 54 52 49 4e   just a TK_STRIN
a670: 47 20 77 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e  G with an option
a680: 61 6c 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73  al COLLATE claus
a690: 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 70 78  e..** If the epx
a6a0: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 79 74 68  ression is anyth
a6b0: 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 54  ing other than T
a6c0: 4b 5f 53 54 52 49 4e 47 2c 20 74 68 65 20 65 78  K_STRING, the ex
a6d0: 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 75  pression is.** u
a6e0: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61  nchanged..*/.sta
a6f0: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
a700: 53 74 72 69 6e 67 54 6f 49 64 28 45 78 70 72 20  StringToId(Expr 
a710: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  *p){.  if( p->op
a720: 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20  ==TK_STRING ){. 
a730: 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44     p->op = TK_ID
a740: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
a750: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
a760: 26 26 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  && p->pLeft->op=
a770: 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20  =TK_STRING ){.  
a780: 20 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d    p->pLeft->op =
a790: 20 54 4b 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f   TK_ID;.  }.}../
a7a0: 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74  *.** Designate t
a7b0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66  he PRIMARY KEY f
a7c0: 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70  or the table.  p
a7d0: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
a7e0: 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63  f names .** of c
a7f0: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d  olumns that form
a800: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
a810: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e  .  If pList is N
a820: 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ULL, then the.**
a830: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
a840: 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  dded column of t
a850: 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  he table is the 
a860: 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a  primary key..**.
a870: 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68  ** A table can h
a880: 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
a890: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
a8a0: 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
a8b0: 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d  dy has.** a prim
a8c0: 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69  ary key (and thi
a8d0: 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  s is the second 
a8e0: 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65  primary key) the
a8f0: 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65  n create an.** e
a900: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
a910: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
a920: 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f  s on a single co
a930: 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74  lumn whose datat
a940: 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a  ype is INTEGER,.
a950: 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  ** then we will 
a960: 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20  try to use that 
a970: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f  column as the ro
a980: 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61  wid.  Set the Ta
a990: 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65  ble.iPKey.** fie
a9a0: 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ld of the table 
a9b0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
a9c0: 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64  on to be the ind
a9d0: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54  ex of the.** INT
a9e0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
a9f0: 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e   column.  Table.
aa00: 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20  iPKey is set to 
aa10: 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a  -1 if there is.*
aa20: 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  * no INTEGER PRI
aa30: 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20  MARY KEY..**.** 
aa40: 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f  If the key is no
aa50: 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
aa60: 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63  MARY KEY, then c
aa70: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a  reate a unique.*
aa80: 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  * index for the 
aa90: 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69  key.  No index i
aaa0: 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e  s created for IN
aab0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
aac0: 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Ys..*/.void sqli
aad0: 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
aae0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
aaf0: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
ab00: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
ab10: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
ab20: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64  /* List of field
ab30: 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64   names to be ind
ab40: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
ab50: 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57  Error,      /* W
ab60: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61  hat to do with a
ab70: 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66   uniqueness conf
ab80: 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75  lict */.  int au
ab90: 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54  toInc,      /* T
aba0: 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49  rue if the AUTOI
abb0: 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64  NCREMENT keyword
abc0: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
abd0: 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20   int sortOrder  
abe0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f     /* SQLITE_SO_
abf0: 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f  ASC or SQLITE_SO
ac00: 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61  _DESC */.){.  Ta
ac10: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
ac20: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
ac30: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20   Column *pCol = 
ac40: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
ac50: 2d 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65  -1, i;.  int nTe
ac60: 72 6d 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  rm;.  if( pTab==
ac70: 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79  0 ) goto primary
ac80: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28  _key_exit;.  if(
ac90: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
aca0: 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b  & TF_HasPrimaryK
acb0: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
acc0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
acd0: 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20  , .      "table 
ace0: 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20  \"%s\" has more 
acf0: 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79  than one primary
ad00: 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61   key", pTab->zNa
ad10: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72  me);.    goto pr
ad20: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
ad30: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62 46    }.  pTab->tabF
ad40: 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50 72  lags |= TF_HasPr
ad50: 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28 20  imaryKey;.  if( 
ad60: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
ad70: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  iCol = pTab->nCo
ad80: 6c 20 2d 20 31 3b 0a 20 20 20 20 70 43 6f 6c 20  l - 1;.    pCol 
ad90: 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
ada0: 6f 6c 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63  ol];.    pCol->c
adb0: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
adc0: 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20  AG_PRIMKEY;.    
add0: 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c  nTerm = 1;.  }el
ade0: 73 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20  se{.    nTerm = 
adf0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
ae00: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65    for(i=0; i<nTe
ae10: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
ae20: 45 78 70 72 20 2a 70 43 45 78 70 72 20 3d 20 73  Expr *pCExpr = s
ae30: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
ae40: 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  llate(pList->a[i
ae50: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
ae60: 61 73 73 65 72 74 28 20 70 43 45 78 70 72 21 3d  assert( pCExpr!=
ae70: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
ae80: 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70 43 45  e3StringToId(pCE
ae90: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
aea0: 70 43 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  pCExpr->op==TK_I
aeb0: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  D ){.        con
aec0: 73 74 20 63 68 61 72 20 2a 7a 43 4e 61 6d 65 20  st char *zCName 
aed0: 3d 20 70 43 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  = pCExpr->u.zTok
aee0: 65 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  en;.        for(
aef0: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
af00: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
af10: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
af20: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
af30: 43 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  CName, pTab->aCo
af40: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d  l[iCol].zName)==
af50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
af60: 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61   pCol = &pTab->a
af70: 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  Col[iCol];.     
af80: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c         pCol->col
af90: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
afa0: 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20  _PRIMKEY;.      
afb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
afc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
afd0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
afe0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d  .  }.  if( nTerm
aff0: 3d 3d 31 0a 20 20 20 26 26 20 70 43 6f 6c 0a 20  ==1.   && pCol. 
b000: 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49    && sqlite3StrI
b010: 43 6d 70 28 73 71 6c 69 74 65 33 43 6f 6c 75 6d  Cmp(sqlite3Colum
b020: 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c 20  nType(pCol,""), 
b030: 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20  "INTEGER")==0.  
b040: 20 26 26 20 73 6f 72 74 4f 72 64 65 72 21 3d 53   && sortOrder!=S
b050: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 0a 20 20  QLITE_SO_DESC.  
b060: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  ){.    pTab->iPK
b070: 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70  ey = iCol;.    p
b080: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28  Tab->keyConf = (
b090: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  u8)onError;.    
b0a0: 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d  assert( autoInc=
b0b0: 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31  =0 || autoInc==1
b0c0: 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61   );.    pTab->ta
b0d0: 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e  bFlags |= autoIn
b0e0: 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  c*TF_Autoincreme
b0f0: 6e 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  nt;.    if( pLis
b100: 74 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b 53  t ) pParse->iPkS
b110: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74  ortOrder = pList
b120: 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
b130: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75  ;.  }else if( au
b140: 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66  toInc ){.#ifndef
b150: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
b160: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73  OINCREMENT.    s
b170: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
b180: 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52  Parse, "AUTOINCR
b190: 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c  EMENT is only al
b1a0: 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20  lowed on an ".  
b1b0: 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52       "INTEGER PR
b1c0: 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e  IMARY KEY");.#en
b1d0: 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
b1e0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
b1f0: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
b200: 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72  , 0, pList, onEr
b210: 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ror, 0,.        
b220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b230: 20 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c     0, sortOrder,
b240: 20 30 2c 20 53 51 4c 49 54 45 5f 49 44 58 54 59   0, SQLITE_IDXTY
b250: 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a  PE_PRIMARYKEY);.
b260: 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
b270: 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f   }..primary_key_
b280: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45  exit:.  sqlite3E
b290: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
b2a0: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29  arse->db, pList)
b2b0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
b2c0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43  *.** Add a new C
b2d0: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
b2e0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
b2f0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
b300: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
b310: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65  id sqlite3AddChe
b320: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ckConstraint(.  
b330: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b340: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
b350: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
b360: 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54  pCheckExpr  /* T
b370: 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73  he check express
b380: 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  ion */.){.#ifnde
b390: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
b3a0: 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ECK.  Table *pTa
b3b0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
b3c0: 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33  Table;.  sqlite3
b3d0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b3e0: 62 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26  b;.  if( pTab &&
b3f0: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
b400: 42 0a 20 20 20 26 26 20 21 73 71 6c 69 74 65 33  B.   && !sqlite3
b410: 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28  BtreeIsReadonly(
b420: 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e 69 74  db->aDb[db->init
b430: 2e 69 44 62 5d 2e 70 42 74 29 0a 20 20 29 7b 0a  .iDb].pBt).  ){.
b440: 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b      pTab->pCheck
b450: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
b460: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
b470: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70   pTab->pCheck, p
b480: 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20 20  CheckExpr);.    
b490: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73  if( pParse->cons
b4a0: 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a  traintName.n ){.
b4b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b4c0: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
b4d0: 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63  rse, pTab->pChec
b4e0: 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73  k, &pParse->cons
b4f0: 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a  traintName, 1);.
b500: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65      }.  }else.#e
b510: 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
b520: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
b530: 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65 63  Parse->db, pChec
b540: 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  kExpr);.  }.}../
b550: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c  *.** Set the col
b560: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
b570: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
b580: 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c  ntly parsed tabl
b590: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74  e column.** to t
b5a0: 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e  he CollSeq given
b5b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b5c0: 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28  3AddCollateType(
b5d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
b5e0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
b5f0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
b600: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   i;.  char *zCol
b610: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
b620: 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65  /* Dequoted name
b630: 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   of collation se
b640: 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69  quence */.  sqli
b650: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
b660: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
b670: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
b680: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
b690: 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61  ol-1;.  db = pPa
b6a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c  rse->db;.  zColl
b6b0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
b6c0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
b6d0: 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c  en);.  if( !zCol
b6e0: 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  l ) return;..  i
b6f0: 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  f( sqlite3Locate
b700: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
b710: 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e  zColl) ){.    In
b720: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 73  dex *pIdx;.    s
b730: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
b740: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
b750: 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b  l);.    p->aCol[
b760: 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c  i].zColl = zColl
b770: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  ;.  .    /* If t
b780: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63  he column is dec
b790: 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e  lared as "<name>
b7a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c   PRIMARY KEY COL
b7b0: 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20  LATE <type>",.  
b7c0: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64    ** then an ind
b7d0: 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ex may have been
b7e0: 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73   created on this
b7f0: 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74   column before t
b800: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  he.    ** collat
b810: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64  ion type was add
b820: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73  ed. Correct this
b830: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61   if it is the ca
b840: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  se..    */.    f
b850: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65  or(pIdx=p->pInde
b860: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
b870: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
b880: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
b890: 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  nKeyCol==1 );.  
b8a0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
b8b0: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a  Column[0]==i ){.
b8c0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
b8d0: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f  Coll[0] = p->aCo
b8e0: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[i].zColl;.    
b8f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
b900: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  e{.    sqlite3Db
b910: 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
b920: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
b930: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
b940: 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  rns the collatio
b950: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64  n sequence for d
b960: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74  atabase native t
b970: 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  ext.** encoding 
b980: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
b990: 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20  e string zName, 
b9a0: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a  length nName..**
b9b0: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
b9c0: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  sted collation s
b9d0: 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61  equence is not a
b9e0: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74  vailable, or not
b9f0: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e   available.** in
ba00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
ba10: 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74  tive encoding, t
ba20: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
ba30: 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20  tory is invoked 
ba40: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74  to.** request it
ba50: 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  . If the collati
ba60: 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20  on factory does 
ba70: 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20  not supply such 
ba80: 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61  a sequence,.** a
ba90: 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  nd the sequence 
baa0: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
bab0: 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  another text enc
bac0: 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74  oding, then that
bad0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
bae0: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
baf0: 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66  f no versions of
bb00: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
bb10: 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e  ollations sequen
bb20: 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ce are available
bb30: 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  , or.** another 
bb40: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
bb50: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
bb60: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
bb70: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
bb80: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a  .** pParse..**.*
bb90: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
bba0: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
bbb0: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  nd sqlite3FindCo
bbc0: 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72  llSeq().  This r
bbd0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65  outine.** invoke
bbe0: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
bbf0: 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e  factory if the n
bc00: 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63  amed collation c
bc10: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a  annot be found.*
bc20: 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20  * and generates 
bc30: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
bc40: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
bc50: 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  : sqlite3FindCol
bc60: 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47  lSeq(), sqlite3G
bc70: 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43  etCollSeq().*/.C
bc80: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
bc90: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
bca0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
bcb0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
bcc0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
bcd0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38  pParse->db;.  u8
bce0: 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
bcf0: 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20    u8 initbusy = 
bd00: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20  db->init.busy;. 
bd10: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
bd20: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
bd30: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
bd40: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69  b, enc, zName, i
bd50: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20  nitbusy);.  if( 
bd60: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70  !initbusy && (!p
bd70: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
bd80: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f  xCmp) ){.    pCo
bd90: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
bda0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 65  ollSeq(pParse, e
bdb0: 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65  nc, pColl, zName
bdc0: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
bdd0: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pColl;.}.../*.*
bde0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
bdf0: 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d  that will increm
be00: 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  ent the schema c
be10: 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ookie..**.** The
be20: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69   schema cookie i
be30: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
be40: 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68  ine when the sch
be50: 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64  ema for the.** d
be60: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
be70: 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68    After each sch
be80: 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20  ema change, the 
be90: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20  cookie value.** 
bea0: 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61  changes.  When a
beb0: 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72   process first r
bec0: 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20  eads the schema 
bed0: 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a  it records the.*
bee0: 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65  * cookie.  There
bef0: 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20  after, whenever 
bf00: 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73  it goes to acces
bf10: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  s the database,.
bf20: 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65  ** it checks the
bf30: 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20   cookie to make 
bf40: 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20  sure the schema 
bf50: 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a  has not changed.
bf60: 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ** since it was 
bf70: 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  last read..**.**
bf80: 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f   This plan is no
bf90: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c  t completely bul
bfa0: 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69  let-proof.  It i
bfb0: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a  s possible for.*
bfc0: 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20  * the schema to 
bfd0: 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20  change multiple 
bfe0: 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68  times and for th
bff0: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a  e cookie to be.*
c000: 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72  * set back to pr
c010: 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20  ior value.  But 
c020: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61  schema changes a
c030: 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a  re infrequent.**
c040: 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69   and the probabi
c050: 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20  lity of hitting 
c060: 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20  the same cookie 
c070: 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a  value is only.**
c080: 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33   1 chance in 2^3
c090: 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66  2.  So we're saf
c0a0: 65 20 65 6e 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20  e enough..**.** 
c0b0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
c0c0: 46 3a 20 52 2d 33 34 32 33 30 2d 35 36 30 34 39  F: R-34230-56049
c0d0: 20 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 69   SQLite automati
c0e0: 63 61 6c 6c 79 20 69 6e 63 72 65 6d 65 6e 74 73  cally increments
c0f0: 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76  .** the schema-v
c100: 65 72 73 69 6f 6e 20 77 68 65 6e 65 76 65 72 20  ersion whenever 
c110: 74 68 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  the schema chang
c120: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
c130: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
c140: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
c150: 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74  nt iDb){.  sqlit
c160: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
c170: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  >db;.  Vdbe *v =
c180: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
c190: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c1a0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
c1b0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
c1c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c1d0: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
c1e0: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f  kie, iDb, BTREE_
c1f0: 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20  SCHEMA_VERSION, 
c200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c210: 20 20 20 20 28 69 6e 74 29 28 31 2b 28 75 6e 73      (int)(1+(uns
c220: 69 67 6e 65 64 29 64 62 2d 3e 61 44 62 5b 69 44  igned)db->aDb[iD
c230: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  b].pSchema->sche
c240: 6d 61 5f 63 6f 6f 6b 69 65 29 29 3b 0a 7d 0a 0a  ma_cookie));.}..
c250: 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68  /*.** Measure th
c260: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
c270: 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f  acters needed to
c280: 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   output the give
c290: 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e  n.** identifier.
c2a0: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74    The number ret
c2b0: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61  urned includes a
c2c0: 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a  ny quotes used.*
c2d0: 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69  * but does not i
c2e0: 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20  nclude the null 
c2f0: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a  terminator..**.*
c300: 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69  * The estimate i
c310: 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20  s conservative. 
c320: 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72   It might be lar
c330: 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73  ger that what is
c340: 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65  .** really neede
c350: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
c360: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e   identLength(con
c370: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
c380: 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b  nt n;.  for(n=0;
c390: 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a   *z; n++, z++){.
c3a0: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20      if( *z=='"' 
c3b0: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  ){ n++; }.  }.  
c3c0: 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a  return n + 2;.}.
c3d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
c3e0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
c3f0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75  pointer to an ou
c400: 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 65  tput buffer. The
c410: 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61   second .** para
c420: 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
c430: 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  er to an integer
c440: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
c450: 68 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20  he offset at.** 
c460: 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 69  which to write i
c470: 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62  nto the output b
c480: 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63  uffer. This func
c490: 74 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a  tion copies the.
c4a0: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  ** nul-terminate
c4b0: 64 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64  d string pointed
c4c0: 20 74 6f 20 62 79 20 74 68 65 20 74 68 69 72 64   to by the third
c4d0: 20 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67   parameter, zSig
c4e0: 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20  nedIdent,.** to 
c4f0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 66  the specified of
c500: 66 73 65 74 20 69 6e 20 74 68 65 20 62 75 66 66  fset in the buff
c510: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a  er and updates *
c520: 70 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a  pIdx to refer.**
c530: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
c540: 74 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  te after the las
c550: 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 62  t byte written b
c560: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
c570: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73  .** .** If the s
c580: 74 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65  tring zSignedIde
c590: 6e 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  nt consists enti
c5a0: 72 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75  rely of alpha-nu
c5b0: 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74  meric.** charact
c5c0: 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65  ers, does not be
c5d0: 67 69 6e 20 77 69 74 68 20 61 20 64 69 67 69 74  gin with a digit
c5e0: 20 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53   and is not an S
c5f0: 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74  QL keyword,.** t
c600: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
c610: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62   to the output b
c620: 75 66 66 65 72 20 65 78 61 63 74 6c 79 20 61 73  uffer exactly as
c630: 20 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73   it is. Otherwis
c640: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74  e,.** it is quot
c650: 65 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d  ed using double-
c660: 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  quotes..*/.stati
c670: 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28  c void identPut(
c680: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49  char *z, int *pI
c690: 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65  dx, char *zSigne
c6a0: 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67  dIdent){.  unsig
c6b0: 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74  ned char *zIdent
c6c0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
c6d0: 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b  r*)zSignedIdent;
c6e0: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65  .  int i, j, nee
c6f0: 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70  dQuote;.  i = *p
c700: 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b  Idx;..  for(j=0;
c710: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
c720: 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  {.    if( !sqlit
c730: 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74  e3Isalnum(zIdent
c740: 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a  [j]) && zIdent[j
c750: 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a  ]!='_' ) break;.
c760: 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20    }.  needQuote 
c770: 3d 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  = sqlite3Isdigit
c780: 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20  (zIdent[0]).    
c790: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
c7a0: 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49  e3KeywordCode(zI
c7b0: 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a  dent, j)!=TK_ID.
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 7a              || z
c7d0: 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20  Ident[j]!=0.    
c7e0: 20 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b          || j==0;
c7f0: 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  ..  if( needQuot
c800: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
c810: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
c820: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
c830: 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e    z[i++] = zIden
c840: 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49  t[j];.    if( zI
c850: 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a  dent[j]=='"' ) z
c860: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d  [i++] = '"';.  }
c870: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
c880: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
c890: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a  .  z[i] = 0;.  *
c8a0: 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a  pIdx = i;.}../*.
c8b0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52  ** Generate a CR
c8c0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
c8d0: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
c8e0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
c8f0: 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79  * table.  Memory
c900: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78   to hold the tex
c910: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
c920: 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  nt is obtained.*
c930: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  * from sqliteMal
c940: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
c950: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
c960: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
c970: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
c980: 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74  *createTableStmt
c990: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
c9a0: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
c9b0: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
c9c0: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
c9d0: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
c9e0: 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  nd;.  Column *pC
c9f0: 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66  ol;.  n = 0;.  f
ca00: 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f  or(pCol = p->aCo
ca10: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
ca20: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
ca30: 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c  .    n += identL
ca40: 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  ength(pCol->zNam
ca50: 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20  e) + 5;.  }.  n 
ca60: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
ca70: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
ca80: 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65  n<50 ){ .    zSe
ca90: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
caa0: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
cab0: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
cac0: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
cad0: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
cae0: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
caf0: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
cb00: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d    n += 35 + 6*p-
cb10: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
cb20: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
cb30: 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28  Raw(0, n);.  if(
cb40: 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20   zStmt==0 ){.   
cb50: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
cb60: 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (db);.    return
cb70: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
cb80: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53  3_snprintf(n, zS
cb90: 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42  tmt, "CREATE TAB
cba0: 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c  LE ");.  k = sql
cbb0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74  ite3Strlen30(zSt
cbc0: 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28  mt);.  identPut(
cbd0: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e  zStmt, &k, p->zN
cbe0: 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b  ame);.  zStmt[k+
cbf0: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28  +] = '(';.  for(
cc00: 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d  pCol=p->aCol, i=
cc10: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
cc20: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
cc30: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
cc40: 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65  r * const azType
cc50: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f  [] = {.        /
cc60: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  * SQLITE_AFF_BLO
cc70: 42 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20  B    */ "",.    
cc80: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
cc90: 46 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20 54  F_TEXT    */ " T
cca0: 45 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  EXT",.        /*
ccb0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
ccc0: 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20  RIC */ " NUM",. 
ccd0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
cce0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20  _AFF_INTEGER */ 
ccf0: 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20  " INT",.        
cd00: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  /* SQLITE_AFF_RE
cd10: 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22  AL    */ " REAL"
cd20: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
cd30: 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  len;.    const c
cd40: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20  har *zType;..   
cd50: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
cd60: 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d  f(n-k, &zStmt[k]
cd70: 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b  , zSep);.    k +
cd80: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
cd90: 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20  0(&zStmt[k]);.  
cda0: 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a    zSep = zSep2;.
cdb0: 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74      identPut(zSt
cdc0: 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e  mt, &k, pCol->zN
cdd0: 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ame);.    assert
cde0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
cdf0: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  -SQLITE_AFF_BLOB
ce00: 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73   >= 0 );.    ass
ce10: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
ce20: 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ity-SQLITE_AFF_B
ce30: 4c 4f 42 20 3c 20 41 72 72 61 79 53 69 7a 65 28  LOB < ArraySize(
ce40: 61 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74  azType) );.    t
ce50: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
ce60: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
ce70: 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20  AFF_BLOB );.    
ce80: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
ce90: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
cea0: 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20  _AFF_TEXT );.   
ceb0: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
cec0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
ced0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b  E_AFF_NUMERIC );
cee0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
cef0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
cf00: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
cf10: 52 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  R );.    testcas
cf20: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
cf30: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
cf40: 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a  AL );.    .    z
cf50: 54 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43  Type = azType[pC
cf60: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53  ol->affinity - S
cf70: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b  QLITE_AFF_BLOB];
cf80: 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  .    len = sqlit
cf90: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65  e3Strlen30(zType
cfa0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
cfb0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
cfc0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a  QLITE_AFF_BLOB .
cfd0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
cfe0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73  Col->affinity==s
cff0: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
d000: 70 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a  pe(zType, 0) );.
d010: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d      memcpy(&zStm
d020: 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e  t[k], zType, len
d030: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b  );.    k += len;
d040: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d  .    assert( k<=
d050: 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n );.  }.  sqlit
d060: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c  e3_snprintf(n-k,
d070: 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22   &zStmt[k], "%s"
d080: 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72  , zEnd);.  retur
d090: 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zStmt;.}../*.*
d0a0: 2a 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65  * Resize an Inde
d0b0: 78 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64  x object to hold
d0c0: 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c   N columns total
d0d0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
d0e0: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
d0f0: 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d  s and SQLITE_NOM
d100: 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72  EM on an OOM err
d110: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
d120: 74 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a  t resizeIndexObj
d130: 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ect(sqlite3 *db,
d140: 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e   Index *pIdx, in
d150: 74 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  t N){.  char *zE
d160: 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74  xtra;.  int nByt
d170: 65 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e  e;.  if( pIdx->n
d180: 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75  Column>=N ) retu
d190: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
d1a0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73  assert( pIdx->is
d1b0: 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20  Resized==0 );.  
d1c0: 6e 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28  nByte = (sizeof(
d1d0: 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28  char*) + sizeof(
d1e0: 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a  i16) + 1)*N;.  z
d1f0: 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44  Extra = sqlite3D
d200: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
d210: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45  nByte);.  if( zE
d220: 78 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e  xtra==0 ) return
d230: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
d240: 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  PT;.  memcpy(zEx
d250: 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  tra, pIdx->azCol
d260: 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  l, sizeof(char*)
d270: 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b  *pIdx->nColumn);
d280: 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20  .  pIdx->azColl 
d290: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  = (const char**)
d2a0: 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61  zExtra;.  zExtra
d2b0: 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 2a   += sizeof(char*
d2c0: 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45  )*N;.  memcpy(zE
d2d0: 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f  xtra, pIdx->aiCo
d2e0: 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36  lumn, sizeof(i16
d2f0: 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  )*pIdx->nColumn)
d300: 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ;.  pIdx->aiColu
d310: 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78 74 72  mn = (i16*)zExtr
d320: 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73  a;.  zExtra += s
d330: 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20  izeof(i16)*N;.  
d340: 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70  memcpy(zExtra, p
d350: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  Idx->aSortOrder,
d360: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b   pIdx->nColumn);
d370: 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  .  pIdx->aSortOr
d380: 64 65 72 20 3d 20 28 75 38 2a 29 7a 45 78 74 72  der = (u8*)zExtr
d390: 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  a;.  pIdx->nColu
d3a0: 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e  mn = N;.  pIdx->
d3b0: 69 73 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20  isResized = 1;. 
d3c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d3d0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  K;.}../*.** Esti
d3e0: 6d 61 74 65 20 74 68 65 20 74 6f 74 61 6c 20 72  mate the total r
d3f0: 6f 77 20 77 69 64 74 68 20 66 6f 72 20 61 20 74  ow width for a t
d400: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
d410: 76 6f 69 64 20 65 73 74 69 6d 61 74 65 54 61 62  void estimateTab
d420: 6c 65 57 69 64 74 68 28 54 61 62 6c 65 20 2a 70  leWidth(Table *p
d430: 54 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Tab){.  unsigned
d440: 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63   wTable = 0;.  c
d450: 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61  onst Column *pTa
d460: 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  bCol;.  int i;. 
d470: 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f   for(i=pTab->nCo
d480: 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d  l, pTabCol=pTab-
d490: 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c  >aCol; i>0; i--,
d4a0: 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20   pTabCol++){.   
d4b0: 20 77 54 61 62 6c 65 20 2b 3d 20 70 54 61 62 43   wTable += pTabC
d4c0: 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20  ol->szEst;.  }. 
d4d0: 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79   if( pTab->iPKey
d4e0: 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20  <0 ) wTable++;. 
d4f0: 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
d500: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
d510: 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a  wTable*4);.}../*
d520: 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
d530: 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66   average size of
d540: 20 61 20 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e   a row for an in
d550: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
d560: 6f 69 64 20 65 73 74 69 6d 61 74 65 49 6e 64 65  oid estimateInde
d570: 78 57 69 64 74 68 28 49 6e 64 65 78 20 2a 70 49  xWidth(Index *pI
d580: 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  dx){.  unsigned 
d590: 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e  wIndex = 0;.  in
d5a0: 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  t i;.  const Col
d5b0: 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78  umn *aCol = pIdx
d5c0: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a  ->pTable->aCol;.
d5d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
d5e0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
d5f0: 7b 0a 20 20 20 20 69 31 36 20 78 20 3d 20 70 49  {.    i16 x = pI
d600: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
d610: 0a 20 20 20 20 61 73 73 65 72 74 28 20 78 3c 70  .    assert( x<p
d620: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f  Idx->pTable->nCo
d630: 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78 20  l );.    wIndex 
d640: 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f  += x<0 ? 1 : aCo
d650: 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  l[pIdx->aiColumn
d660: 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a  [i]].szEst;.  }.
d670: 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77    pIdx->szIdxRow
d680: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
d690: 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f  (wIndex*4);.}../
d6a0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
d6b0: 20 76 61 6c 75 65 20 78 20 69 73 20 66 6f 75 6e   value x is foun
d6c0: 64 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72  d any of the fir
d6d0: 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20  st nCol entries 
d6e0: 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74  of aiCol[].*/.st
d6f0: 61 74 69 63 20 69 6e 74 20 68 61 73 43 6f 6c 75  atic int hasColu
d700: 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a 61 69  mn(const i16 *ai
d710: 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69  Col, int nCol, i
d720: 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c 65 28 20  nt x){.  while( 
d730: 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28  nCol-- > 0 ) if(
d740: 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29   x==*(aiCol++) )
d750: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
d760: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
d770: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  This routine run
d780: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
d790: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
d7a0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
d7b0: 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 20 57   that.** has a W
d7c0: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 63 6c 61  ITHOUT ROWID cla
d7d0: 75 73 65 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66  use.  The job of
d7e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
d7f0: 20 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f 74 68   to convert both
d800: 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  .** internal sch
d810: 65 6d 61 20 64 61 74 61 20 73 74 72 75 63 74 75  ema data structu
d820: 72 65 73 20 61 6e 64 20 74 68 65 20 67 65 6e 65  res and the gene
d830: 72 61 74 65 64 20 56 44 42 45 20 63 6f 64 65 20  rated VDBE code 
d840: 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  so that they.** 
d850: 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  are appropriate 
d860: 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f  for a WITHOUT RO
d870: 57 49 44 20 74 61 62 6c 65 20 69 6e 73 74 65 61  WID table instea
d880: 64 20 6f 66 20 61 20 72 6f 77 69 64 20 74 61 62  d of a rowid tab
d890: 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73 20 69  le..** Changes i
d8a0: 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  nclude:.**.**   
d8b0: 20 20 28 31 29 20 20 53 65 74 20 61 6c 6c 20 63    (1)  Set all c
d8c0: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52  olumns of the PR
d8d0: 49 4d 41 52 59 20 4b 45 59 20 73 63 68 65 6d 61  IMARY KEY schema
d8e0: 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 4e 4f   object to be NO
d8f0: 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20 20 28  T NULL..**     (
d900: 32 29 20 20 43 6f 6e 76 65 72 74 20 50 33 20 70  2)  Convert P3 p
d910: 61 72 61 6d 65 74 65 72 20 6f 66 20 74 68 65 20  arameter of the 
d920: 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 20 66  OP_CreateBtree f
d930: 72 6f 6d 20 42 54 52 45 45 5f 49 4e 54 4b 45 59  rom BTREE_INTKEY
d940: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e   .**          in
d950: 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59  to BTREE_BLOBKEY
d960: 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 42 79  ..**     (3)  By
d970: 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69 6f  pass the creatio
d980: 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  n of the sqlite_
d990: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74  master table ent
d9a0: 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ry.**          f
d9b0: 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  or the PRIMARY K
d9c0: 45 59 20 61 73 20 74 68 65 20 70 72 69 6d 61 72  EY as the primar
d9d0: 79 20 6b 65 79 20 69 6e 64 65 78 20 69 73 20 6e  y key index is n
d9e0: 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  ow.**          i
d9f0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
da00: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
da10: 61 62 6c 65 20 65 6e 74 72 79 20 6f 66 20 74 68  able entry of th
da20: 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 0a  e table itself..
da30: 2a 2a 20 20 20 20 20 28 34 29 20 20 53 65 74 20  **     (4)  Set 
da40: 74 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d 20 6f  the Index.tnum o
da50: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
da60: 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  Y Index object i
da70: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
da80: 20 20 73 63 68 65 6d 61 20 74 6f 20 74 68 65 20    schema to the 
da90: 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20 74 68  rootpage from th
daa0: 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a  e main table..**
dab0: 20 20 20 20 20 28 35 29 20 20 41 64 64 20 61 6c       (5)  Add al
dac0: 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  l table columns 
dad0: 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  to the PRIMARY K
dae0: 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 0a  EY Index object.
daf0: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 20 74  **          so t
db00: 68 61 74 20 74 68 65 20 50 52 49 4d 41 52 59 20  hat the PRIMARY 
db10: 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72 69 6e  KEY is a coverin
db20: 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20 73 75  g index.  The su
db30: 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20 20 20  rplus.**        
db40: 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 61    columns are pa
db50: 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e 6e 41  rt of KeyInfo.nA
db60: 6c 6c 46 69 65 6c 64 20 61 6e 64 20 61 72 65 20  llField and are 
db70: 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  not used for.** 
db80: 20 20 20 20 20 20 20 20 20 73 6f 72 74 69 6e 67           sorting
db90: 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e   or lookup or un
dba0: 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b 73 2e  iqueness checks.
dbb0: 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52 65 70  .**     (6)  Rep
dbc0: 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64 20 74  lace the rowid t
dbd0: 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d  ail on all autom
dbe0: 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74  atically generat
dbf0: 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20  ed UNIQUE.**    
dc00: 20 20 20 20 20 20 69 6e 64 69 63 65 73 20 77 69        indices wi
dc10: 74 68 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  th the PRIMARY K
dc20: 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a  EY columns..**.*
dc30: 2a 20 46 6f 72 20 76 69 72 74 75 61 6c 20 74 61  * For virtual ta
dc40: 62 6c 65 73 2c 20 6f 6e 6c 79 20 28 31 29 20 69  bles, only (1) i
dc50: 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2f 0a  s performed..*/.
dc60: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 76  static void conv
dc70: 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69  ertToWithoutRowi
dc80: 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  dTable(Parse *pP
dc90: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
dca0: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  b){.  Index *pId
dcb0: 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b  x;.  Index *pPk;
dcc0: 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e  .  int nPk;.  in
dcd0: 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65  t i, j;.  sqlite
dce0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
dcf0: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  db;.  Vdbe *v = 
dd00: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a  pParse->pVdbe;..
dd10: 20 20 2f 2a 20 4d 61 72 6b 20 65 76 65 72 79 20    /* Mark every 
dd20: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
dd30: 6d 6e 20 61 73 20 4e 4f 54 20 4e 55 4c 4c 20 28  mn as NOT NULL (
dd40: 65 78 63 65 70 74 20 66 6f 72 20 69 6d 70 6f 73  except for impos
dd50: 74 65 72 20 74 61 62 6c 65 73 29 0a 20 20 2a 2f  ter tables).  */
dd60: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
dd70: 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29  .imposterTable )
dd80: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
dd90: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
dda0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  ){.      if( (pT
ddb0: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46  ab->aCol[i].colF
ddc0: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50  lags & COLFLAG_P
ddd0: 52 49 4d 4b 45 59 29 21 3d 30 20 29 7b 0a 20 20  RIMKEY)!=0 ){.  
dde0: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
ddf0: 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 4f 45  [i].notNull = OE
de00: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
de10: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
de20: 54 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 72  The remaining tr
de30: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 20 6f 6e  ansformations on
de40: 6c 79 20 61 70 70 6c 79 20 74 6f 20 62 2d 74 72  ly apply to b-tr
de50: 65 65 20 74 61 62 6c 65 73 2c 20 6e 6f 74 20 74  ee tables, not t
de60: 6f 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74  o.  ** virtual t
de70: 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 49  ables */.  if( I
de80: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
de90: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 43   return;..  /* C
dea0: 6f 6e 76 65 72 74 20 74 68 65 20 50 33 20 6f 70  onvert the P3 op
deb0: 65 72 61 6e 64 20 6f 66 20 74 68 65 20 4f 50 5f  erand of the OP_
dec0: 43 72 65 61 74 65 42 74 72 65 65 20 6f 70 63 6f  CreateBtree opco
ded0: 64 65 20 66 72 6f 6d 20 42 54 52 45 45 5f 49 4e  de from BTREE_IN
dee0: 54 4b 45 59 0a 20 20 2a 2a 20 69 6e 74 6f 20 42  TKEY.  ** into B
def0: 54 52 45 45 5f 42 4c 4f 42 4b 45 59 2e 0a 20 20  TREE_BLOBKEY..  
df00: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
df10: 3e 61 64 64 72 43 72 54 61 62 20 29 7b 0a 20 20  >addrCrTab ){.  
df20: 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20    assert( v );. 
df30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
df40: 61 6e 67 65 50 33 28 76 2c 20 70 50 61 72 73 65  angeP3(v, pParse
df50: 2d 3e 61 64 64 72 43 72 54 61 62 2c 20 42 54 52  ->addrCrTab, BTR
df60: 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a 20 20 7d  EE_BLOBKEY);.  }
df70: 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
df80: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
df90: 64 65 78 2e 20 20 4f 72 2c 20 69 66 20 74 68 69  dex.  Or, if thi
dfa0: 73 20 74 61 62 6c 65 20 77 61 73 20 6f 72 69 67  s table was orig
dfb0: 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61 6e 20 49  inally.  ** an I
dfc0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
dfd0: 45 59 20 74 61 62 6c 65 2c 20 63 72 65 61 74 65  EY table, create
dfe0: 20 61 20 6e 65 77 20 50 52 49 4d 41 52 59 20 4b   a new PRIMARY K
dff0: 45 59 20 69 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a  EY index. .  */.
e000: 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
e010: 79 3e 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72  y>=0 ){.    Expr
e020: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20  List *pList;.   
e030: 20 54 6f 6b 65 6e 20 69 70 6b 54 6f 6b 65 6e 3b   Token ipkToken;
e040: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65  .    sqlite3Toke
e050: 6e 49 6e 69 74 28 26 69 70 6b 54 6f 6b 65 6e 2c  nInit(&ipkToken,
e060: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
e070: 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b  ->iPKey].zName);
e080: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
e090: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
e0a0: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 0a 20  nd(pParse, 0, . 
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0c0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
e0d0: 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 69 70  c(db, TK_ID, &ip
e0e0: 6b 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20  kToken, 0));.   
e0f0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
e100: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 69 73  return;.    pLis
e110: 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  t->a[0].sortOrde
e120: 72 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 6b 53  r = pParse->iPkS
e130: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 61 73  ortOrder;.    as
e140: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e  sert( pParse->pN
e150: 65 77 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b  ewTable==pTab );
e160: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65 61  .    sqlite3Crea
e170: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
e180: 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20  0, 0, 0, pList, 
e190: 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30  pTab->keyConf, 0
e1a0: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  , 0, 0, 0,.     
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1c0: 20 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45    SQLITE_IDXTYPE
e1d0: 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20  _PRIMARYKEY);.  
e1e0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
e1f0: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
e200: 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74  .    pPk = sqlit
e210: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
e220: 78 28 70 54 61 62 29 3b 0a 20 20 20 20 70 54 61  x(pTab);.    pTa
e230: 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
e240: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 20   }else{.    pPk 
e250: 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
e260: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
e270: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52  .    /*.    ** R
e280: 65 6d 6f 76 65 20 61 6c 6c 20 72 65 64 75 6e 64  emove all redund
e290: 61 6e 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  ant columns from
e2a0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
e2b0: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
e2c0: 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 22 50  change.    ** "P
e2d0: 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 61  RIMARY KEY(a,b,a
e2e0: 2c 62 2c 63 2c 62 2c 63 2c 64 29 22 20 69 6e 74  ,b,c,b,c,d)" int
e2f0: 6f 20 6a 75 73 74 20 22 50 52 49 4d 41 52 59 20  o just "PRIMARY 
e300: 4b 45 59 28 61 2c 62 2c 63 2c 64 29 22 2e 20 20  KEY(a,b,c,d)".  
e310: 4c 61 74 65 72 0a 20 20 20 20 2a 2a 20 63 6f 64  Later.    ** cod
e320: 65 20 61 73 73 75 6d 65 73 20 74 68 65 20 50 52  e assumes the PR
e330: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 74 61 69  IMARY KEY contai
e340: 6e 73 20 6e 6f 20 72 65 70 65 61 74 65 64 20 63  ns no repeated c
e350: 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20  olumns..    */. 
e360: 20 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c     for(i=j=1; i<
e370: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b  pPk->nKeyCol; i+
e380: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61  +){.      if( ha
e390: 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43  sColumn(pPk->aiC
e3a0: 6f 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61  olumn, j, pPk->a
e3b0: 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20  iColumn[i]) ){. 
e3c0: 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c         pPk->nCol
e3d0: 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c  umn--;.      }el
e3e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d  se{.        pPk-
e3f0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d  >aiColumn[j++] =
e400: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
e410: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
e420: 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  .    pPk->nKeyCo
e430: 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20 61 73 73  l = j;.  }.  ass
e440: 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20  ert( pPk!=0 );. 
e450: 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72 69 6e 67   pPk->isCovering
e460: 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 64 62 2d   = 1;.  if( !db-
e470: 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61  >init.imposterTa
e480: 62 6c 65 20 29 20 70 50 6b 2d 3e 75 6e 69 71 4e  ble ) pPk->uniqN
e490: 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 6e 50  otNull = 1;.  nP
e4a0: 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  k = pPk->nKeyCol
e4b0: 3b 0a 0a 20 20 2f 2a 20 42 79 70 61 73 73 20 74  ;..  /* Bypass t
e4c0: 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74  he creation of t
e4d0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 62  he PRIMARY KEY b
e4e0: 74 72 65 65 20 61 6e 64 20 74 68 65 20 73 71 6c  tree and the sql
e4f0: 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20  ite_master.  ** 
e500: 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 54 68 69  table entry. Thi
e510: 73 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72  s is only requir
e520: 65 64 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20  ed if currently 
e530: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 0a  generating VDBE.
e540: 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72 20 61 20    ** code for a 
e550: 43 52 45 41 54 45 20 54 41 42 4c 45 20 28 6e 6f  CREATE TABLE (no
e560: 74 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 6f  t when parsing o
e570: 6e 65 20 61 73 20 70 61 72 74 20 6f 66 20 72 65  ne as part of re
e580: 61 64 69 6e 67 0a 20 20 2a 2a 20 61 20 64 61 74  ading.  ** a dat
e590: 61 62 61 73 65 20 73 63 68 65 6d 61 29 2e 20 20  abase schema).  
e5a0: 2a 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70 50  */.  if( v && pP
e5b0: 6b 2d 3e 74 6e 75 6d 3e 30 20 29 7b 0a 20 20 20  k->tnum>0 ){.   
e5c0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69   assert( db->ini
e5d0: 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20  t.busy==0 );.   
e5e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
e5f0: 67 65 4f 70 63 6f 64 65 28 76 2c 20 70 50 6b 2d  geOpcode(v, pPk-
e600: 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74 6f 29 3b  >tnum, OP_Goto);
e610: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
e620: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
e630: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 74  PRIMARY KEY is t
e640: 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61  he table root pa
e650: 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75  ge */.  pPk->tnu
e660: 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a  m = pTab->tnum;.
e670: 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
e680: 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
e690: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  sentation of all
e6a0: 20 55 4e 49 51 55 45 20 69 6e 64 69 63 65 73 20   UNIQUE indices 
e6b0: 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20  by converting.  
e6c0: 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  ** the final row
e6d0: 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f  id column into o
e6e0: 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d  ne or more colum
e6f0: 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  ns of the PRIMAR
e700: 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f  Y KEY..  */.  fo
e710: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
e720: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
e730: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
e740: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28    int n;.    if(
e750: 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64   IsPrimaryKeyInd
e760: 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69  ex(pIdx) ) conti
e770: 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e  nue;.    for(i=n
e780: 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b  =0; i<nPk; i++){
e790: 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43  .      if( !hasC
e7a0: 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f  olumn(pIdx->aiCo
e7b0: 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  lumn, pIdx->nKey
e7c0: 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  Col, pPk->aiColu
e7d0: 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20  mn[i]) ) n++;.  
e7e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30    }.    if( n==0
e7f0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
e800: 73 20 69 6e 64 65 78 20 69 73 20 61 20 73 75 70  s index is a sup
e810: 65 72 73 65 74 20 6f 66 20 74 68 65 20 70 72 69  erset of the pri
e820: 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20  mary key */.    
e830: 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20    pIdx->nColumn 
e840: 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  = pIdx->nKeyCol;
e850: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
e860: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
e870: 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74  esizeIndexObject
e880: 28 64 62 2c 20 70 49 64 78 2c 20 70 49 64 78 2d  (db, pIdx, pIdx-
e890: 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65  >nKeyCol+n) ) re
e8a0: 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  turn;.    for(i=
e8b0: 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  0, j=pIdx->nKeyC
e8c0: 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b  ol; i<nPk; i++){
e8d0: 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43  .      if( !hasC
e8e0: 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f  olumn(pIdx->aiCo
e8f0: 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  lumn, pIdx->nKey
e900: 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  Col, pPk->aiColu
e910: 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  mn[i]) ){.      
e920: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
e930: 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c  [j] = pPk->aiCol
e940: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  umn[i];.        
e950: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20  pIdx->azColl[j] 
e960: 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  = pPk->azColl[i]
e970: 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  ;.        j++;. 
e980: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e990: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
e9a0: 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b  Column>=pIdx->nK
e9b0: 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61  eyCol+n );.    a
e9c0: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
e9d0: 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a  lumn>=j );.  }..
e9e0: 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61 62    /* Add all tab
e9f0: 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  le columns to th
ea00: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
ea10: 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  dex.  */.  if( n
ea20: 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  Pk<pTab->nCol ){
ea30: 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49  .    if( resizeI
ea40: 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70  ndexObject(db, p
ea50: 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Pk, pTab->nCol) 
ea60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f  ) return;.    fo
ea70: 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c  r(i=0, j=nPk; i<
ea80: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
ea90: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73  {.      if( !has
eaa0: 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f  Column(pPk->aiCo
eab0: 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20  lumn, j, i) ){. 
eac0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
ead0: 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  <pPk->nColumn );
eae0: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69  .        pPk->ai
eaf0: 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20  Column[j] = i;. 
eb00: 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f         pPk->azCo
eb10: 6c 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53  ll[j] = sqlite3S
eb20: 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20  trBINARY;.      
eb30: 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    j++;.      }. 
eb40: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
eb50: 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a   pPk->nColumn==j
eb60: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
eb70: 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b  pTab->nCol==j );
eb80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
eb90: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61  k->nColumn = pTa
eba0: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a  b->nCol;.  }.}..
ebb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
ebc0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
ebd0: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
ebe0: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
ebf0: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
ec00: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
ec10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
ec20: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
ec30: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
ec40: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
ec50: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
ec60: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
ec70: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
ec80: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
ec90: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
eca0: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
ecb0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
ecc0: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
ecd0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
ece0: 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73   on disk, unless
ecf0: 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65  .** this is a te
ed00: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
ed10: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
ed20: 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69  1.  When db->ini
ed30: 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20  t.busy==1.** it 
ed40: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
ed50: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
ed60: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
ed70: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
ed80: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
ed90: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
eda0: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
edb0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
edc0: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
edd0: 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74  nged, so the ent
ede0: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
edf0: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
ee00: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
ee10: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
ee20: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
ee30: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
ee40: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
ee50: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
ee60: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
ee70: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
ee80: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
ee90: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
eea0: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
eeb0: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
eec0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
eed0: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
eee0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
eef0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
ef00: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
ef10: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
ef20: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
ef30: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
ef40: 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  d sqlite3EndTabl
ef50: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
ef60: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
ef70: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
ef80: 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c  .  Token *pCons,
ef90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
efa0: 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65  e ',' token afte
efb0: 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  r the last colum
efc0: 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  n defn. */.  Tok
efd0: 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  en *pEnd,       
efe0: 20 20 20 20 20 2f 2a 20 54 68 65 20 27 29 27 20       /* The ')' 
eff0: 62 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69  before options i
f000: 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
f010: 4c 45 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70  LE */.  u8 tabOp
f020: 74 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ts,             
f030: 2f 2a 20 45 78 74 72 61 20 74 61 62 6c 65 20 6f  /* Extra table o
f040: 70 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20  ptions. Usually 
f050: 30 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  0. */.  Select *
f060: 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20  pSelect         
f070: 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61  /* Select from a
f080: 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20   "CREATE ... AS 
f090: 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20  SELECT" */.){.  
f0a0: 54 61 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20  Table *p;       
f0b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
f0c0: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
f0d0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
f0e0: 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65  arse->db; /* The
f0f0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
f100: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  tion */.  int iD
f110: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
f120: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
f130: 69 6e 20 77 68 69 63 68 20 74 68 65 20 74 61 62  in which the tab
f140: 6c 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e  le lives */.  In
f150: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
f160: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d          /* An im
f170: 70 6c 69 65 64 20 69 6e 64 65 78 20 6f 66 20 74  plied index of t
f180: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69  he table */..  i
f190: 66 28 20 70 45 6e 64 3d 3d 30 20 26 26 20 70 53  f( pEnd==0 && pS
f1a0: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
f1b0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
f1c0: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
f1d0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 70 20 3d  cFailed );.  p =
f1e0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
f1f0: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  le;.  if( p==0 )
f200: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49   return;..  /* I
f210: 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
f220: 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e  usy is 1 it mean
f230: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
f240: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
f250: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
f260: 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65  ster" or "sqlite
f270: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61  _temp_master" ta
f280: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
f290: 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20  .  ** So do not 
f2a0: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73  write to the dis
f2b0: 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  k again.  Extrac
f2c0: 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
f2d0: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
f2e0: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
f2f0: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  he db->init.newT
f300: 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65  num field.  (The
f310: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
f320: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  * should have be
f330: 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20  en put there by 
f340: 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62  the sqliteOpenCb
f350: 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2a 0a   routine.).  **.
f360: 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74    ** If the root
f370: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
f380: 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  1, that means th
f390: 69 73 20 69 73 20 74 68 65 20 73 71 6c 69 74 65  is is the sqlite
f3a0: 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62  _master.  ** tab
f3b0: 6c 65 20 69 74 73 65 6c 66 2e 20 20 53 6f 20 6d  le itself.  So m
f3c0: 61 72 6b 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79  ark it read-only
f3d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
f3e0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
f3f0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
f400: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
f410: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
f420: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
f430: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74  ;.    }.    p->t
f440: 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
f450: 65 77 54 6e 75 6d 3b 0a 20 20 20 20 69 66 28 20  ewTnum;.    if( 
f460: 70 2d 3e 74 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e  p->tnum==1 ) p->
f470: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 52  tabFlags |= TF_R
f480: 65 61 64 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20  eadonly;.  }..  
f490: 2f 2a 20 53 70 65 63 69 61 6c 20 70 72 6f 63 65  /* Special proce
f4a0: 73 73 69 6e 67 20 66 6f 72 20 57 49 54 48 4f 55  ssing for WITHOU
f4b0: 54 20 52 4f 57 49 44 20 54 61 62 6c 65 73 20 2a  T ROWID Tables *
f4c0: 2f 0a 20 20 69 66 28 20 74 61 62 4f 70 74 73 20  /.  if( tabOpts 
f4d0: 26 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69  & TF_WithoutRowi
f4e0: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  d ){.    if( (p-
f4f0: 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
f500: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b  utoincrement) ){
f510: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
f520: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
f530: 20 20 20 20 20 20 20 20 20 22 41 55 54 4f 49 4e           "AUTOIN
f540: 43 52 45 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f  CREMENT not allo
f550: 77 65 64 20 6f 6e 20 57 49 54 48 4f 55 54 20 52  wed on WITHOUT R
f560: 4f 57 49 44 20 74 61 62 6c 65 73 22 29 3b 0a 20  OWID tables");. 
f570: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
f580: 20 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74   }.    if( (p->t
f590: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
f5a0: 50 72 69 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29  PrimaryKey)==0 )
f5b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
f5c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
f5d0: 22 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 69 73  "PRIMARY KEY mis
f5e0: 73 69 6e 67 20 6f 6e 20 74 61 62 6c 65 20 25 73  sing on table %s
f5f0: 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  ", p->zName);.  
f600: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
f610: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
f620: 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 7c 20  _WithoutRowid | 
f630: 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69  TF_NoVisibleRowi
f640: 64 3b 0a 20 20 20 20 20 20 63 6f 6e 76 65 72 74  d;.      convert
f650: 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61  ToWithoutRowidTa
f660: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ble(pParse, p);.
f670: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62      }.  }..  iDb
f680: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
f690: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
f6a0: 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
f6b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
f6c0: 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  ECK.  /* Resolve
f6d0: 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48   names in all CH
f6e0: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65  ECK constraint e
f6f0: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
f700: 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b  .  if( p->pCheck
f710: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
f720: 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65  esolveSelfRefere
f730: 6e 63 65 28 70 50 61 72 73 65 2c 20 70 2c 20 4e  nce(pParse, p, N
f740: 43 5f 49 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d  C_IsCheck, 0, p-
f750: 3e 70 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65  >pCheck);.  }.#e
f760: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
f770: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45  (SQLITE_OMIT_CHE
f780: 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74  CK) */..  /* Est
f790: 69 6d 61 74 65 20 74 68 65 20 61 76 65 72 61 67  imate the averag
f7a0: 65 20 72 6f 77 20 73 69 7a 65 20 66 6f 72 20 74  e row size for t
f7b0: 68 65 20 74 61 62 6c 65 20 61 6e 64 20 66 6f 72  he table and for
f7c0: 20 61 6c 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64   all implied ind
f7d0: 69 63 65 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61  ices */.  estima
f7e0: 74 65 54 61 62 6c 65 57 69 64 74 68 28 70 29 3b  teTableWidth(p);
f7f0: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70  .  for(pIdx=p->p
f800: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
f810: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
f820: 20 20 20 20 65 73 74 69 6d 61 74 65 49 6e 64 65      estimateInde
f830: 78 57 69 64 74 68 28 70 49 64 78 29 3b 0a 20 20  xWidth(pIdx);.  
f840: 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69  }..  /* If not i
f850: 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65  nitializing, the
f860: 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72  n create a recor
f870: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  d for the new ta
f880: 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ble.  ** in the 
f890: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
f8a0: 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ble of the datab
f8b0: 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ase..  **.  ** I
f8c0: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
f8d0: 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69  ORARY table, wri
f8e0: 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74  te the entry int
f8f0: 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a  o the auxiliary.
f900: 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61    ** file instea
f910: 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61  d of into the ma
f920: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
f930: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
f940: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
f950: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64     int n;.    Vd
f960: 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
f970: 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76  *zType;    /* "v
f980: 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20  iew" or "table" 
f990: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  */.    char *zTy
f9a0: 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22  pe2;   /* "VIEW"
f9b0: 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20   or "TABLE" */. 
f9c0: 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20     char *zStmt; 
f9d0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68     /* Text of th
f9e0: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f  e CREATE TABLE o
f9f0: 72 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  r CREATE VIEW st
fa00: 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20  atement */..    
fa10: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
fa20: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
fa30: 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
fa40: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73  ) return;..    s
fa50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
fa60: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29  (v, OP_Close, 0)
fa70: 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a  ;..    /* .    *
fa80: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79  * Initialize zTy
fa90: 70 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76  pe for the new v
faa0: 69 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20  iew or table..  
fab0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
fac0: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
fad0: 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72      /* A regular
fae0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
faf0: 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b  zType = "table";
fb00: 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20  .      zType2 = 
fb10: 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66  "TABLE";.#ifndef
fb20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
fb30: 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  W.    }else{.   
fb40: 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a     /* A view */.
fb50: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76        zType = "v
fb60: 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70  iew";.      zTyp
fb70: 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e  e2 = "VIEW";.#en
fb80: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
fb90: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43  * If this is a C
fba0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41  REATE TABLE xx A
fbb0: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78  S SELECT ..., ex
fbc0: 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54  ecute the SELECT
fbd0: 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
fbe0: 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  t to populate th
fbf0: 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65  e new table. The
fc00: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
fc10: 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  r for the.    **
fc20: 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e   new table is in
fc30: 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65   register pParse
fc40: 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a  ->regRoot..    *
fc50: 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68  *.    ** Once th
fc60: 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65  e SELECT has bee
fc70: 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74  n coded by sqlit
fc80: 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69  e3Select(), it i
fc90: 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75  s in a.    ** su
fca0: 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20  itable state to 
fcb0: 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f  query for the co
fcc0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74  lumn names and t
fcd0: 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a  ypes to be used.
fce0: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65      ** by the ne
fcf0: 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a  w table..    **.
fd00: 20 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d      ** A shared-
fd10: 63 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  cache write-lock
fd20: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
fd30: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
fd40: 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20   new table,.    
fd50: 2a 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c  ** as a schema-l
fd60: 6f 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c  ock must have al
fd70: 72 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69  ready been obtai
fd80: 6e 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74  ned to create it
fd90: 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61  . Since.    ** a
fda0: 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63   schema-lock exc
fdb0: 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20  ludes all other 
fdc0: 64 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20  database users, 
fdd0: 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  the write-lock w
fde0: 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72  ould.    ** be r
fdf0: 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f  edundant..    */
fe00: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
fe10: 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   ){.      Select
fe20: 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 2f 2a  Dest dest;    /*
fe30: 20 57 68 65 72 65 20 74 68 65 20 53 45 4c 45 43   Where the SELEC
fe40: 54 20 73 68 6f 75 6c 64 20 73 74 6f 72 65 20 72  T should store r
fe50: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20  esults */.      
fe60: 69 6e 74 20 72 65 67 59 69 65 6c 64 3b 20 20 20  int regYield;   
fe70: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
fe80: 68 6f 6c 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69  holding co-routi
fe90: 6e 65 20 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a  ne entry-point *
fea0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
feb0: 54 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  Top;        /* T
fec0: 6f 70 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75  op of the co-rou
fed0: 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tine */.      in
fee0: 74 20 72 65 67 52 65 63 3b 20 20 20 20 20 20 20  t regRec;       
fef0: 20 20 2f 2a 20 41 20 72 65 63 6f 72 64 20 74 6f    /* A record to
ff00: 20 62 65 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   be insert into 
ff10: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f  the new table */
ff20: 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 6f  .      int regRo
ff30: 77 69 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f  wid;       /* Ro
ff40: 77 69 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20  wid of the next 
ff50: 72 6f 77 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f  row to insert */
ff60: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49  .      int addrI
ff70: 6e 73 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 6f  nsLoop;    /* To
ff80: 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  p of the loop fo
ff90: 72 20 69 6e 73 65 72 74 69 6e 67 20 72 6f 77 73  r inserting rows
ffa0: 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
ffb0: 2a 70 53 65 6c 54 61 62 3b 20 20 20 20 20 2f 2a  *pSelTab;     /*
ffc0: 20 41 20 74 61 62 6c 65 20 74 68 61 74 20 64 65   A table that de
ffd0: 73 63 72 69 62 65 73 20 74 68 65 20 53 45 4c 45  scribes the SELE
ffe0: 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20  CT results */.. 
fff0: 20 20 20 20 20 72 65 67 59 69 65 6c 64 20 3d 20       regYield = 
10000 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
10010 20 20 20 20 20 20 72 65 67 52 65 63 20 3d 20 2b        regRec = +
10020 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
10030 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20       regRowid = 
10040 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
10050 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
10060 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20  rse->nTab==1);. 
10070 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41       sqlite3MayA
10080 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
10090 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
100a0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
100b0 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65  Write, 1, pParse
100c0 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b  ->regRoot, iDb);
100d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
100e0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
100f0 46 4c 41 47 5f 50 32 49 53 52 45 47 29 3b 0a 20  FLAG_P2ISREG);. 
10100 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
10110 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 61 64 64  b = 2;.      add
10120 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
10130 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
10140 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   + 1;.      sqli
10150 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10160 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
10170 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20  e, regYield, 0, 
10180 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20  addrTop);.      
10190 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
101a0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
101b0 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
101c0 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
101d0 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
101e0 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ect);.      if( 
101f0 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74  pSelTab==0 ) ret
10200 75 72 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  urn;.      asser
10210 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  t( p->aCol==0 );
10220 0a 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d  .      p->nCol =
10230 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
10240 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20        p->aCol = 
10250 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
10260 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
10270 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ol = 0;.      pS
10280 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
10290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
102a0 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53  leteTable(db, pS
102b0 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 73 71  elTab);.      sq
102c0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
102d0 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43  nit(&dest, SRT_C
102e0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
102f0 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ld);.      sqlit
10300 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
10310 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29   pSelect, &dest)
10320 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
10330 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
10340 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  n;.      sqlite3
10350 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
10360 28 76 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20  (v, regYield);. 
10370 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10380 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
10390 54 6f 70 20 2d 20 31 29 3b 0a 20 20 20 20 20 20  Top - 1);.      
103a0 61 64 64 72 49 6e 73 4c 6f 6f 70 20 3d 20 73 71  addrInsLoop = sq
103b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
103c0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73  v, OP_Yield, des
103d0 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  t.iSDParm);.    
103e0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
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 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
10410 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 64 65 73  _MakeRecord, des
10420 74 2e 69 53 64 73 74 2c 20 64 65 73 74 2e 6e 53  t.iSdst, dest.nS
10430 64 73 74 2c 20 72 65 67 52 65 63 29 3b 0a 20 20  dst, regRec);.  
10440 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
10450 41 66 66 69 6e 69 74 79 28 76 2c 20 70 2c 20 30  Affinity(v, p, 0
10460 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10470 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10480 5f 4e 65 77 52 6f 77 69 64 2c 20 31 2c 20 72 65  _NewRowid, 1, re
10490 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
104a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
104b0 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 31  (v, OP_Insert, 1
104c0 2c 20 72 65 67 52 65 63 2c 20 72 65 67 52 6f 77  , regRec, regRow
104d0 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
104e0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
104f0 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20  drInsLoop);.    
10500 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
10510 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 73  pHere(v, addrIns
10520 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Loop);.      sql
10530 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10540 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a  , OP_Close, 1);.
10550 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
10560 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65  mpute the comple
10570 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
10580 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
10590 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  */.    if( pSele
105a0 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d  ct ){.      zStm
105b0 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53  t = createTableS
105c0 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  tmt(db, p);.    
105d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b  }else{.      Tok
105e0 65 6e 20 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f  en *pEnd2 = tabO
105f0 70 74 73 20 3f 20 26 70 50 61 72 73 65 2d 3e 73  pts ? &pParse->s
10600 4c 61 73 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64  LastToken : pEnd
10610 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74  ;.      n = (int
10620 29 28 70 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61  )(pEnd2->z - pPa
10630 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
10640 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  z);.      if( pE
10650 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29  nd2->z[0]!=';' )
10660 20 6e 20 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a   n += pEnd2->n;.
10670 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
10680 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
10690 20 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45   .          "CRE
106a0 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54  ATE %s %.*s", zT
106b0 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d  ype2, n, pParse-
106c0 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20  >sNameToken.z.  
106d0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
106e0 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20    /* A slot for 
106f0 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20 61  the record has a
10700 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
10710 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20  cated in the .  
10720 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54    ** SQLITE_MAST
10730 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75  ER table.  We ju
10740 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74  st need to updat
10750 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68  e that slot with
10760 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20   all.    ** the 
10770 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76  information we'v
10780 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20  e collected..   
10790 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
107a0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
107b0 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45  e,.      "UPDATE
107c0 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20   %Q.%s ".       
107d0 20 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27    "SET type='%s'
107e0 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e  , name=%Q, tbl_n
107f0 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65  ame=%Q, rootpage
10800 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20  =#%d, sql=%Q ". 
10810 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77        "WHERE row
10820 69 64 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64  id=#%d",.      d
10830 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
10840 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
10850 45 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a  E,.      zType,.
10860 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
10870 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
10880 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65        pParse->re
10890 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74  gRoot,.      zSt
108a0 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  mt,.      pParse
108b0 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29  ->regRowid.    )
108c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
108d0 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a  ree(db, zStmt);.
108e0 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
108f0 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
10900 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
10910 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
10920 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20  NCREMENT.    /* 
10930 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
10940 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
10950 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75  e an sqlite_sequ
10960 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20  ence table for. 
10970 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72     ** keeping tr
10980 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65  ack of autoincre
10990 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a  ment keys..    *
109a0 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61  /.    if( (p->ta
109b0 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
109c0 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 20 29 7b  increment)!=0 ){
109d0 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d  .      Db *pDb =
109e0 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
109f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
10a00 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
10a10 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
10a20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44   );.      if( pD
10a30 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  b->pSchema->pSeq
10a40 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
10a50 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
10a60 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
10a70 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
10a80 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73  ABLE %Q.sqlite_s
10a90 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71  equence(name,seq
10aa0 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44  )",.          pD
10ab0 62 2d 3e 7a 44 62 53 4e 61 6d 65 0a 20 20 20 20  b->zDbSName.    
10ac0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
10ad0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
10ae0 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72   /* Reparse ever
10af0 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65  ything to update
10b00 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61   our internal da
10b10 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f  ta structures */
10b20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10b30 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70  AddParseSchemaOp
10b40 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  (v, iDb,.       
10b50 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
10b60 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65  tf(db, "tbl_name
10b70 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 21 3d  ='%q' AND type!=
10b80 27 74 72 69 67 67 65 72 27 22 2c 20 70 2d 3e 7a  'trigger'", p->z
10b90 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20  Name));.  }...  
10ba0 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65  /* Add the table
10bb0 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   to the in-memor
10bc0 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
10bd0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
10be0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
10bf0 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
10c00 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20    Table *pOld;. 
10c10 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
10c20 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b  ma = p->pSchema;
10c30 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
10c40 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
10c50 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
10c60 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71  );.    pOld = sq
10c70 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
10c80 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  &pSchema->tblHas
10c90 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b  h, p->zName, p);
10ca0 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b  .    if( pOld ){
10cb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10cc0 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61  ==pOld );  /* Ma
10cd0 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
10ce0 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73  ailed inside Has
10cf0 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20  hInsert() */.   
10d00 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
10d10 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65  lt(db);.      re
10d20 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
10d30 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
10d40 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6d  e = 0;.    db->m
10d50 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41  DbFlags |= DBFLA
10d60 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  G_SchemaChange;.
10d70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10d80 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a  OMIT_ALTERTABLE.
10d90 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c      if( !p->pSel
10da0 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ect ){.      con
10db0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
10dc0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
10dd0 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
10de0 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  n.z;.      int n
10df0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Name;.      asse
10e00 72 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20  rt( !pSelect && 
10e10 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b  pCons && pEnd );
10e20 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73  .      if( pCons
10e30 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->z==0 ){.      
10e40 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a    pCons = pEnd;.
10e50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e        }.      nN
10e60 61 6d 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e  ame = (int)((con
10e70 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d  st char *)pCons-
10e80 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >z - zName);.   
10e90 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73     p->addColOffs
10ea0 65 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65  et = 13 + sqlite
10eb0 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61  3Utf8CharLen(zNa
10ec0 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
10ed0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
10ee0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10ef0 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54  MIT_VIEW./*.** T
10f00 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
10f10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20  this routine in 
10f20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20  order to create 
10f30 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f  a new VIEW.*/.vo
10f40 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
10f50 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70  View(.  Parse *p
10f60 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68  Parse,     /* Th
10f70 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
10f80 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42  t */.  Token *pB
10f90 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65  egin,     /* The
10fa0 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
10fb0 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74  at begins the st
10fc0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
10fd0 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
10fe0 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
10ff0 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
11000 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
11010 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
11020 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
11030 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
11040 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
11050 77 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  w */.  ExprList 
11060 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a 20 4f 70 74  *pCNames, /* Opt
11070 69 6f 6e 61 6c 20 6c 69 73 74 20 6f 66 20 76 69  ional list of vi
11080 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ew column names 
11090 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
110a0 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c  lect,   /* A SEL
110b0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
110c0 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
110d0 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20  he new view */. 
110e0 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20   int isTemp,    
110f0 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20      /* TRUE for 
11100 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77  a TEMPORARY view
11110 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
11120 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70           /* Supp
11130 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61  ress error messa
11140 67 65 73 20 69 66 20 56 49 45 57 20 61 6c 72 65  ges if VIEW alre
11150 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
11160 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
11170 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt n;.  const ch
11180 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73  ar *z;.  Token s
11190 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73  End;.  DbFixer s
111a0 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  Fix;.  Token *pN
111b0 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ame = 0;.  int i
111c0 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Db;.  sqlite3 *d
111d0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
111e0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
111f0 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  Var>0 ){.    sql
11200 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11210 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73  rse, "parameters
11220 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
11230 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20   in views");.   
11240 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65   goto create_vie
11250 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20 20 73 71  w_fail;.  }.  sq
11260 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
11270 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
11280 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20  pName2, isTemp, 
11290 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20  1, 0, noErr);.  
112a0 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
112b0 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
112c0 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
112d0 72 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f  r ) goto create_
112e0 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 73 71 6c  view_fail;.  sql
112f0 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
11300 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
11310 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
11320 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
11330 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
11340 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  , p->pSchema);. 
11350 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
11360 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
11370 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d  Db, "view", pNam
11380 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  e);.  if( sqlite
11390 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78  3FixSelect(&sFix
113a0 2c 20 70 53 65 6c 65 63 74 29 20 29 20 67 6f 74  , pSelect) ) got
113b0 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61  o create_view_fa
113c0 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61  il;..  /* Make a
113d0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74   copy of the ent
113e0 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ire SELECT state
113f0 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
11400 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a  s the view..  **
11410 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65   This will force
11420 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f   all the Expr.to
11430 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20  ken.z values to 
11440 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  be dynamically. 
11450 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61   ** allocated ra
11460 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20  ther than point 
11470 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  to the input str
11480 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e  ing - which mean
11490 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79  s that.  ** they
114a0 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66   will persist af
114b0 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
114c0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63  sqlite3_exec() c
114d0 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a  all returns..  *
114e0 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d  /.  p->pSelect =
114f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
11500 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45  p(db, pSelect, E
11510 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
11520 20 20 70 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71    p->pCheck = sq
11530 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
11540 28 64 62 2c 20 70 43 4e 61 6d 65 73 2c 20 45 58  (db, pCNames, EX
11550 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
11560 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
11570 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 63 72 65  ailed ) goto cre
11580 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a  ate_view_fail;..
11590 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
115a0 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54  end of the CREAT
115b0 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
115c0 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69  .  Make sEnd poi
115d0 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65  nt to.  ** the e
115e0 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20  nd..  */.  sEnd 
115f0 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54  = pParse->sLastT
11600 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  oken;.  assert( 
11610 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 7c 7c 20  sEnd.z[0]!=0 || 
11620 73 45 6e 64 2e 6e 3d 3d 30 20 29 3b 0a 20 20 69  sEnd.n==0 );.  i
11630 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b  f( sEnd.z[0]!=';
11640 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20  ' ){.    sEnd.z 
11650 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20  += sEnd.n;.  }. 
11660 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e   sEnd.n = 0;.  n
11670 20 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20   = (int)(sEnd.z 
11680 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20  - pBegin->z);.  
11690 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20  assert( n>0 );. 
116a0 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a   z = pBegin->z;.
116b0 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
116c0 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20  Isspace(z[n-1]) 
116d0 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64  ){ n--; }.  sEnd
116e0 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20  .z = &z[n-1];.  
116f0 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f  sEnd.n = 1;..  /
11700 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64  * Use sqlite3End
11710 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74  Table() to add t
11720 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53  he view to the S
11730 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
11740 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  le */.  sqlite3E
11750 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  ndTable(pParse, 
11760 30 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b  0, &sEnd, 0, 0);
11770 0a 0a 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61  ..create_view_fa
11780 69 6c 3a 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  il:.  sqlite3Sel
11790 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
117a0 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
117b0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
117c0 64 62 2c 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20  db, pCNames);.  
117d0 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66  return;.}.#endif
117e0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
117f0 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65  VIEW */..#if !de
11800 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
11810 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
11820 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
11830 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a  VIRTUALTABLE)./*
11840 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
11850 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69  ructure pTable i
11860 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e  s really a VIEW.
11870 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61    Fill in the na
11880 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f  mes of.** the co
11890 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65  lumns of the vie
118a0 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20  w in the pTable 
118b0 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75  structure.  Retu
118c0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  rn the number.**
118d0 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
118e0 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e  an error is seen
118f0 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
11900 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
11910 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69  e->zErrMsg..*/.i
11920 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  nt sqlite3ViewGe
11930 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72  tColumnNames(Par
11940 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
11950 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61  e *pTable){.  Ta
11960 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20  ble *pSelTab;   
11970 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20  /* A fake table 
11980 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65  from which we ge
11990 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  t the result set
119a0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
119b0 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  el;     /* Copy 
119c0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 74 68  of the SELECT th
119d0 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
119e0 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  e view */.  int 
119f0 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a  nErr = 0;     /*
11a00 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   Number of error
11a10 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f  s encountered */
11a20 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
11a30 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
11a40 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75  ily holds the nu
11a50 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
11a60 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71  assigned */.  sq
11a70 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
11a80 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
11a90 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
11aa0 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  for malloc error
11ab0 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  s */.#ifndef SQL
11ac0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
11ad0 54 41 42 4c 45 0a 20 20 69 6e 74 20 72 63 3b 0a  TABLE.  int rc;.
11ae0 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
11af0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
11b00 52 49 5a 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74  RIZATION.  sqlit
11b10 65 33 5f 78 61 75 74 68 20 78 41 75 74 68 3b 20  e3_xauth xAuth; 
11b20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 78        /* Saved x
11b30 41 75 74 68 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  Auth pointer */.
11b40 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
11b50 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66  ( pTable );..#if
11b60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11b70 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
11b80 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 2b  db->nSchemaLock+
11b90 2b 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  +;.  rc = sqlite
11ba0 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74  3VtabCallConnect
11bb0 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29  (pParse, pTable)
11bc0 3b 0a 20 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c  ;.  db->nSchemaL
11bd0 6f 63 6b 2d 2d 3b 0a 20 20 69 66 28 20 72 63 20  ock--;.  if( rc 
11be0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
11bf0 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72  .  }.  if( IsVir
11c00 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72  tual(pTable) ) r
11c10 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
11c20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11c30 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41  OMIT_VIEW.  /* A
11c40 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d   positive nCol m
11c50 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73  eans the columns
11c60 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20   names for this 
11c70 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c  view are.  ** al
11c80 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a  ready known..  *
11c90 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
11ca0 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20  nCol>0 ) return 
11cb0 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74  0;..  /* A negat
11cc0 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70  ive nCol is a sp
11cd0 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61  ecial marker mea
11ce0 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65  ning that we are
11cf0 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20   currently.  ** 
11d00 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74  trying to comput
11d10 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
11d20 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72  es.  If we enter
11d30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
11d40 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69  th.  ** a negati
11d50 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e  ve nCol, it mean
11d60 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69  s two or more vi
11d70 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c  ews form a loop,
11d80 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a   like this:.  **
11d90 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
11da0 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c   VIEW one AS SEL
11db0 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a  ECT * FROM two;.
11dc0 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
11dd0 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45  VIEW two AS SELE
11de0 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20  CT * FROM one;. 
11df0 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
11e00 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61 62 6f  y, the error abo
11e10 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74  ve is now caught
11e20 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69   prior to reachi
11e30 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20  ng this point.. 
11e40 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f 6c 6c   ** But the foll
11e50 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20 73 74  owing test is st
11e60 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61 73  ill important as
11e70 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20 75 70   it does come up
11e80 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c  .  ** in the fol
11e90 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20  lowing:.  ** .  
11ea0 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
11eb0 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b  BLE main.ex1(a);
11ec0 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
11ed0 20 54 45 4d 50 20 56 49 45 57 20 65 78 31 20 41   TEMP VIEW ex1 A
11ee0 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20  S SELECT a FROM 
11ef0 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45  ex1;.  **     SE
11f00 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70  LECT * FROM temp
11f10 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28  .ex1;.  */.  if(
11f20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20   pTable->nCol<0 
11f30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
11f40 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11f50 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63 75  view %s is circu
11f60 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20  larly defined", 
11f70 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
11f80 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
11f90 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  }.  assert( pTab
11fa0 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a  le->nCol>=0 );..
11fb0 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
11fc0 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
11fd0 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d  s we need to com
11fe0 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e  pute the table n
11ff0 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20  ames..  ** Note 
12000 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f  that the call to
12010 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
12020 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c  tOfSelect() will
12030 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a   expand any.  **
12040 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e   "*" elements in
12050 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65 74   the results set
12060 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e 64   of the view and
12070 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72   will assign cur
12080 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  sors.  ** to the
12090 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
120a0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42   FROM clause.  B
120b0 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e  ut we do not wan
120c0 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a  t these changes.
120d0 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61    ** to be perma
120e0 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f  nent.  So the co
120f0 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e  mputation is don
12100 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74  e on a copy of t
12110 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73  he SELECT.  ** s
12120 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
12130 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
12140 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
12150 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
12160 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74  ;.  pSel = sqlit
12170 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
12180 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c  pTable->pSelect,
12190 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20   0);.  if( pSel 
121a0 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73  ){.    n = pPars
121b0 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c  e->nTab;.    sql
121c0 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
121d0 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
121e0 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20   pSel->pSrc);.  
121f0 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
12200 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f   -1;.    db->loo
12210 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2b  kaside.bDisable+
12220 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
12230 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
12240 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d  TION.    xAuth =
12250 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20   db->xAuth;.    
12260 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20  db->xAuth = 0;. 
12270 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
12280 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
12290 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
122a0 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75  el);.    db->xAu
122b0 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73  th = xAuth;.#els
122c0 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20  e.    pSelTab = 
122d0 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
122e0 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
122f0 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20   pSel);.#endif. 
12300 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
12310 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 54 61  = n;.    if( pTa
12320 62 6c 65 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20  ble->pCheck ){. 
12330 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20 56       /* CREATE V
12340 49 45 57 20 6e 61 6d 65 28 61 72 67 6c 69 73 74  IEW name(arglist
12350 29 20 41 53 20 2e 2e 2e 0a 20 20 20 20 20 20 2a  ) AS ....      *
12360 2a 20 54 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  * The names of t
12370 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  he columns in th
12380 65 20 74 61 62 6c 65 20 61 72 65 20 74 61 6b 65  e table are take
12390 6e 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20  n from.      ** 
123a0 61 72 67 6c 69 73 74 20 77 68 69 63 68 20 69 73  arglist which is
123b0 20 73 74 6f 72 65 64 20 69 6e 20 70 54 61 62 6c   stored in pTabl
123c0 65 2d 3e 70 43 68 65 63 6b 2e 20 20 54 68 65 20  e->pCheck.  The 
123d0 70 43 68 65 63 6b 20 66 69 65 6c 64 0a 20 20 20  pCheck field.   
123e0 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 68     ** normally h
123f0 6f 6c 64 73 20 43 48 45 43 4b 20 63 6f 6e 73 74  olds CHECK const
12400 72 61 69 6e 74 73 20 6f 6e 20 61 6e 20 6f 72 64  raints on an ord
12410 69 6e 61 72 79 20 74 61 62 6c 65 2c 20 62 75 74  inary table, but
12420 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 20   for.      ** a 
12430 56 49 45 57 20 69 74 20 68 6f 6c 64 73 20 74 68  VIEW it holds th
12440 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
12450 20 6e 61 6d 65 73 2e 0a 20 20 20 20 20 20 2a 2f   names..      */
12460 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
12470 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
12480 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  t(pParse, pTable
12490 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20  ->pCheck, .     
124a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124b0 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54 61              &pTa
124c0 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  ble->nCol, &pTab
124d0 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20  le->aCol);.     
124e0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
124f0 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 20  ailed==0 .      
12500 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
12510 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 54  ==0.       && pT
12520 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c  able->nCol==pSel
12530 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a  ->pEList->nExpr.
12540 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
12550 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
12560 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
12570 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
12580 70 54 61 62 6c 65 2c 20 70 53 65 6c 29 3b 0a 20  pTable, pSel);. 
12590 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
125a0 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
125b0 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20        /* CREATE 
125c0 56 49 45 57 20 6e 61 6d 65 20 41 53 2e 2e 2e 20  VIEW name AS... 
125d0 20 77 69 74 68 6f 75 74 20 61 6e 20 61 72 67 75   without an argu
125e0 6d 65 6e 74 20 6c 69 73 74 2e 20 20 43 6f 6e 73  ment list.  Cons
125f0 74 72 75 63 74 0a 20 20 20 20 20 20 2a 2a 20 74  truct.      ** t
12600 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
12610 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
12620 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
12630 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
12640 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
12650 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
12660 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
12670 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
12680 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
12690 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
126a0 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
126b0 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
126c0 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
126d0 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
126e0 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
126f0 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
12700 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
12710 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
12720 29 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ) );.    }else{.
12730 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43        pTable->nC
12740 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45  ol = 0;.      nE
12750 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rr++;.    }.    
12760 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
12770 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b  le(db, pSelTab);
12780 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
12790 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
127a0 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  l);.    db->look
127b0 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2d 2d  aside.bDisable--
127c0 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
127d0 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70   nErr++;.  }.  p
127e0 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
127f0 73 63 68 65 6d 61 46 6c 61 67 73 20 7c 3d 20 44  schemaFlags |= D
12800 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a  B_UnresetViews;.
12810 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
12820 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20  _OMIT_VIEW */.  
12830 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
12840 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
12850 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
12860 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
12870 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
12880 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
12890 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
128a0 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43  MIT_VIEW./*.** C
128b0 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
128c0 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79  names from every
128d0 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73   VIEW in databas
128e0 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  e idx..*/.static
128f0 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
12900 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33  ResetAll(sqlite3
12910 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a   *db, int idx){.
12920 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
12930 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12940 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
12950 64 62 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a 20  db, idx, 0) );. 
12960 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65   if( !DbHasPrope
12970 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
12980 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20  UnresetViews) ) 
12990 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
129a0 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
129b0 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53  &db->aDb[idx].pS
129c0 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
129d0 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e   i;i=sqliteHashN
129e0 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62  ext(i)){.    Tab
129f0 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
12a00 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
12a10 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
12a20 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
12a30 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  ite3DeleteColumn
12a40 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29 3b  Names(db, pTab);
12a50 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  .      pTab->aCo
12a60 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61  l = 0;.      pTa
12a70 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
12a80 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
12a90 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
12aa0 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
12ab0 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  s);.}.#else.# de
12ac0 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52  fine sqliteViewR
12ad0 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e  esetAll(A,B).#en
12ae0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
12af0 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_VIEW */../*.*
12b00 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
12b10 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
12b20 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20   VDBE to adjust 
12b30 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
12b40 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53  ema.** used by S
12b50 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62  QLite when the b
12b60 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73  tree layer moves
12b70 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61   a table root pa
12b80 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d  ge. The.** root-
12b90 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
12ba0 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61  or index in data
12bb0 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61  base iDb has cha
12bc0 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a  nged from iFrom.
12bd0 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a  ** to iTo..**.**
12be0 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20   Ticket #1728:  
12bf0 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65  The symbol table
12c00 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e   might still con
12c10 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tain information
12c20 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e  .** on tables an
12c30 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61  d/or indices tha
12c40 74 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73  t are the proces
12c50 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74  s of being delet
12c60 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72  ed..** If you ar
12c70 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f  e unlucky, one o
12c80 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20  f those deleted 
12c90 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65  indices or table
12ca0 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20  s might.** have 
12cb0 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67  the same rootpag
12cc0 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  e number as the 
12cd0 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e  real table or in
12ce0 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62  dex that is.** b
12cf0 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20  eing moved.  So 
12d00 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73  we cannot stop s
12d10 65 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74  earching after t
12d20 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a  he first match .
12d30 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ** because the f
12d40 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74  irst match might
12d50 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74   be for one of t
12d60 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  he deleted indic
12d70 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20  es.** or tables 
12d80 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c  and not the tabl
12d90 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  e/index that is 
12da0 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d  actually being m
12db0 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74  oved..** We must
12dc0 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e   continue loopin
12dd0 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c  g until all tabl
12de0 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77  es and indices w
12df0 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d  ith.** rootpage=
12e00 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e  =iFrom have been
12e10 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61   converted to ha
12e20 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66  ve a rootpage of
12e30 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72   iTo.** in order
12e40 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74   to be certain t
12e50 68 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72  hat we got the r
12e60 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66  ight one..*/.#if
12e70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12e80 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64  _AUTOVACUUM.void
12e90 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65   sqlite3RootPage
12ea0 4d 6f 76 65 64 28 73 71 6c 69 74 65 33 20 2a 64  Moved(sqlite3 *d
12eb0 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
12ec0 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
12ed0 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  .  HashElem *pEl
12ee0 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73  em;.  Hash *pHas
12ef0 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  h;.  Db *pDb;.. 
12f00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12f10 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
12f20 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
12f30 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
12f40 69 44 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20  iDb];.  pHash = 
12f50 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
12f60 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  blHash;.  for(pE
12f70 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
12f80 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
12f90 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
12fa0 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
12fb0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
12fc0 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
12fd0 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
12fe0 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pTab->tnum==iF
12ff0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61  rom ){.      pTa
13000 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  b->tnum = iTo;. 
13010 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68     }.  }.  pHash
13020 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
13030 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72  ->idxHash;.  for
13040 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
13050 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
13060 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
13070 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
13080 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  )){.    Index *p
13090 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Idx = sqliteHash
130a0 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
130b0 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d   if( pIdx->tnum=
130c0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
130d0 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pIdx->tnum = iTo
130e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
130f0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
13100 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  e code to erase 
13110 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
13120 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
13130 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44  from database iD
13140 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65  b..** Also write
13150 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20   code to modify 
13160 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
13170 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65  r table and inte
13180 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69  rnal schema.** i
13190 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  f a root-page of
131a0 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
131b0 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
131c0 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73  tree-layer whils
131d0 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61  t.** erasing iTa
131e0 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61  ble (this can ha
131f0 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74  ppen with an aut
13200 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
13210 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  e)..*/ .static v
13220 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  oid destroyRootP
13230 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  age(Parse *pPars
13240 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  e, int iTable, i
13250 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
13260 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
13270 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
13280 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
13290 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
132a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 54 61  );.  assert( iTa
132b0 62 6c 65 3e 31 20 29 3b 0a 20 20 73 71 6c 69 74  ble>1 );.  sqlit
132c0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
132d0 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62  OP_Destroy, iTab
132e0 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20 20  le, r1, iDb);.  
132f0 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
13300 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66  pParse);.#ifndef
13310 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13320 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f  OVACUUM.  /* OP_
13330 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61  Destroy stores a
13340 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e  n in integer r1.
13350 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72   If this integer
13360 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  .  ** is non-zer
13370 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  o, then it is th
13380 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
13390 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f  er of a table mo
133a0 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61  ved to.  ** loca
133b0 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65  tion iTable. The
133c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
133d0 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c  modifies the sql
133e0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
133f0 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74   to.  ** reflect
13400 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   this..  **.  **
13410 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74   The "#NNN" in t
13420 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63  he SQL is a spec
13430 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ial constant tha
13440 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72  t means whatever
13450 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69   value.  ** is i
13460 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20  n register NNN. 
13470 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75 6c   See grammar rul
13480 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
13490 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53 54  th the TK_REGIST
134a0 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f  ER.  ** token fo
134b0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
134c0 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  ormation..  */. 
134d0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
134e0 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
134f0 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
13500 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20  SET rootpage=%d 
13510 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f  WHERE #%d AND ro
13520 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20  otpage=#%d",.   
13530 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44    pParse->db->aD
13540 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c  b[iDb].zDbSName,
13550 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 69 54   MASTER_NAME, iT
13560 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23  able, r1, r1);.#
13570 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52  endif.  sqlite3R
13580 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
13590 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
135a0 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63  .** Write VDBE c
135b0 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62  ode to erase tab
135c0 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20  le pTab and all 
135d0 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63  associated indic
135e0 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43  es on disk..** C
135f0 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  ode to update th
13600 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
13610 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72  tables and inter
13620 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e  nal schema defin
13630 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73  itions.** in cas
13640 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65  e a root-page be
13650 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68  longing to anoth
13660 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
13670 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c  d by the btree l
13680 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20  ayer.** is also 
13690 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20  added (this can 
136a0 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
136b0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
136c0 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
136d0 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c  void destroyTabl
136e0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
136f0 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20   Table *pTab){. 
13700 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
13710 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d  ase may be auto-
13720 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28  vacuum capable (
13730 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  if SQLITE_OMIT_A
13740 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69  UTOVACUUM.  ** i
13750 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20  s not defined), 
13760 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72  then it is impor
13770 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f  tant to call OP_
13780 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20  Destroy on the. 
13790 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e   ** table and in
137a0 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69  dex root-pages i
137b0 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e  n order, startin
137c0 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72  g with the numer
137d0 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72  ically .  ** lar
137e0 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
137f0 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72  umber. This guar
13800 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65  antees that none
13810 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   of the root-pag
13820 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65  es.  ** to be de
13830 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63  stroyed is reloc
13840 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ated by an earli
13850 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69  er OP_Destroy. i
13860 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  .e. if the.  ** 
13870 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63  following were c
13880 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oded:.  **.  ** 
13890 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20  OP_Destroy 4 0. 
138a0 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f   ** ....  ** OP_
138b0 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a  Destroy 5 0.  **
138c0 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70  .  ** and root p
138d0 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74  age 5 happened t
138e0 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74  o be the largest
138f0 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
13900 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  r in the.  ** da
13910 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f  tabase, then roo
13920 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62  t page 5 would b
13930 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20  e moved to page 
13940 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22  4 by the .  ** "
13950 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20  OP_Destroy 4 0" 
13960 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73  opcode. The subs
13970 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72  equent "OP_Destr
13980 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69  oy 5 0" would hi
13990 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69  t.  ** a free-li
139a0 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  st page..  */.  
139b0 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d  int iTab = pTab-
139c0 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65  >tnum;.  int iDe
139d0 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20  stroyed = 0;..  
139e0 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
139f0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
13a00 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20   int iLargest = 
13a10 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73  0;..    if( iDes
13a20 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61  troyed==0 || iTa
13a30 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a  b<iDestroyed ){.
13a40 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
13a50 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20   iTab;.    }.   
13a60 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
13a70 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
13a80 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
13a90 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20  .      int iIdx 
13aa0 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20  = pIdx->tnum;.  
13ab0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
13ac0 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
13ad0 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
13ae0 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65    if( (iDestroye
13af0 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44  d==0 || (iIdx<iD
13b00 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49  estroyed)) && iI
13b10 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20  dx>iLargest ){. 
13b20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20         iLargest 
13b30 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a  = iIdx;.      }.
13b40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c      }.    if( iL
13b50 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20  argest==0 ){.   
13b60 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
13b70 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
13b80 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
13b90 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
13ba0 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
13bb0 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61 73 73  hema);.      ass
13bc0 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
13bd0 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e  Db<pParse->db->n
13be0 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65 73 74  Db );.      dest
13bf0 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
13c00 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44  se, iLargest, iD
13c10 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72  b);.      iDestr
13c20 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b  oyed = iLargest;
13c30 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
13c40 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74 72 69  .** Remove entri
13c50 65 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  es from the sqli
13c60 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 20  te_statN tables 
13c70 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33  (for N in (1,2,3
13c80 29 29 0a 2a 2a 20 61 66 74 65 72 20 61 20 44 52  )).** after a DR
13c90 4f 50 20 49 4e 44 45 58 20 6f 72 20 44 52 4f 50  OP INDEX or DROP
13ca0 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a   TABLE command..
13cb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
13cc0 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54  qlite3ClearStatT
13cd0 61 62 6c 65 73 28 0a 20 20 50 61 72 73 65 20 2a  ables(.  Parse *
13ce0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
13cf0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
13d00 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
13d10 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  iDb,            
13d20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
13d30 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63  se number */.  c
13d40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
13d50 2c 20 20 20 20 20 2f 2a 20 22 69 64 78 22 20 6f  ,     /* "idx" o
13d60 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e  r "tbl" */.  con
13d70 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
13d80 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69      /* Name of i
13d90 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f  ndex or table */
13da0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  .){.  int i;.  c
13db0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
13dc0 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  me = pParse->db-
13dd0 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
13de0 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  me;.  for(i=1; i
13df0 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  <=4; i++){.    c
13e00 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a 20 20  har zTab[24];.  
13e10 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
13e20 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62 29 2c  tf(sizeof(zTab),
13e30 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73 74 61  zTab,"sqlite_sta
13e40 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69 66 28  t%d",i);.    if(
13e50 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
13e60 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54  e(pParse->db, zT
13e70 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29 7b 0a  ab, zDbName) ){.
13e80 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
13e90 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
13ea0 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
13eb0 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
13ec0 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20 20 20  E %s=%Q",.      
13ed0 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62 2c    zDbName, zTab,
13ee0 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 20   zType, zName.  
13ef0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
13f00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
13f10 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f 70 20  te code to drop 
13f20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  a table..*/.void
13f30 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70   sqlite3CodeDrop
13f40 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
13f50 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
13f60 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69  , int iDb, int i
13f70 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65 20 2a  sView){.  Vdbe *
13f80 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
13f90 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
13fa0 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
13fb0 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d 20  er;.  Db *pDb = 
13fc0 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a  &db->aDb[iDb];..
13fd0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
13fe0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
13ff0 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
14000 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
14010 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
14020 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23  rse, 1, iDb);..#
14030 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14040 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
14050 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
14060 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
14070 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
14080 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20  , OP_VBegin);.  
14090 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
140a0 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73  rop all triggers
140b0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
140c0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
140d0 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20   dropped. Code. 
140e0 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64   ** is generated
140f0 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69   to remove entri
14100 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d  es from sqlite_m
14110 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 2a  aster and/or.  *
14120 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  * sqlite_temp_ma
14130 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65 64  ster if required
14140 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67 67 65  ..  */.  pTrigge
14150 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67  r = sqlite3Trigg
14160 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  erList(pParse, p
14170 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  Tab);.  while( p
14180 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 61  Trigger ){.    a
14190 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d  ssert( pTrigger-
141a0 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
141b0 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20  pSchema || .    
141c0 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53      pTrigger->pS
141d0 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
141e0 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
141f0 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67   sqlite3DropTrig
14200 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70  gerPtr(pParse, p
14210 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 70 54  Trigger);.    pT
14220 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65  rigger = pTrigge
14230 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23  r->pNext;.  }..#
14240 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14250 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
14260 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79  .  /* Remove any
14270 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20   entries of the 
14280 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
14290 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  table associated
142a0 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 74   with.  ** the t
142b0 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
142c0 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  ed. This is done
142d0 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c   before the tabl
142e0 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 2a  e is dropped.  *
142f0 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20 6c  * at the btree l
14300 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68  evel, in case th
14310 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
14320 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f  e table needs to
14330 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20  .  ** move as a 
14340 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72  result of the dr
14350 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69  op (can happen i
14360 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
14370 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  de)..  */.  if( 
14380 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
14390 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e   TF_Autoincremen
143a0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
143b0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
143c0 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c 45 54  se,.      "DELET
143d0 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65  E FROM %Q.sqlite
143e0 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45 20  _sequence WHERE 
143f0 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20  name=%Q",.      
14400 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 70  pDb->zDbSName, p
14410 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  Tab->zName.    )
14420 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
14430 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49  /* Drop all SQLI
14440 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
14450 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  and index entrie
14460 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
14470 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20  the.  ** table. 
14480 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65  The program name
14490 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74   loops through t
144a0 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
144b0 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a  and deletes.  **
144c0 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20   every row that 
144d0 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
144e0 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
144f0 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65  me as the one be
14500 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64  ing.  ** dropped
14510 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68  . Triggers are h
14520 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c  andled separatel
14530 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67  y because a trig
14540 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20  ger can be.  ** 
14550 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74  created in the t
14560 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61  emp database tha
14570 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
14580 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20  ble in another. 
14590 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
145a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74  */.  sqlite3Nest
145b0 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
145c0 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46  .      "DELETE F
145d0 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
145e0 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20  tbl_name=%Q and 
145f0 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22  type!='trigger'"
14600 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62  ,.      pDb->zDb
14610 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  SName, MASTER_NA
14620 4d 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  ME, pTab->zName)
14630 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  ;.  if( !isView 
14640 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
14650 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73 74 72  ab) ){.    destr
14660 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  oyTable(pParse, 
14670 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pTab);.  }..  /*
14680 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   Remove the tabl
14690 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c  e entry from SQL
146a0 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73  ite's internal s
146b0 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79  chema and modify
146c0 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  .  ** the schema
146d0 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20   cookie..  */.  
146e0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
146f0 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
14700 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
14710 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 62  OP_VDestroy, iDb
14720 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  , 0, 0, pTab->zN
14730 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  ame, 0);.  }.  s
14740 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
14750 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65  (v, OP_DropTable
14760 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61  , iDb, 0, 0, pTa
14770 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
14780 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
14790 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
147a0 3b 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65  ;.  sqliteViewRe
147b0 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b  setAll(db, iDb);
147c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
147d0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
147e0 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20   to do the work 
147f0 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20  of a DROP TABLE 
14800 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e  statement..** pN
14810 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
14820 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
14830 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76  be dropped..*/.v
14840 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54  oid sqlite3DropT
14850 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
14860 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61  se, SrcList *pNa
14870 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20  me, int isView, 
14880 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61  int noErr){.  Ta
14890 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62  ble *pTab;.  Vdb
148a0 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
148b0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
148c0 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
148d0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
148e0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
148f0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14900 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
14910 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
14920 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61  );.  assert( pNa
14930 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
14940 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64   if( sqlite3Read
14950 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
14960 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14970 74 61 62 6c 65 3b 0a 20 20 69 66 28 20 6e 6f 45  table;.  if( noE
14980 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73  rr ) db->suppres
14990 73 45 72 72 2b 2b 3b 0a 20 20 61 73 73 65 72 74  sErr++;.  assert
149a0 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69  ( isView==0 || i
149b0 73 56 69 65 77 3d 3d 4c 4f 43 41 54 45 5f 56 49  sView==LOCATE_VI
149c0 45 57 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73  EW );.  pTab = s
149d0 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
149e0 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 69 73  eItem(pParse, is
149f0 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b  View, &pName->a[
14a00 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72  0]);.  if( noErr
14a10 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45   ) db->suppressE
14a20 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61  rr--;..  if( pTa
14a30 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  b==0 ){.    if( 
14a40 6e 6f 45 72 72 20 29 20 73 71 6c 69 74 65 33 43  noErr ) sqlite3C
14a50 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
14a60 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61  hema(pParse, pNa
14a70 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
14a80 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  se);.    goto ex
14a90 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
14aa0 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
14ab0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
14ac0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
14ad0 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  a);.  assert( iD
14ae0 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
14af0 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nDb );..  /* If 
14b00 70 54 61 62 20 69 73 20 61 20 76 69 72 74 75 61  pTab is a virtua
14b10 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69  l table, call Vi
14b20 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
14b30 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a  () to ensure.  *
14b40 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69  * it is initiali
14b50 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  zed..  */.  if( 
14b60 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
14b70 26 26 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  && sqlite3ViewGe
14b80 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
14b90 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20  rse, pTab) ){.  
14ba0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
14bb0 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e  _table;.  }.#ifn
14bc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14bd0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
14be0 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
14bf0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
14c00 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
14c10 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f  BLE(iDb);.    co
14c20 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
14c30 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
14c40 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  SName;.    const
14c50 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30   char *zArg2 = 0
14c60 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
14c70 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
14c80 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
14c90 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29  , zTab, 0, zDb))
14ca0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
14cb0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
14cc0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
14cd0 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
14ce0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
14cf0 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
14d00 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
14d10 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  DROP_TEMP_VIEW;.
14d20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14d30 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
14d40 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20  TE_DROP_VIEW;.  
14d50 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
14d60 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
14d70 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65  LTABLE.    }else
14d80 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
14d90 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  Tab) ){.      co
14da0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
14db0 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a  _VTABLE;.      z
14dc0 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65  Arg2 = sqlite3Ge
14dd0 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
14de0 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a  )->pMod->zName;.
14df0 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
14e00 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
14e10 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
14e20 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
14e30 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
14e40 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
14e50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14e60 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
14e70 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  DROP_TABLE;.    
14e80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
14e90 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
14ea0 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
14eb0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41   pTab->zName, zA
14ec0 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  rg2, zDb) ){.   
14ed0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14ee0 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
14ef0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
14f00 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
14f10 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70  SQLITE_DELETE, p
14f20 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  Tab->zName, 0, z
14f30 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
14f40 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
14f50 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  e;.    }.  }.#en
14f60 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65  dif.  if( sqlite
14f70 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
14f80 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
14f90 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20  , 7)==0 .    && 
14fa0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
14fb0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
14fc0 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29 21  lite_stat", 11)!
14fd0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
14fe0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14ff0 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
15000 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
15010 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
15020 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
15030 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69  p_table;.  }..#i
15040 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15050 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75  T_VIEW.  /* Ensu
15060 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73  re DROP TABLE is
15070 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76   not used on a v
15080 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49  iew, and DROP VI
15090 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20  EW is not used. 
150a0 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a   ** on a table..
150b0 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65    */.  if( isVie
150c0 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
150d0 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
150e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
150f0 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54  rse, "use DROP T
15100 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74  ABLE to delete t
15110 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e  able %s", pTab->
15120 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
15130 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
15140 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56  ;.  }.  if( !isV
15150 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
15160 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
15170 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15180 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49  se, "use DROP VI
15190 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65  EW to delete vie
151a0 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  w %s", pTab->zNa
151b0 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
151c0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
151d0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
151e0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
151f0 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
15200 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
15210 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
15220 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
15230 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
15240 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
15250 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
15260 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
15270 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
15280 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  b);.    sqlite3C
15290 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
152a0 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62 6c  Parse, iDb, "tbl
152b0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
152c0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44 72  .    sqlite3FkDr
152d0 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
152e0 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20  pName, pTab);.  
152f0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f    sqlite3CodeDro
15300 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  pTable(pParse, p
15310 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77  Tab, iDb, isView
15320 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
15330 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  p_table:.  sqlit
15340 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
15350 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
15360 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15370 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
15380 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65  reate a new fore
15390 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74  ign key on the t
153a0 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  able.** currentl
153b0 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
153c0 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20  tion.  pFromCol 
153d0 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
153e0 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
153f0 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
15400 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f   point to the fo
15410 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70  reign key.  If p
15420 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a  FromCol==0 then.
15430 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b  ** connect the k
15440 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  ey to the last c
15450 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20  olumn inserted. 
15460 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65   pTo is the name
15470 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
15480 20 72 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e   referred to (a.
15490 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74 22  k.a the "parent"
154a0 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c   table).  pToCol
154b0 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66   is a list.** of
154c0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
154d0 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e  arent pTo table.
154e0 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
154f0 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
15500 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
15510 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
15520 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
15530 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
15540 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
15550 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
15560 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
15570 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
15580 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
15590 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
155a0 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
155b0 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
155c0 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
155d0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
155e0 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  field..**.** The
155f0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
15600 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
15610 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
15620 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
15630 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
15640 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
15650 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
15660 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
15670 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
15680 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
15690 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
156a0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
156b0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
156c0 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
156d0 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
156e0 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
156f0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
15700 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
15710 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
15720 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
15730 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
15740 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
15750 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
15760 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
15770 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
15780 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
15790 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
157a0 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
157b0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
157c0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
157d0 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
157e0 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
157f0 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
15800 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e   = 0;.  FKey *pN
15810 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a  extTo;.  Table *
15820 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
15830 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
15840 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
15850 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
15860 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
15870 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
15880 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
15890 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b  E_VTAB ) goto fk
158a0 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
158b0 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
158c0 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
158d0 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  l-1;.    if( NEV
158e0 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74  ER(iCol<0) ) got
158f0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
15900 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
15910 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  ol->nExpr!=1 ){.
15920 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
15930 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
15940 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73  oreign key on %s
15950 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f  ".         " sho
15960 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
15970 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
15980 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20   table %T",.    
15990 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f       p->aCol[iCo
159a0 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a  l].zName, pTo);.
159b0 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
159c0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
159d0 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
159e0 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
159f0 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f  Col->nExpr!=pFro
15a00 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  mCol->nExpr ){. 
15a10 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15a20 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
15a30 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
15a40 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
15a50 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
15a60 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
15a70 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
15a80 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
15a90 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
15aa0 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
15ab0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
15ac0 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
15ad0 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  Expr;.  }.  nByt
15ae0 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
15af0 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69  y) + (nCol-1)*si
15b00 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
15b10 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
15b20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
15b30 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
15b40 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b  i<pToCol->nExpr;
15b50 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
15b60 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
15b70 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
15b80 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
15b90 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
15ba0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
15bb0 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
15bc0 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
15bd0 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  =0 ){.    goto f
15be0 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b  k_end;.  }.  pFK
15bf0 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
15c00 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
15c10 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
15c20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
15c30 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20  y->aCol[nCol];. 
15c40 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
15c50 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
15c60 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
15c70 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
15c80 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
15c90 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e  z);.  z += pTo->
15ca0 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  n+1;.  pFKey->nC
15cb0 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
15cc0 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
15cd0 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
15ce0 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
15cf0 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
15d00 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
15d10 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
15d20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
15d30 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
15d40 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
15d50 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
15d60 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
15d70 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
15d80 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
15d90 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
15da0 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
15db0 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
15dc0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
15dd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
15de0 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
15df0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
15e00 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
15e10 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
15e20 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
15e30 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
15e40 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
15e50 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
15e60 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
15e70 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
15e80 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
15e90 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
15ea0 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
15eb0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
15ec0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
15ed0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
15ee0 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
15ef0 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
15f00 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
15f10 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
15f20 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
15f30 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
15f40 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
15f50 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
15f60 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
15f70 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
15f80 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30  pFKey->aAction[0
15f90 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26  ] = (u8)(flags &
15fa0 20 30 78 66 66 29 3b 20 20 20 20 20 20 20 20 20   0xff);         
15fb0 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20     /* ON DELETE 
15fc0 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65  action */.  pFKe
15fd0 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20  y->aAction[1] = 
15fe0 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38  (u8)((flags >> 8
15ff0 20 29 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f   ) & 0xff);    /
16000 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69  * ON UPDATE acti
16010 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  on */..  assert(
16020 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
16030 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
16040 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
16050 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20  pNextTo = (FKey 
16060 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  *)sqlite3HashIns
16070 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d  ert(&p->pSchema-
16080 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20  >fkeyHash, .    
16090 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76    pFKey->zTo, (v
160a0 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b  oid *)pFKey.  );
160b0 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d  .  if( pNextTo==
160c0 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  pFKey ){.    sql
160d0 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
160e0 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
160f0 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65  d;.  }.  if( pNe
16100 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73 73 65  xtTo ){.    asse
16110 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72  rt( pNextTo->pPr
16120 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70  evTo==0 );.    p
16130 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  FKey->pNextTo = 
16140 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65  pNextTo;.    pNe
16150 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20  xtTo->pPrevTo = 
16160 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pFKey;.  }..  /*
16170 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67   Link the foreig
16180 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62  n key to the tab
16190 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73  le as the last s
161a0 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  tep..  */.  p->p
161b0 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20  FKey = pFKey;.  
161c0 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65  pFKey = 0;..fk_e
161d0 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  nd:.  sqlite3DbF
161e0 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a  ree(db, pFKey);.
161f0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
16200 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
16210 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20  OREIGN_KEY) */. 
16220 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
16230 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d  Delete(db, pFrom
16240 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Col);.  sqlite3E
16250 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
16260 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a  , pToCol);.}../*
16270 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16280 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
16290 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  an INITIALLY IMM
162a0 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41  EDIATE or INITIA
162b0 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20  LLY DEFERRED.** 
162c0 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61  clause is seen a
162d0 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65  s part of a fore
162e0 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
162f0 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72  on.  The isDefer
16300 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  red.** parameter
16310 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41   is 1 for INITIA
16320 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64  LLY DEFERRED and
16330 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   0 for INITIALLY
16340 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54   IMMEDIATE..** T
16350 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
16360 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
16370 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e   created foreign
16380 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64   key is adjusted
16390 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  .** accordingly.
163a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
163b0 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
163c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
163d0 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a  nt isDeferred){.
163e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
163f0 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
16400 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
16410 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
16420 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72  if( (pTab = pPar
16430 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
16440 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54  0 || (pFKey = pT
16450 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20  ab->pFKey)==0 ) 
16460 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
16470 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20  ( isDeferred==0 
16480 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31  || isDeferred==1
16490 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33   ); /* EV: R-303
164a0 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70 46  23-21917 */.  pF
164b0 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
164c0 3d 20 28 75 38 29 69 73 44 65 66 65 72 72 65 64  = (u8)isDeferred
164d0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
164e0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
164f0 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20  that will erase 
16500 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78  and refill index
16510 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73   *pIdx.  This is
16520 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74  .** used to init
16530 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63  ialize a newly c
16540 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20  reated index or 
16550 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65  to recompute the
16560 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  .** content of a
16570 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f  n index in respo
16580 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58  nse to a REINDEX
16590 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
165a0 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  if memRootPage i
165b0 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20  s not negative, 
165c0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
165d0 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79  e index is newly
165e0 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68  .** created.  Th
165f0 65 20 72 65 67 69 73 74 65 72 20 73 70 65 63 69  e register speci
16600 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50  fied by memRootP
16610 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  age contains the
16620 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  .** root page nu
16630 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
16640 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61  x.  If memRootPa
16650 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
16660 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65  then.** the inde
16670 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
16680 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65   and must be cle
16690 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ared before bein
166a0 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a  g refilled and.*
166b0 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * the root page 
166c0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
166d0 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  dex is taken fro
166e0 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a  m pIndex->tnum..
166f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
16700 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
16710 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
16720 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
16730 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29  int memRootPage)
16740 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
16750 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
16760 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  ;  /* The table 
16770 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20  that is indexed 
16780 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
16790 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
167a0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
167b0 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61  sor used for pTa
167c0 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20  b */.  int iIdx 
167d0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
167e0 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
167f0 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
16800 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  Index */.  int i
16810 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20 20 20  Sorter;         
16820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
16830 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 4f 70  sor opened by Op
16840 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69 6e 20  enSorter (if in 
16850 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64  use) */.  int ad
16860 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
16870 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
16880 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f  ess of top of lo
16890 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
168a0 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
168b0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
168c0 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72  s to jump to for
168d0 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
168e0 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20  */.  int tnum;  
168f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16900 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
16910 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   of index */.  i
16920 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c  nt iPartIdxLabel
16930 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
16940 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61   Jump to this la
16950 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20 72 6f  bel to skip a ro
16960 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  w */.  Vdbe *v; 
16970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16980 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
16990 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
169a0 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
169b0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
169c0 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
169d0 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20       /* KeyInfo 
169e0 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  for index */.  i
169f0 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20  nt regRecord;   
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16a10 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
16a20 67 20 61 73 73 65 6d 62 6c 65 64 20 69 6e 64 65  g assembled inde
16a30 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
16a40 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
16a50 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20  se->db;      /* 
16a60 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
16a70 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
16a80 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
16a90 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
16aa0 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
16ab0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
16ac0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
16ad0 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74  TION.  if( sqlit
16ae0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
16af0 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44  se, SQLITE_REIND
16b00 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  EX, pIndex->zNam
16b10 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e  e, 0,.      db->
16b20 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
16b30 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e ) ){.    retur
16b40 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
16b50 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77 72   /* Require a wr
16b60 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
16b70 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d  table to perform
16b80 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
16b90 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  */.  sqlite3Tabl
16ba0 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
16bb0 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31  b, pTab->tnum, 1
16bc0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
16bd0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
16be0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
16bf0 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
16c00 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f  rn;.  if( memRoo
16c10 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  tPage>=0 ){.    
16c20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61  tnum = memRootPa
16c30 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
16c40 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e   tnum = pIndex->
16c50 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79  tnum;.  }.  pKey
16c60 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
16c70 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c  oOfIndex(pParse,
16c80 20 70 49 6e 64 65 78 29 3b 0a 20 20 61 73 73 65   pIndex);.  asse
16c90 72 74 28 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64  rt( pKey!=0 || d
16ca0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
16cb0 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
16cc0 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  );..  /* Open th
16cd0 65 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72 20  e sorter cursor 
16ce0 69 66 20 77 65 20 61 72 65 20 74 6f 20 75 73 65  if we are to use
16cf0 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53 6f 72 74   one. */.  iSort
16d00 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  er = pParse->nTa
16d10 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  b++;.  sqlite3Vd
16d20 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
16d30 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53 6f 72 74  orterOpen, iSort
16d40 65 72 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e  er, 0, pIndex->n
16d50 4b 65 79 43 6f 6c 2c 20 28 63 68 61 72 2a 29 0a  KeyCol, (char*).
16d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d70 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
16d80 66 6f 52 65 66 28 70 4b 65 79 29 2c 20 50 34 5f  foRef(pKey), P4_
16d90 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20  KEYINFO);..  /* 
16da0 4f 70 65 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  Open the table. 
16db0 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
16dc0 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62   rows of the tab
16dd0 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67 20 69 6e  le, inserting in
16de0 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73  dex.  ** records
16df0 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72   into the sorter
16e00 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70  . */.  sqlite3Op
16e10 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
16e20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c  iTab, iDb, pTab,
16e30 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
16e40 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
16e50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16e60 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30  _Rewind, iTab, 0
16e70 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16e80 76 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20  v);.  regRecord 
16e90 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
16ea0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  Reg(pParse);..  
16eb0 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
16ec0 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 70  ndexKey(pParse,p
16ed0 49 6e 64 65 78 2c 69 54 61 62 2c 72 65 67 52 65  Index,iTab,regRe
16ee0 63 6f 72 64 2c 30 2c 26 69 50 61 72 74 49 64 78  cord,0,&iPartIdx
16ef0 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a 20 20 73 71  Label,0,0);.  sq
16f00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16f10 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  v, OP_SorterInse
16f20 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67  rt, iSorter, reg
16f30 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
16f40 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78  e3ResolvePartIdx
16f50 4c 61 62 65 6c 28 70 50 61 72 73 65 2c 20 69 50  Label(pParse, iP
16f60 61 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20  artIdxLabel);.  
16f70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16f80 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  2(v, OP_Next, iT
16f90 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64  ab, addr1+1); Vd
16fa0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16fb0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
16fc0 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
16fd0 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
16fe0 65 3c 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  e<0 ) sqlite3Vdb
16ff0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
17000 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b  ear, tnum, iDb);
17010 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17020 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp4(v, OP_OpenW
17030 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d  rite, iIdx, tnum
17040 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20  , iDb, .        
17050 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
17060 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59  r *)pKey, P4_KEY
17070 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
17080 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
17090 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28  OPFLAG_BULKCSR|(
170a0 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29  (memRootPage>=0)
170b0 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 3a  ?OPFLAG_P2ISREG:
170c0 30 29 29 3b 0a 0a 20 20 61 64 64 72 31 20 3d 20  0));..  addr1 = 
170d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
170e0 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f  2(v, OP_SorterSo
170f0 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 30 29 3b  rt, iSorter, 0);
17100 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
17110 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75 65  ;.  if( IsUnique
17120 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29 7b  Index(pIndex) ){
17130 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d 20 73 71  .    int j2 = sq
17140 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
17150 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20 20 20  Addr(v) + 3;.   
17160 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
17170 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20 61 64 64  (v, j2);.    add
17180 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
17190 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
171a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
171b0 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53  ddOp4Int(v, OP_S
171c0 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20 69 53  orterCompare, iS
171d0 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67 52 65  orter, j2, regRe
171e0 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  cord,.          
171f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17200 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b  Index->nKeyCol);
17210 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
17220 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69  ;.    sqlite3Uni
17230 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  queConstraint(pP
17240 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20  arse, OE_Abort, 
17250 70 49 6e 64 65 78 29 3b 0a 20 20 7d 65 6c 73 65  pIndex);.  }else
17260 7b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  {.    addr2 = sq
17270 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
17280 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73  Addr(v);.  }.  s
17290 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
172a0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
172b0 61 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52  a, iSorter, regR
172c0 65 63 6f 72 64 2c 20 69 49 64 78 29 3b 0a 20 20  ecord, iIdx);.  
172d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
172e0 31 28 76 2c 20 4f 50 5f 53 65 65 6b 45 6e 64 2c  1(v, OP_SeekEnd,
172f0 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65   iIdx);.  sqlite
17300 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17310 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64  P_IdxInsert, iId
17320 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  x, regRecord);. 
17330 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
17340 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55  geP5(v, OPFLAG_U
17350 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20  SESEEKRESULT);. 
17360 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
17370 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
17380 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
17390 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
173a0 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
173b0 20 69 53 6f 72 74 65 72 2c 20 61 64 64 72 32 29   iSorter, addr2)
173c0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
173d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
173e0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
173f0 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64  1);..  sqlite3Vd
17400 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
17410 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73  lose, iTab);.  s
17420 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
17430 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
17440 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dx);.  sqlite3Vd
17450 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
17460 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a  lose, iSorter);.
17470 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
17480 65 20 68 65 61 70 20 73 70 61 63 65 20 74 6f 20  e heap space to 
17490 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f 62  hold an Index ob
174a0 6a 65 63 74 20 77 69 74 68 20 6e 43 6f 6c 20 63  ject with nCol c
174b0 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e  olumns..**.** In
174c0 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 63  crease the alloc
174d0 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72  ation size to pr
174e0 6f 76 69 64 65 20 61 6e 20 65 78 74 72 61 20 6e  ovide an extra n
174f0 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f  Extra bytes.** o
17500 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  f 8-byte aligned
17510 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65   space after the
17520 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 61 6e   Index object an
17530 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f  d return a.** po
17540 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 65 78  inter to this ex
17550 74 72 61 20 73 70 61 63 65 20 69 6e 20 2a 70 70  tra space in *pp
17560 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20  Extra..*/.Index 
17570 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65  *sqlite3Allocate
17580 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20 20 73  IndexObject(.  s
17590 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
175a0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
175b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
175c0 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20  i16 nCol,       
175d0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
175e0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
175f0 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  in the index */.
17600 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
17610 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17620 20 6f 66 20 62 79 74 65 73 20 6f 66 20 65 78 74   of bytes of ext
17630 72 61 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  ra space to allo
17640 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70  c */.  char **pp
17650 45 78 74 72 61 20 20 20 20 20 20 20 2f 2a 20 50  Extra       /* P
17660 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 65  ointer to the "e
17670 78 74 72 61 22 20 73 70 61 63 65 20 2a 2f 0a 29  xtra" space */.)
17680 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20 20 20  {.  Index *p;   
17690 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
176a0 63 61 74 65 64 20 69 6e 64 65 78 20 6f 62 6a 65  cated index obje
176b0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ct */.  int nByt
176c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
176d0 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  Bytes of space f
176e0 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  or Index object 
176f0 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e  + arrays */..  n
17700 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69  Byte = ROUND8(si
17710 7a 65 6f 66 28 49 6e 64 65 78 29 29 20 2b 20 20  zeof(Index)) +  
17720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
17730 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 20  ndex structure  
17740 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55  */.          ROU
17750 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  ND8(sizeof(char*
17760 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20 20  )*nCol) +       
17770 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c    /* Index.azCol
17780 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  l     */.       
17790 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
177a0 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31  (LogEst)*(nCol+1
177b0 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  ) +     /* Index
177c0 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a  .aiRowLogEst   *
177d0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
177e0 20 20 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e     sizeof(i16)*n
177f0 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20  Col +           
17800 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75   /* Index.aiColu
17810 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  mn   */.        
17820 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
17830 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20  u8)*nCol);      
17840 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
17850 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20  aSortOrder */.  
17860 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
17870 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
17880 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  e + nExtra);.  i
17890 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68 61 72  f( p ){.    char
178a0 20 2a 70 45 78 74 72 61 20 3d 20 28 28 63 68 61   *pExtra = ((cha
178b0 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a  r*)p)+ROUND8(siz
178c0 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20  eof(Index));.   
178d0 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f   p->azColl = (co
178e0 6e 73 74 20 63 68 61 72 2a 2a 29 70 45 78 74 72  nst char**)pExtr
178f0 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 52 4f 55  a; pExtra += ROU
17900 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  ND8(sizeof(char*
17910 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e  )*nCol);.    p->
17920 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c  aiRowLogEst = (L
17930 6f 67 45 73 74 2a 29 70 45 78 74 72 61 3b 20 70  ogEst*)pExtra; p
17940 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
17950 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29  LogEst)*(nCol+1)
17960 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d  ;.    p->aiColum
17970 6e 20 3d 20 28 69 31 36 2a 29 70 45 78 74 72 61  n = (i16*)pExtra
17980 3b 20 20 20 20 20 20 20 70 45 78 74 72 61 20 2b  ;       pExtra +
17990 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43  = sizeof(i16)*nC
179a0 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74  ol;.    p->aSort
179b0 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 70 45 78  Order = (u8*)pEx
179c0 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c  tra;.    p->nCol
179d0 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20  umn = nCol;.    
179e0 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f  p->nKeyCol = nCo
179f0 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70 70 45 78  l - 1;.    *ppEx
17a00 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29  tra = ((char*)p)
17a10 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20   + nByte;.  }.  
17a20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
17a30 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
17a40 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c  index for an SQL
17a50 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e   table.  pName1.
17a60 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61  pName2 is the na
17a70 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
17a80 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74  .** and pTblList
17a90 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
17aa0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
17ab0 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
17ac0 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20    Both will .** 
17ad0 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72  be NULL for a pr
17ae0 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20  imary key or an 
17af0 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72  index that is cr
17b00 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79  eated to satisfy
17b10 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e   a.** UNIQUE con
17b20 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61  straint.  If pTa
17b30 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61  ble and pIndex a
17b40 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61  re NULL, use pPa
17b50 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a  rse->pNewTable.*
17b60 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74  * as the table t
17b70 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
17b80 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
17b90 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74   is a table that
17ba0 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79   is.** currently
17bb0 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
17bc0 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54  ed by a CREATE T
17bd0 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
17be0 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61  **.** pList is a
17bf0 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
17c00 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
17c10 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e   pList will be N
17c20 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ULL if this.** i
17c30 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  s a primary key 
17c40 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72  or unique-constr
17c50 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74  aint on the most
17c60 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61   recent column a
17c70 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74  dded.** to the t
17c80 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
17c90 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
17ca0 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  n.  .*/.void sql
17cb0 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
17cc0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
17cd0 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66  ,     /* All inf
17ce0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
17cf0 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54  his parse */.  T
17d00 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
17d10 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20    /* First part 
17d20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
17d30 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
17d40 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
17d50 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
17d60 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e  t of index name.
17d70 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
17d80 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e    SrcList *pTblN
17d90 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f  ame, /* Table to
17da0 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72   index. Use pPar
17db0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66  se->pNewTable if
17dc0 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74   0 */.  ExprList
17dd0 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20   *pList,   /* A 
17de0 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
17df0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
17e00 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
17e10 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72        /* OE_Abor
17e20 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45  t, OE_Ignore, OE
17e30 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f  _Replace, or OE_
17e40 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  None */.  Token 
17e50 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20  *pStart,     /* 
17e60 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
17e70 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 69   that begins thi
17e80 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  s statement */. 
17e90 20 45 78 70 72 20 2a 70 50 49 57 68 65 72 65 2c   Expr *pPIWhere,
17ea0 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61      /* WHERE cla
17eb0 75 73 65 20 66 6f 72 20 70 61 72 74 69 61 6c 20  use for partial 
17ec0 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74  indices */.  int
17ed0 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20   sortOrder,     
17ee0 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66  /* Sort order of
17ef0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65   primary key whe
17f00 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f  n pList==NULL */
17f10 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73  .  int ifNotExis
17f20 74 2c 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72  t,    /* Omit er
17f30 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72  ror if index alr
17f40 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20  eady exists */. 
17f50 20 75 38 20 69 64 78 54 79 70 65 20 20 20 20 20   u8 idxType     
17f60 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
17f70 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 54 61   type */.){.  Ta
17f80 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
17f90 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
17fa0 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49  e indexed */.  I
17fb0 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30  ndex *pIndex = 0
17fc0 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ;   /* The index
17fd0 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a   to be created *
17fe0 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  /.  char *zName 
17ff0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  = 0;     /* Name
18000 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   of the index */
18010 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
18020 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18030 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
18040 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e  in zName */.  in
18050 74 20 69 2c 20 6a 3b 0a 20 20 44 62 46 69 78 65  t i, j;.  DbFixe
18060 72 20 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f  r sFix;        /
18070 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20  * For assigning 
18080 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74  database names t
18090 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  o pTable */.  in
180a0 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b  t sortOrderMask;
180b0 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72     /* 1 to honor
180c0 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20   DESC in index. 
180d0 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f   0 to ignore. */
180e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
180f0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44   pParse->db;.  D
18100 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20  b *pDb;         
18110 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69      /* The speci
18120 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  fic table contai
18130 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64  ning the indexed
18140 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
18150 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
18160 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
18170 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
18180 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  t is being writt
18190 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
181a0 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Name = 0;    /* 
181b0 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
181c0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f   of the index to
181d0 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72   create */.  str
181e0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
181f0 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a  m *pListItem; /*
18200 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
18210 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  r pList */.  int
18220 20 6e 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20   nExtra = 0;    
18230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18240 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   Space allocated
18250 20 66 6f 72 20 7a 45 78 74 72 61 5b 5d 20 2a 2f   for zExtra[] */
18260 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 43 6f 6c  .  int nExtraCol
18270 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18280 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18290 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e   extra columns n
182a0 65 65 64 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  eeded */.  char 
182b0 2a 7a 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20  *zExtra = 0;    
182c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
182d0 78 74 72 61 20 73 70 61 63 65 20 61 66 74 65 72  xtra space after
182e0 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
182f0 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  t */.  Index *pP
18300 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50  k = 0;      /* P
18310 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
18320 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
18330 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a 0a 20 20  ID tables */..  
18340 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
18350 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
18360 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 67 6f  nErr>0 ){.    go
18370 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18380 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
18390 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
183a0 26 26 20 69 64 78 54 79 70 65 21 3d 53 51 4c 49  && idxType!=SQLI
183b0 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41  TE_IDXTYPE_PRIMA
183c0 52 59 4b 45 59 20 29 7b 0a 20 20 20 20 67 6f 74  RYKEY ){.    got
183d0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
183e0 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53  dex;.  }.  if( S
183f0 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
18400 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
18410 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  se) ){.    goto 
18420 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18430 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  x;.  }..  /*.  *
18440 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65  * Find the table
18450 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
18460 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20  ndexed.  Return 
18470 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75  early if not fou
18480 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  nd..  */.  if( p
18490 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20  TblName!=0 ){.. 
184a0 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77     /* Use the tw
184b0 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d  o-part index nam
184c0 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
184d0 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
184e0 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f   ** to search fo
184f0 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69  r the table. 'Fi
18500 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  x' the table nam
18510 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20  e to this db.   
18520 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69   ** before looki
18530 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e  ng up the table.
18540 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
18550 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e  rt( pName1 && pN
18560 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20  ame2 );.    iDb 
18570 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
18580 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
18590 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
185a0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44  ame);.    if( iD
185b0 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  b<0 ) goto exit_
185c0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
185d0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 20    assert( pName 
185e0 26 26 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a  && pName->z );..
185f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18600 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f  MIT_TEMPDB.    /
18610 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e  * If the index n
18620 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66  ame was unqualif
18630 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68  ied, check if th
18640 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  e table.    ** i
18650 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20  s a temp table. 
18660 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64  If so, set the d
18670 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20 44 6f  atabase to 1. Do
18680 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20 20 20   not do this.   
18690 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c 69 73   ** if initialis
186a0 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 73  ing a database s
186b0 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20  chema..    */.  
186c0 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
186d0 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 70 54  busy ){.      pT
186e0 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  ab = sqlite3SrcL
186f0 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  istLookup(pParse
18700 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20  , pTblName);.   
18710 20 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e     if( pName2->n
18720 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20 70  ==0 && pTab && p
18730 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62  Tab->pSchema==db
18740 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
18750 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44 62 20   ){.        iDb 
18760 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
18770 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73   }.#endif..    s
18780 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
18790 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
187a0 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65  , "index", pName
187b0 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
187c0 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46  e3FixSrcList(&sF
187d0 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 20 29 7b  ix, pTblName) ){
187e0 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73  .      /* Becaus
187f0 65 20 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e  e the parser con
18800 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d 65  structs pTblName
18810 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69   from a single i
18820 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20 20  dentifier,.     
18830 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72   ** sqlite3FixSr
18840 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72 20  cList can never 
18850 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61  fail. */.      a
18860 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a  ssert(0);.    }.
18870 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
18880 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
18890 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 26 70 54  m(pParse, 0, &pT
188a0 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20  blName->a[0]);. 
188b0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
188c0 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c  allocFailed==0 |
188d0 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  | pTab==0 );.   
188e0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
188f0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18900 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 69  index;.    if( i
18910 44 62 3d 3d 31 20 26 26 20 64 62 2d 3e 61 44 62  Db==1 && db->aDb
18920 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 21 3d 70  [iDb].pSchema!=p
18930 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  Tab->pSchema ){.
18940 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
18950 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
18960 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f            "canno
18970 74 20 63 72 65 61 74 65 20 61 20 54 45 4d 50 20  t create a TEMP 
18980 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d  index on non-TEM
18990 50 20 74 61 62 6c 65 20 5c 22 25 73 5c 22 22 2c  P table \"%s\"",
189a0 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
189b0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
189c0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
189d0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
189e0 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
189f0 70 54 61 62 29 20 29 20 70 50 6b 20 3d 20 73 71  pTab) ) pPk = sq
18a00 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
18a10 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 65  ndex(pTab);.  }e
18a20 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
18a30 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20   pName==0 );.   
18a40 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74 3d   assert( pStart=
18a50 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
18a60 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
18a70 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61  le;.    if( !pTa
18a80 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  b ) goto exit_cr
18a90 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
18aa0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
18ab0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
18ac0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
18ad0 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e   }.  pDb = &db->
18ae0 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73  aDb[iDb];..  ass
18af0 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
18b00 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
18b10 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69  ->nErr==0 );.  i
18b20 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
18b30 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
18b40 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
18b50 20 0a 20 20 20 20 20 20 20 26 26 20 64 62 2d 3e   .       && db->
18b60 69 6e 69 74 2e 62 75 73 79 3d 3d 30 0a 23 69 66  init.busy==0.#if
18b70 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
18b80 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20  HENTICATION.    
18b90 20 20 20 26 26 20 73 71 6c 69 74 65 33 55 73 65     && sqlite3Use
18ba0 72 41 75 74 68 54 61 62 6c 65 28 70 54 61 62 2d  rAuthTable(pTab-
18bb0 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65 6e 64 69  >zName)==0.#endi
18bc0 66 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  f.       && sqli
18bd0 74 65 33 53 74 72 4e 49 43 6d 70 28 26 70 54 61  te3StrNICmp(&pTa
18be0 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74  b->zName[7],"alt
18bf0 65 72 74 61 62 5f 22 2c 39 29 21 3d 30 20 29 7b  ertab_",9)!=0 ){
18c00 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
18c10 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
18c20 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62  ble %s may not b
18c30 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62  e indexed", pTab
18c40 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
18c50 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18c60 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  ndex;.  }.#ifnde
18c70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
18c80 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70  EW.  if( pTab->p
18c90 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
18ca0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18cb0 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79  arse, "views may
18cc0 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
18cd0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
18ce0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18cf0 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   }.#endif.#ifnde
18d00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
18d10 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
18d20 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
18d30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
18d40 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
18d50 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20  "virtual tables 
18d60 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
18d70 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ed");.    goto e
18d80 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18d90 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
18da0 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
18db0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
18dc0 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  ex.  Make sure t
18dd0 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  here is not alre
18de0 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a  ady another.  **
18df0 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
18e00 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
18e10 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  me.  .  **.  ** 
18e20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77  Exception:  If w
18e30 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
18e40 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61  e names of perma
18e50 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f  nent indices fro
18e60 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  m the.  ** sqlit
18e70 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28  e_master table (
18e80 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68  because some oth
18e90 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67  er process chang
18ea0 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61  ed the schema) a
18eb0 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74  nd.  ** one of t
18ec0 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63  he index names c
18ed0 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65  ollides with the
18ee0 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f   name of a tempo
18ef0 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20  rary table or.  
18f00 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77  ** index, then w
18f10 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
18f20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20  to process this 
18f30 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
18f40 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20   If pName==0 it 
18f50 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72  means that we ar
18f60 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77  e.  ** dealing w
18f70 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65  ith a primary ke
18f80 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  y or UNIQUE cons
18f90 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65  traint.  We have
18fa0 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20   to invent our. 
18fb0 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20   ** own name..  
18fc0 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29  */.  if( pName )
18fd0 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
18fe0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
18ff0 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
19000 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
19010 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
19020 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
19030 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d  sert( pName->z!=
19040 30 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  0 );.    if( SQL
19050 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43  ITE_OK!=sqlite3C
19060 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70  heckObjectName(p
19070 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  Parse, zName) ){
19080 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
19090 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
190a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62     }.    if( !db
190b0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
190c0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
190d0 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
190e0 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20  ame, 0)!=0 ){.  
190f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
19100 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
19110 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
19120 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73  a table named %s
19130 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
19140 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
19150 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
19160 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
19170 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
19180 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62  x(db, zName, pDb
19190 2d 3e 7a 44 62 53 4e 61 6d 65 29 21 3d 30 20 29  ->zDbSName)!=0 )
191a0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 66 4e  {.      if( !ifN
191b0 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20  otExist ){.     
191c0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
191d0 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
191e0 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69  x %s already exi
191f0 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  sts", zName);.  
19200 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19210 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
19220 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20  init.busy );.   
19230 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
19240 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
19250 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
19260 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78   }.      goto ex
19270 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19280 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
19290 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49      int n;.    I
192a0 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20  ndex *pLoop;.   
192b0 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d   for(pLoop=pTab-
192c0 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c  >pIndex, n=1; pL
192d0 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
192e0 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a  ->pNext, n++){}.
192f0 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
19300 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
19310 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78  sqlite_autoindex
19320 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a  _%s_%d", pTab->z
19330 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66  Name, n);.    if
19340 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
19350 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
19360 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
19370 7d 0a 0a 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61  }..    /* Automa
19380 74 69 63 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  tic index names 
19390 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 77  generated from w
193a0 69 74 68 69 6e 20 73 71 6c 69 74 65 33 5f 64 65  ithin sqlite3_de
193b0 63 6c 61 72 65 5f 76 74 61 62 28 29 0a 20 20 20  clare_vtab().   
193c0 20 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 6e 61   ** must have na
193d0 6d 65 73 20 74 68 61 74 20 61 72 65 20 64 69 73  mes that are dis
193e0 74 69 6e 63 74 20 66 72 6f 6d 20 6e 6f 72 6d 61  tinct from norma
193f0 6c 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  l automatic inde
19400 78 20 6e 61 6d 65 73 2e 0a 20 20 20 20 2a 2a 20  x names..    ** 
19410 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  The following st
19420 61 74 65 6d 65 6e 74 20 63 6f 6e 76 65 72 74 73  atement converts
19430 20 22 73 71 6c 69 74 65 33 5f 61 75 74 6f 69 6e   "sqlite3_autoin
19440 64 65 78 2e 2e 2e 22 20 69 6e 74 6f 0a 20 20 20  dex..." into.   
19450 20 2a 2a 20 22 73 71 6c 69 74 65 33 5f 62 75 74   ** "sqlite3_but
19460 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e 20 6f 72  oindex..." in or
19470 64 65 72 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  der to make the 
19480 6e 61 6d 65 73 20 64 69 73 74 69 6e 63 74 2e 0a  names distinct..
19490 20 20 20 20 2a 2a 20 54 68 65 20 22 76 74 61 62      ** The "vtab
194a0 5f 65 72 72 2e 74 65 73 74 22 20 74 65 73 74 20  _err.test" test 
194b0 64 65 6d 6f 6e 73 74 72 61 74 65 73 20 74 68 65  demonstrates the
194c0 20 6e 65 65 64 20 6f 66 20 74 68 69 73 20 73 74   need of this st
194d0 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20  atement. */.    
194e0 69 66 28 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56  if( IN_DECLARE_V
194f0 54 41 42 20 29 20 7a 4e 61 6d 65 5b 37 5d 2b 2b  TAB ) zName[7]++
19500 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
19510 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74  k for authorizat
19520 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e  ion to create an
19530 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66   index..  */.#if
19540 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19550 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
19560 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
19570 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 44  r *zDb = pDb->zD
19580 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  bSName;.    if( 
19590 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
195a0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
195b0 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
195c0 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44  ABLE(iDb), 0, zD
195d0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
195e0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
195f0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  ex;.    }.    i 
19600 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
19610 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21  INDEX;.    if( !
19620 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
19630 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49  Db==1 ) i = SQLI
19640 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
19650 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
19660 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
19670 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c  Parse, i, zName,
19680 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
19690 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
196a0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
196b0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
196c0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c  ndif..  /* If pL
196d0 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73  ist==0, it means
196e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
196f0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65  s called to make
19700 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20   a primary.  ** 
19710 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  key out of the l
19720 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
19730 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e   to the table un
19740 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
19750 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65  ..  ** So create
19760 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20   a fake list to 
19770 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20  simulate this.. 
19780 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
19790 3d 30 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20  =0 ){.    Token 
197a0 70 72 65 76 43 6f 6c 3b 0a 20 20 20 20 43 6f 6c  prevCol;.    Col
197b0 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 26 70 54 61  umn *pCol = &pTa
197c0 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
197d0 6f 6c 2d 31 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d  ol-1];.    pCol-
197e0 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  >colFlags |= COL
197f0 46 4c 41 47 5f 55 4e 49 51 55 45 3b 0a 20 20 20  FLAG_UNIQUE;.   
19800 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69   sqlite3TokenIni
19810 74 28 26 70 72 65 76 43 6f 6c 2c 20 70 43 6f 6c  t(&prevCol, pCol
19820 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c  ->zName);.    pL
19830 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
19840 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
19850 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  se, 0,.         
19860 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
19870 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c  Alloc(db, TK_ID,
19880 20 26 70 72 65 76 43 6f 6c 2c 20 30 29 29 3b 0a   &prevCol, 0));.
19890 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
198a0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
198b0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61  ate_index;.    a
198c0 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
198d0 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71  xpr==1 );.    sq
198e0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
198f0 53 6f 72 74 4f 72 64 65 72 28 70 4c 69 73 74 2c  SortOrder(pList,
19900 20 73 6f 72 74 4f 72 64 65 72 29 3b 0a 20 20 7d   sortOrder);.  }
19910 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
19920 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65  3ExprListCheckLe
19930 6e 67 74 68 28 70 50 61 72 73 65 2c 20 70 4c 69  ngth(pParse, pLi
19940 73 74 2c 20 22 69 6e 64 65 78 22 29 3b 0a 20 20  st, "index");.  
19950 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
19960 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65  ut how many byte
19970 73 20 6f 66 20 73 70 61 63 65 20 61 72 65 20 72  s of space are r
19980 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65  equired to store
19990 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a   explicitly.  **
199a0 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61   specified colla
199b0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
199c0 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  mes..  */.  for(
199d0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
199e0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
199f0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69  xpr *pExpr = pLi
19a00 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
19a10 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
19a20 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  r!=0 );.    if( 
19a30 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
19a40 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 6e  LLATE ){.      n
19a50 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20 73 71  Extra += (1 + sq
19a60 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45  lite3Strlen30(pE
19a70 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29 3b  xpr->u.zToken));
19a80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
19a90 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20   .  ** Allocate 
19aa0 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
19ab0 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61  ure. .  */.  nNa
19ac0 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
19ad0 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e  en30(zName);.  n
19ae0 45 78 74 72 61 43 6f 6c 20 3d 20 70 50 6b 20 3f  ExtraCol = pPk ?
19af0 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20   pPk->nKeyCol : 
19b00 31 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  1;.  pIndex = sq
19b10 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64  lite3AllocateInd
19b20 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 4c 69  exObject(db, pLi
19b30 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e 45 78 74  st->nExpr + nExt
19b40 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20  raCol,.         
19b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b60 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4e 61               nNa
19b70 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b 20 31 2c  me + nExtra + 1,
19b80 20 26 7a 45 78 74 72 61 29 3b 0a 20 20 69 66 28   &zExtra);.  if(
19b90 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
19ba0 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
19bb0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19bc0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45  .  }.  assert( E
19bd0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
19be0 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 69 52 6f  ENT(pIndex->aiRo
19bf0 77 4c 6f 67 45 73 74 29 20 29 3b 0a 20 20 61 73  wLogEst) );.  as
19c00 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
19c10 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65  _ALIGNMENT(pInde
19c20 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20  x->azColl) );.  
19c30 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20  pIndex->zName = 
19c40 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61  zExtra;.  zExtra
19c50 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20   += nName + 1;. 
19c60 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e   memcpy(pIndex->
19c70 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  zName, zName, nN
19c80 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78  ame+1);.  pIndex
19c90 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b  ->pTable = pTab;
19ca0 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  .  pIndex->onErr
19cb0 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72  or = (u8)onError
19cc0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71  ;.  pIndex->uniq
19cd0 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f  NotNull = onErro
19ce0 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70 49  r!=OE_None;.  pI
19cf0 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 20 3d 20  ndex->idxType = 
19d00 69 64 78 54 79 70 65 3b 0a 20 20 70 49 6e 64 65  idxType;.  pInde
19d10 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  x->pSchema = db-
19d20 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
19d30 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65  a;.  pIndex->nKe
19d40 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  yCol = pList->nE
19d50 78 70 72 3b 0a 20 20 69 66 28 20 70 50 49 57 68  xpr;.  if( pPIWh
19d60 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ere ){.    sqlit
19d70 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66  e3ResolveSelfRef
19d80 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70  erence(pParse, p
19d90 54 61 62 2c 20 4e 43 5f 50 61 72 74 49 64 78 2c  Tab, NC_PartIdx,
19da0 20 70 50 49 57 68 65 72 65 2c 20 30 29 3b 0a 20   pPIWhere, 0);. 
19db0 20 20 20 70 49 6e 64 65 78 2d 3e 70 50 61 72 74     pIndex->pPart
19dc0 49 64 78 57 68 65 72 65 20 3d 20 70 50 49 57 68  IdxWhere = pPIWh
19dd0 65 72 65 3b 0a 20 20 20 20 70 50 49 57 68 65 72  ere;.    pPIWher
19de0 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  e = 0;.  }.  ass
19df0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
19e00 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
19e10 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a  iDb, 0) );..  /*
19e20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
19e30 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72   we should honor
19e40 20 44 45 53 43 20 72 65 71 75 65 73 74 73 20 6f   DESC requests o
19e50 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a  n index columns.
19e60 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e    */.  if( pDb->
19e70 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f  pSchema->file_fo
19e80 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73  rmat>=4 ){.    s
19e90 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d  ortOrderMask = -
19ea0 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45  1;   /* Honor DE
19eb0 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  SC */.  }else{. 
19ec0 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b     sortOrderMask
19ed0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f   = 0;    /* Igno
19ee0 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a  re DESC */.  }..
19ef0 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65    /* Analyze the
19f00 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
19f10 69 6f 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74  ions that form t
19f20 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
19f30 69 6e 64 65 78 20 61 6e 64 0a 20 20 2a 2a 20 72  index and.  ** r
19f40 65 70 6f 72 74 20 61 6e 79 20 65 72 72 6f 72 73  eport any errors
19f50 2e 20 20 49 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  .  In the common
19f60 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
19f70 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 78  expression is ex
19f80 61 63 74 6c 79 0a 20 20 2a 2a 20 61 20 74 61 62  actly.  ** a tab
19f90 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73 74 6f 72 65  le column, store
19fa0 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20   that column in 
19fb0 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20 46 6f 72  aiColumn[].  For
19fc0 20 67 65 6e 65 72 61 6c 20 65 78 70 72 65 73 73   general express
19fd0 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f 70 75 6c  ions,.  ** popul
19fe0 61 74 65 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c  ate pIndex->aCol
19ff0 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 58  Expr and store X
1a000 4e 5f 45 58 50 52 20 28 2d 32 29 20 69 6e 20 61  N_EXPR (-2) in a
1a010 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a  iColumn[]..  **.
1a020 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65    ** TODO: Issue
1a030 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74 77   a warning if tw
1a040 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e  o or more column
1a050 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  s of the index a
1a060 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20  re identical..  
1a070 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65 20 61  ** TODO: Issue a
1a080 20 77 61 72 6e 69 6e 67 20 69 66 20 74 68 65 20   warning if the 
1a090 74 61 62 6c 65 20 70 72 69 6d 61 72 79 20 6b 65  table primary ke
1a0a0 79 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72  y is used as par
1a0b0 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e  t of the.  ** in
1a0c0 64 65 78 20 6b 65 79 2e 0a 20 20 2a 2f 0a 20 20  dex key..  */.  
1a0d0 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74  for(i=0, pListIt
1a0e0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
1a0f0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1a100 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a  , pListItem++){.
1a110 20 20 20 20 45 78 70 72 20 2a 70 43 45 78 70 72      Expr *pCExpr
1a120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a130 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 69     /* The i-th i
1a140 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f 6e 20  ndex expression 
1a150 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65  */.    int reque
1a160 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 20 20  stedSortOrder;  
1a170 20 20 20 20 20 20 2f 2a 20 41 53 43 20 6f 72 20        /* ASC or 
1a180 44 45 53 43 20 6f 6e 20 74 68 65 20 69 2d 74 68  DESC on the i-th
1a190 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
1a1a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1a1b0 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
1a1c0 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73    /* Collation s
1a1d0 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a  equence name */.
1a1e0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 69  .    sqlite3Stri
1a1f0 6e 67 54 6f 49 64 28 70 4c 69 73 74 49 74 65 6d  ngToId(pListItem
1a200 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->pExpr);.    sq
1a210 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66  lite3ResolveSelf
1a220 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65  Reference(pParse
1a230 2c 20 70 54 61 62 2c 20 4e 43 5f 49 64 78 45 78  , pTab, NC_IdxEx
1a240 70 72 2c 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  pr, pListItem->p
1a250 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 69 66  Expr, 0);.    if
1a260 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
1a270 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1a280 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70 43 45  e_index;.    pCE
1a290 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1a2a0 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69  rSkipCollate(pLi
1a2b0 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a  stItem->pExpr);.
1a2c0 20 20 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e      if( pCExpr->
1a2d0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op!=TK_COLUMN ){
1a2e0 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
1a2f0 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62  =pParse->pNewTab
1a300 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  le ){.        sq
1a310 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1a320 61 72 73 65 2c 20 22 65 78 70 72 65 73 73 69 6f  arse, "expressio
1a330 6e 73 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e  ns prohibited in
1a340 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64   PRIMARY KEY and
1a350 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a370 20 20 20 22 55 4e 49 51 55 45 20 63 6f 6e 73 74     "UNIQUE const
1a380 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  raints");.      
1a390 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1a3a0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
1a3b0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 64  }.      if( pInd
1a3c0 65 78 2d 3e 61 43 6f 6c 45 78 70 72 3d 3d 30 20  ex->aColExpr==0 
1a3d0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  ){.        ExprL
1a3e0 69 73 74 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c  ist *pCopy = sql
1a3f0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
1a400 64 62 2c 20 70 4c 69 73 74 2c 20 30 29 3b 0a 20  db, pList, 0);. 
1a410 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
1a420 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 70 79 3b  ColExpr = pCopy;
1a430 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62  .        if( !db
1a440 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1a450 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
1a460 72 74 28 20 70 43 6f 70 79 21 3d 30 20 29 3b 0a  rt( pCopy!=0 );.
1a470 20 20 20 20 20 20 20 20 20 20 70 4c 69 73 74 49            pListI
1a480 74 65 6d 20 3d 20 26 70 43 6f 70 79 2d 3e 61 5b  tem = &pCopy->a[
1a490 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i];.        }.  
1a4a0 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20      }.      j = 
1a4b0 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70  XN_EXPR;.      p
1a4c0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
1a4d0 69 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20  i] = XN_EXPR;.  
1a4e0 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71      pIndex->uniq
1a4f0 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  NotNull = 0;.   
1a500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 20   }else{.      j 
1a510 3d 20 70 43 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  = pCExpr->iColum
1a520 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
1a530 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a 20 20   j<=0x7fff );.  
1a540 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20      if( j<0 ){. 
1a550 20 20 20 20 20 20 20 6a 20 3d 20 70 54 61 62 2d         j = pTab-
1a560 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  >iPKey;.      }e
1a570 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 61 43  lse if( pTab->aC
1a580 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  ol[j].notNull==0
1a590 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   ){.        pInd
1a5a0 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  ex->uniqNotNull 
1a5b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1a5c0 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
1a5d0 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29 6a 3b  umn[i] = (i16)j;
1a5e0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 6c  .    }.    zColl
1a5f0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c   = 0;.    if( pL
1a600 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
1a610 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
1a620 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c  {.      int nCol
1a630 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  l;.      zColl =
1a640 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
1a650 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
1a660 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     nColl = sqlit
1a670 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c  e3Strlen30(zColl
1a680 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) + 1;.      ass
1a690 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f  ert( nExtra>=nCo
1a6a0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ll );.      memc
1a6b0 70 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c  py(zExtra, zColl
1a6c0 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , nColl);.      
1a6d0 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a  zColl = zExtra;.
1a6e0 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20        zExtra += 
1a6f0 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78  nColl;.      nEx
1a700 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20  tra -= nColl;.  
1a710 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3e 3d 30    }else if( j>=0
1a720 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20   ){.      zColl 
1a730 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
1a740 7a 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  zColl;.    }.   
1a750 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43   if( !zColl ) zC
1a760 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72  oll = sqlite3Str
1a770 42 49 4e 41 52 59 3b 0a 20 20 20 20 69 66 28 20  BINARY;.    if( 
1a780 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
1a790 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  & !sqlite3Locate
1a7a0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1a7b0 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
1a7c0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1a7d0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
1a7e0 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c    pIndex->azColl
1a7f0 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20  [i] = zColl;.   
1a800 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72   requestedSortOr
1a810 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  der = pListItem-
1a820 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72  >sortOrder & sor
1a830 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20  tOrderMask;.    
1a840 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
1a850 65 72 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75  er[i] = (u8)requ
1a860 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a  estedSortOrder;.
1a870 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64    }..  /* Append
1a880 20 74 68 65 20 74 61 62 6c 65 20 6b 65 79 20 74   the table key t
1a890 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1a8a0 20 69 6e 64 65 78 2e 20 20 46 6f 72 20 57 49 54   index.  For WIT
1a8b0 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 2a 2a 20  HOUT ROWID.  ** 
1a8c0 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b  tables (when pPk
1a8d0 21 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62  !=0) this will b
1a8e0 65 20 74 68 65 20 64 65 63 6c 61 72 65 64 20 50  e the declared P
1a8f0 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72  RIMARY KEY.  For
1a900 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 74 61 62  .  ** normal tab
1a910 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 3d 3d 30  les (when pPk==0
1a920 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74  ) this will be t
1a930 68 65 20 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20  he rowid..  */. 
1a940 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20   if( pPk ){.    
1a950 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e  for(j=0; j<pPk->
1a960 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  nKeyCol; j++){. 
1a970 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 6b       int x = pPk
1a980 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
1a990 20 20 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d       assert( x>=
1a9a0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68  0 );.      if( h
1a9b0 61 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d  asColumn(pIndex-
1a9c0 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65  >aiColumn, pInde
1a9d0 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29 20 29  x->nKeyCol, x) )
1a9e0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
1a9f0 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20  ->nColumn--; .  
1aa00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1aa10 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
1aa20 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20 20 20  umn[i] = x;.    
1aa30 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
1aa40 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43  ll[i] = pPk->azC
1aa50 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
1aa60 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
1aa70 65 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f  er[i] = pPk->aSo
1aa80 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20  rtOrder[j];.    
1aa90 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d      i++;.      }
1aaa0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1aab0 74 28 20 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43  t( i==pIndex->nC
1aac0 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73 65  olumn );.  }else
1aad0 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69  {.    pIndex->ai
1aae0 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 52  Column[i] = XN_R
1aaf0 4f 57 49 44 3b 0a 20 20 20 20 70 49 6e 64 65 78  OWID;.    pIndex
1ab00 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  ->azColl[i] = sq
1ab10 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a  lite3StrBINARY;.
1ab20 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66    }.  sqlite3Def
1ab30 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65  aultRowEst(pInde
1ab40 78 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  x);.  if( pParse
1ab50 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29  ->pNewTable==0 )
1ab60 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69   estimateIndexWi
1ab70 64 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20  dth(pIndex);..  
1ab80 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65 78  /* If this index
1ab90 20 63 6f 6e 74 61 69 6e 73 20 65 76 65 72 79 20   contains every 
1aba0 63 6f 6c 75 6d 6e 20 6f 66 20 69 74 73 20 74 61  column of its ta
1abb0 62 6c 65 2c 20 74 68 65 6e 20 6d 61 72 6b 0a 20  ble, then mark. 
1abc0 20 2a 2a 20 69 74 20 61 73 20 61 20 63 6f 76 65   ** it as a cove
1abd0 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ring index */.  
1abe0 61 73 73 65 72 74 28 20 48 61 73 52 6f 77 69 64  assert( HasRowid
1abf0 28 70 54 61 62 29 20 0a 20 20 20 20 20 20 7c 7c  (pTab) .      ||
1ac00 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c   pTab->iPKey<0 |
1ac10 7c 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  | sqlite3ColumnO
1ac20 66 49 6e 64 65 78 28 70 49 6e 64 65 78 2c 20 70  fIndex(pIndex, p
1ac30 54 61 62 2d 3e 69 50 4b 65 79 29 3e 3d 30 20 29  Tab->iPKey)>=0 )
1ac40 3b 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65  ;.  if( pTblName
1ac50 21 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 6e  !=0 && pIndex->n
1ac60 43 6f 6c 75 6d 6e 3e 3d 70 54 61 62 2d 3e 6e 43  Column>=pTab->nC
1ac70 6f 6c 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  ol ){.    pIndex
1ac80 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31  ->isCovering = 1
1ac90 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1aca0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
1acb0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d  ){.      if( j==
1acc0 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f  pTab->iPKey ) co
1acd0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
1ace0 28 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  ( sqlite3ColumnO
1acf0 66 49 6e 64 65 78 28 70 49 6e 64 65 78 2c 6a 29  fIndex(pIndex,j)
1ad00 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  >=0 ) continue;.
1ad10 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 69 73        pIndex->is
1ad20 43 6f 76 65 72 69 6e 67 20 3d 20 30 3b 0a 20 20  Covering = 0;.  
1ad30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ad40 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 61 62  .  }..  if( pTab
1ad50 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ==pParse->pNewTa
1ad60 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ble ){.    /* Th
1ad70 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62  is routine has b
1ad80 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  een called to cr
1ad90 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69  eate an automati
1ada0 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20  c index as a.   
1adb0 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20   ** result of a 
1adc0 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
1add0 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20  NIQUE clause on 
1ade0 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  a column definit
1adf0 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  ion, or.    ** a
1ae00 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
1ae10 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f  UNIQUE clause fo
1ae20 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75  llowing the colu
1ae30 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a  mn definitions..
1ae40 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20      ** i.e. one 
1ae50 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
1ae60 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
1ae70 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
1ae80 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54  y);.    ** CREAT
1ae90 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20  E TABLE t(x, y, 
1aea0 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
1aeb0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74     **.    ** Eit
1aec0 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74  her way, check t
1aed0 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62  o see if the tab
1aee0 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73  le already has s
1aef0 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66  uch an index. If
1af00 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27  .    ** so, don'
1af10 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e  t bother creatin
1af20 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73  g this one. This
1af30 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f   only applies to
1af40 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
1af50 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e  cally created in
1af60 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e  dices. Users can
1af70 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68   do as they wish
1af80 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70   with.    ** exp
1af90 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20  licit indices.. 
1afa0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f     **.    ** Two
1afb0 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41   UNIQUE or PRIMA
1afc0 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
1afd0 74 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  ts are considere
1afe0 64 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20  d equivalent.   
1aff0 20 2a 2a 20 28 61 6e 64 20 74 68 75 73 20 73 75   ** (and thus su
1b000 70 70 72 65 73 73 69 6e 67 20 74 68 65 20 73 65  ppressing the se
1b010 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20 69  cond one) even i
1b020 66 20 74 68 65 79 20 68 61 76 65 20 64 69 66 66  f they have diff
1b030 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72  erent.    ** sor
1b040 74 20 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a  t orders..    **
1b050 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
1b060 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 63   are different c
1b070 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1b080 65 73 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6c  es or if the col
1b090 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74  umns of.    ** t
1b0a0 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63  he constraint oc
1b0b0 63 75 72 20 69 6e 20 64 69 66 66 65 72 65 6e 74  cur in different
1b0c0 20 6f 72 64 65 72 73 2c 20 74 68 65 6e 20 74 68   orders, then th
1b0d0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  e constraints ar
1b0e0 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65  e.    ** conside
1b0f0 72 65 64 20 64 69 73 74 69 6e 63 74 20 61 6e 64  red distinct and
1b100 20 62 6f 74 68 20 72 65 73 75 6c 74 20 69 6e 20   both result in 
1b110 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73  separate indices
1b120 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64  ..    */.    Ind
1b130 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
1b140 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
1b150 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
1b160 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
1b170 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
1b180 20 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 75   assert( IsUniqu
1b190 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 3b 0a  eIndex(pIdx) );.
1b1a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1b1b0 64 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c  dx->idxType!=SQL
1b1c0 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
1b1d0 45 46 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EF );.      asse
1b1e0 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65  rt( IsUniqueInde
1b1f0 78 28 70 49 6e 64 65 78 29 20 29 3b 0a 0a 20 20  x(pIndex) );..  
1b200 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b      if( pIdx->nK
1b210 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e  eyCol!=pIndex->n
1b220 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75  KeyCol ) continu
1b230 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  e;.      for(k=0
1b240 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; k<pIdx->nKeyCo
1b250 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; k++){.       
1b260 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b   const char *z1;
1b270 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
1b280 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20  har *z2;.       
1b290 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
1b2a0 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b  iColumn[k]>=0 );
1b2b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
1b2c0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d  x->aiColumn[k]!=
1b2d0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1b2e0 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  [k] ) break;.   
1b2f0 20 20 20 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e       z1 = pIdx->
1b300 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20  azColl[k];.     
1b310 20 20 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e     z2 = pIndex->
1b320 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20  azColl[k];.     
1b330 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1b340 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20  rICmp(z1, z2) ) 
1b350 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1b360 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78       if( k==pIdx
1b370 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  ->nKeyCol ){.   
1b380 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
1b390 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e  nError!=pIndex->
1b3a0 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  onError ){.     
1b3b0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
1b3c0 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20  straint creates 
1b3d0 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61  the same index a
1b3e0 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  s a previous.   
1b3f0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
1b400 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73  aint specified s
1b410 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20  omewhere in the 
1b420 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
1b430 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20  tement..        
1b440 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65    ** However the
1b450 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
1b460 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65  uses are differe
1b470 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73  nt. If both this
1b480 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63   .          ** c
1b490 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
1b4a0 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76  e previous equiv
1b4b0 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74  alent constraint
1b4c0 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20   have explicit. 
1b4d0 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43           ** ON C
1b4e0 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
1b4f0 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  this is an error
1b500 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65  . Otherwise, use
1b510 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
1b520 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  * explicitly spe
1b530 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 72 20  cified behavior 
1b540 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  for the index.. 
1b550 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1b560 20 20 20 20 20 20 69 66 28 20 21 28 70 49 64 78        if( !(pIdx
1b570 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
1b580 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d  fault || pIndex-
1b590 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
1b5a0 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20  ault) ){.       
1b5b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1b5c0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
1b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
1b5e0 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f  onflicting ON CO
1b5f0 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73  NFLICT clauses s
1b600 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20  pecified", 0);. 
1b610 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1b620 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
1b630 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
1b640 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  lt ){.          
1b650 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20    pIdx->onError 
1b660 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  = pIndex->onErro
1b670 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
1b680 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b690 20 69 66 28 20 69 64 78 54 79 70 65 3d 3d 53 51   if( idxType==SQ
1b6a0 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49  LITE_IDXTYPE_PRI
1b6b0 4d 41 52 59 4b 45 59 20 29 20 70 49 64 78 2d 3e  MARYKEY ) pIdx->
1b6c0 69 64 78 54 79 70 65 20 3d 20 69 64 78 54 79 70  idxType = idxTyp
1b6d0 65 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  e;.        goto 
1b6e0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1b6f0 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
1b700 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  .  }..  /* Link 
1b710 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74  the new Index st
1b720 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74  ructure to its t
1b730 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20  able and to the 
1b740 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65  other.  ** in-me
1b750 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74  mory database st
1b760 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a  ructures. .  */.
1b770 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1b780 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69  ->nErr==0 );.  i
1b790 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1b7a0 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
1b7b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 49  ;.    assert( !I
1b7c0 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
1b7d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
1b7e0 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
1b7f0 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64  Held(db, 0, pInd
1b800 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a  ex->pSchema) );.
1b810 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
1b820 61 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65  ashInsert(&pInde
1b830 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  x->pSchema->idxH
1b840 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ash, .          
1b850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b860 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70  pIndex->zName, p
1b870 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
1b880 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
1b890 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20  t( p==pIndex ); 
1b8a0 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
1b8b0 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
1b8c0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
1b8d0 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20  ault(db);.      
1b8e0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1b8f0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
1b900 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c    db->mDbFlags |
1b910 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43  = DBFLAG_SchemaC
1b920 68 61 6e 67 65 3b 0a 20 20 20 20 69 66 28 20 70  hange;.    if( p
1b930 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  TblName!=0 ){.  
1b940 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
1b950 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
1b960 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  num;.    }.  }..
1b970 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1b980 74 68 65 20 69 6e 69 74 69 61 6c 20 43 52 45 41  the initial CREA
1b990 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
1b9a0 6e 74 20 28 6f 72 20 43 52 45 41 54 45 20 54 41  nt (or CREATE TA
1b9b0 42 4c 45 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  BLE if the.  ** 
1b9c0 69 6e 64 65 78 20 69 73 20 61 6e 20 69 6d 70 6c  index is an impl
1b9d0 69 65 64 20 69 6e 64 65 78 20 66 6f 72 20 61 20  ied index for a 
1b9e0 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52  UNIQUE or PRIMAR
1b9f0 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
1ba00 29 20 74 68 65 6e 0a 20 20 2a 2a 20 65 6d 69 74  ) then.  ** emit
1ba10 20 63 6f 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74   code to allocat
1ba20 65 20 74 68 65 20 69 6e 64 65 78 20 72 6f 6f 74  e the index root
1ba30 70 61 67 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64  page on disk and
1ba40 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66   make an entry f
1ba50 6f 72 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  or.  ** the inde
1ba60 78 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  x in the sqlite_
1ba70 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
1ba80 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 69 6e   populate the in
1ba90 64 65 78 20 77 69 74 68 0a 20 20 2a 2a 20 63 6f  dex with.  ** co
1baa0 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20  ntent.  But, do 
1bab0 6e 6f 74 20 64 6f 20 74 68 69 73 20 69 66 20 77  not do this if w
1bac0 65 20 61 72 65 20 73 69 6d 70 6c 79 20 72 65 61  e are simply rea
1bad0 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
1bae0 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c  master.  ** tabl
1baf0 65 20 74 6f 20 70 61 72 73 65 20 74 68 65 20 73  e to parse the s
1bb00 63 68 65 6d 61 2c 20 6f 72 20 69 66 20 74 68 69  chema, or if thi
1bb10 73 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 50  s index is the P
1bb20 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
1bb30 0a 20 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f  .  ** of a WITHO
1bb40 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a  UT ROWID table..
1bb50 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62    **.  ** If pTb
1bb60 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  lName==0 it mean
1bb70 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  s this index is 
1bb80 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 6e 20  generated as an 
1bb90 69 6d 70 6c 69 65 64 20 50 52 49 4d 41 52 59 20  implied PRIMARY 
1bba0 4b 45 59 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51  KEY.  ** or UNIQ
1bbb0 55 45 20 69 6e 64 65 78 20 69 6e 20 61 20 43 52  UE index in a CR
1bbc0 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
1bbd0 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65  ment.  Since the
1bbe0 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20   table.  ** has 
1bbf0 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65  just been create
1bc00 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e  d, it contains n
1bc10 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69  o data and the i
1bc20 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  ndex initializat
1bc30 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61  ion.  ** step ca
1bc40 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
1bc50 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 48 61  */.  else if( Ha
1bc60 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20  sRowid(pTab) || 
1bc70 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  pTblName!=0 ){. 
1bc80 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
1bc90 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20  char *zStmt;.   
1bca0 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50   int iMem = ++pP
1bcb0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20  arse->nMem;..   
1bcc0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1bcd0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
1bce0 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
1bcf0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1bd00 65 78 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ex;..    sqlite3
1bd10 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
1bd20 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
1bd30 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  Db);..    /* Cre
1bd40 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65  ate the rootpage
1bd50 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 75   for the index u
1bd60 73 69 6e 67 20 43 72 65 61 74 65 49 6e 64 65 78  sing CreateIndex
1bd70 2e 20 42 75 74 20 62 65 66 6f 72 65 0a 20 20 20  . But before.   
1bd80 20 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f   ** doing so, co
1bd90 64 65 20 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75  de a Noop instru
1bda0 63 74 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20  ction and store 
1bdb0 69 74 73 20 61 64 64 72 65 73 73 20 69 6e 20 0a  its address in .
1bdc0 20 20 20 20 2a 2a 20 49 6e 64 65 78 2e 74 6e 75      ** Index.tnu
1bdd0 6d 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  m. This is requi
1bde0 72 65 64 20 69 6e 20 63 61 73 65 20 74 68 69 73  red in case this
1bdf0 20 69 6e 64 65 78 20 69 73 20 61 63 74 75 61 6c   index is actual
1be00 6c 79 20 61 20 0a 20 20 20 20 2a 2a 20 50 52 49  ly a .    ** PRI
1be10 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 74 68 65  MARY KEY and the
1be20 20 74 61 62 6c 65 20 69 73 20 61 63 74 75 61 6c   table is actual
1be30 6c 79 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  ly a WITHOUT ROW
1be40 49 44 20 74 61 62 6c 65 2e 20 49 6e 20 0a 20 20  ID table. In .  
1be50 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 74    ** that case t
1be60 68 65 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68  he convertToWith
1be70 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 29 20  outRowidTable() 
1be80 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 70  routine will rep
1be90 6c 61 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  lace.    ** the 
1bea0 4e 6f 6f 70 20 77 69 74 68 20 61 20 47 6f 74 6f  Noop with a Goto
1beb0 20 74 6f 20 6a 75 6d 70 20 6f 76 65 72 20 74 68   to jump over th
1bec0 65 20 56 44 42 45 20 63 6f 64 65 20 67 65 6e 65  e VDBE code gene
1bed0 72 61 74 65 64 20 62 65 6c 6f 77 2e 20 2a 2f 0a  rated below. */.
1bee0 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
1bef0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1bf00 64 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29  dOp0(v, OP_Noop)
1bf10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1bf20 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 72  eAddOp3(v, OP_Cr
1bf30 65 61 74 65 42 74 72 65 65 2c 20 69 44 62 2c 20  eateBtree, iDb, 
1bf40 69 4d 65 6d 2c 20 42 54 52 45 45 5f 42 4c 4f 42  iMem, BTREE_BLOB
1bf50 4b 45 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61  KEY);..    /* Ga
1bf60 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  ther the complet
1bf70 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
1bf80 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1bf90 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ment into.    **
1bfa0 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61   the zStmt varia
1bfb0 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ble.    */.    i
1bfc0 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
1bfd0 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29     int n = (int)
1bfe0 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f  (pParse->sLastTo
1bff0 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a  ken.z - pName->z
1c000 29 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  ) + pParse->sLas
1c010 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20  tToken.n;.      
1c020 69 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31  if( pName->z[n-1
1c030 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20  ]==';' ) n--;.  
1c040 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69      /* A named i
1c050 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70  ndex with an exp
1c060 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44  licit CREATE IND
1c070 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EX statement */.
1c080 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
1c090 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1c0a0 20 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58   "CREATE%s INDEX
1c0b0 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20   %.*s",.        
1c0c0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
1c0d0 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45   ? "" : " UNIQUE
1c0e0 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b  ", n, pName->z);
1c0f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c100 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69    /* An automati
1c110 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20  c index created 
1c120 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  by a PRIMARY KEY
1c130 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
1c140 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f  raint */.      /
1c150 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  * zStmt = sqlite
1c160 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f  3MPrintf(""); */
1c170 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30  .      zStmt = 0
1c180 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1c190 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  Add an entry in 
1c1a0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f  sqlite_master fo
1c1b0 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20  r this index.   
1c1c0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
1c1d0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
1c1e0 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53  e, .        "INS
1c1f0 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56  ERT INTO %Q.%s V
1c200 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51  ALUES('index',%Q
1c210 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20  ,%Q,#%d,%Q);",. 
1c220 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
1c230 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41  Db].zDbSName, MA
1c240 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20  STER_NAME,.     
1c250 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
1c260 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
1c270 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 69  zName,.        i
1c280 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53 74  Mem,.        zSt
1c290 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  mt.    );.    sq
1c2a0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1c2b0 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  zStmt);..    /* 
1c2c0 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77  Fill the index w
1c2d0 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70  ith data and rep
1c2e0 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e  arse the schema.
1c2f0 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69   Code an OP_Expi
1c300 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76  re.    ** to inv
1c310 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d  alidate all pre-
1c320 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
1c330 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nts..    */.    
1c340 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a  if( pTblName ){.
1c350 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
1c360 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
1c370 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a   pIndex, iMem);.
1c380 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61        sqlite3Cha
1c390 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
1c3a0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
1c3b0 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
1c3c0 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62  eSchemaOp(v, iDb
1c3d0 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,.         sqlit
1c3e0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e  e3MPrintf(db, "n
1c3f0 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70  ame='%q' AND typ
1c400 65 3d 27 69 6e 64 65 78 27 22 2c 20 70 49 6e 64  e='index'", pInd
1c410 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ex->zName));.   
1c420 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c430 64 4f 70 30 28 76 2c 20 4f 50 5f 45 78 70 69 72  dOp0(v, OP_Expir
1c440 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  e);.    }..    s
1c450 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1c460 72 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 74 6e  re(v, pIndex->tn
1c470 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  um);.  }..  /* W
1c480 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e  hen adding an in
1c490 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20  dex to the list 
1c4a0 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61  of indices for a
1c4b0 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a   table, make.  *
1c4c0 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63  * sure all indic
1c4d0 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65  es labeled OE_Re
1c4e0 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72  place come after
1c4f0 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c   all those label
1c500 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72  ed.  ** OE_Ignor
1c510 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  e.  This is nece
1c520 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f  ssary for the co
1c530 72 72 65 63 74 20 63 6f 6e 73 74 72 61 69 6e 74  rrect constraint
1c540 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63   check.  ** proc
1c550 65 73 73 69 6e 67 20 28 69 6e 20 73 71 6c 69 74  essing (in sqlit
1c560 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72  e3GenerateConstr
1c570 61 69 6e 74 43 68 65 63 6b 73 28 29 29 20 61 73  aintChecks()) as
1c580 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50   part of.  ** UP
1c590 44 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20  DATE and INSERT 
1c5a0 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20  statements.  .  
1c5b0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
1c5c0 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61  t.busy || pTblNa
1c5d0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  me==0 ){.    if(
1c5e0 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70   onError!=OE_Rep
1c5f0 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49  lace || pTab->pI
1c600 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20  ndex==0.        
1c610 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
1c620 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ->onError==OE_Re
1c630 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49  place){.      pI
1c640 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54  ndex->pNext = pT
1c650 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
1c660 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d    pTab->pIndex =
1c670 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c   pIndex;.    }el
1c680 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
1c690 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e  *pOther = pTab->
1c6a0 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
1c6b0 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65  ile( pOther->pNe
1c6c0 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e  xt && pOther->pN
1c6d0 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  ext->onError!=OE
1c6e0 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20  _Replace ){.    
1c6f0 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74      pOther = pOt
1c700 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
1c710 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78    }.      pIndex
1c720 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72  ->pNext = pOther
1c730 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70  ->pNext;.      p
1c740 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Other->pNext = p
1c750 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  Index;.    }.   
1c760 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d   pIndex = 0;.  }
1c770 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20  ..  /* Clean up 
1c780 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
1c790 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  /.exit_create_in
1c7a0 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65  dex:.  if( pInde
1c7b0 78 20 29 20 66 72 65 65 49 6e 64 65 78 28 64 62  x ) freeIndex(db
1c7c0 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c  , pIndex);.  sql
1c7d0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1c7e0 62 2c 20 70 50 49 57 68 65 72 65 29 3b 0a 20 20  b, pPIWhere);.  
1c7f0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
1c800 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
1c810 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  ;.  sqlite3SrcLi
1c820 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62  stDelete(db, pTb
1c830 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
1c840 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
1c850 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c  e);.}../*.** Fil
1c860 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f  l the Index.aiRo
1c870 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74  wEst[] array wit
1c880 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d  h default inform
1c890 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74  ation - informat
1c8a0 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65  ion.** to be use
1c8b0 64 20 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e  d when we have n
1c8c0 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59  ot run the ANALY
1c8d0 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  ZE command..**.*
1c8e0 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73  * aiRowEst[0] is
1c8f0 20 73 75 70 70 6f 73 65 64 20 74 6f 20 63 6f 6e   supposed to con
1c900 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  tain the number 
1c910 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  of elements in t
1c920 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e  he index..** Sin
1c930 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f  ce we do not kno
1c940 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69  w, guess 1 milli
1c950 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d  on.  aiRowEst[1]
1c960 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
1c970 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  of the.** number
1c980 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1c990 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68  table that match
1c9a0 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
1c9b0 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20  value of the.** 
1c9c0 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  first column of 
1c9d0 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f  the index.  aiRo
1c9e0 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73  wEst[2] is an es
1c9f0 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
1ca00 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20  mber.** of rows 
1ca10 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70  that match any p
1ca20 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e  articular combin
1ca30 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72  ation of the fir
1ca40 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  st 2 columns.** 
1ca50 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41  of the index.  A
1ca60 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74  nd so forth.  It
1ca70 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20   must always be 
1ca80 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a  the case that.*.
1ca90 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52  **           aiR
1caa0 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45  owEst[N]<=aiRowE
1cab0 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20  st[N-1].**      
1cac0 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d       aiRowEst[N]
1cad0 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20  >=1.**.** Apart 
1cae0 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61  from that, we ha
1caf0 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20  ve little to go 
1cb00 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75 69  on besides intui
1cb10 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f  tion as to.** ho
1cb20 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f  w aiRowEst[] sho
1cb30 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  uld be initializ
1cb40 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73  ed.  The numbers
1cb50 20 67 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a   generated here.
1cb60 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20  ** are based on 
1cb70 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66  typical values f
1cb80 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69  ound in actual i
1cb90 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ndices..*/.void 
1cba0 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f  sqlite3DefaultRo
1cbb0 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78  wEst(Index *pIdx
1cbc0 29 7b 0a 20 20 2f 2a 20 20 20 20 20 20 20 20 20  ){.  /*         
1cbd0 20 20 20 20 20 20 20 31 30 2c 20 20 39 2c 20 20         10,  9,  
1cbe0 38 2c 20 20 37 2c 20 20 36 20 2a 2f 0a 20 20 4c  8,  7,  6 */.  L
1cbf0 6f 67 45 73 74 20 61 56 61 6c 5b 5d 20 3d 20 7b  ogEst aVal[] = {
1cc00 20 33 33 2c 20 33 32 2c 20 33 30 2c 20 32 38 2c   33, 32, 30, 28,
1cc10 20 32 36 20 7d 3b 0a 20 20 4c 6f 67 45 73 74 20   26 };.  LogEst 
1cc20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77  *a = pIdx->aiRow
1cc30 4c 6f 67 45 73 74 3b 0a 20 20 69 6e 74 20 6e 43  LogEst;.  int nC
1cc40 6f 70 79 20 3d 20 4d 49 4e 28 41 72 72 61 79 53  opy = MIN(ArrayS
1cc50 69 7a 65 28 61 56 61 6c 29 2c 20 70 49 64 78 2d  ize(aVal), pIdx-
1cc60 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 69 6e 74  >nKeyCol);.  int
1cc70 20 69 3b 0a 0a 20 20 2f 2a 20 49 6e 64 65 78 65   i;..  /* Indexe
1cc80 73 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 72  s with default r
1cc90 6f 77 20 65 73 74 69 6d 61 74 65 73 20 73 68 6f  ow estimates sho
1cca0 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 73 74 61  uld not have sta
1ccb0 74 31 20 64 61 74 61 20 2a 2f 0a 20 20 61 73 73  t1 data */.  ass
1ccc0 65 72 74 28 20 21 70 49 64 78 2d 3e 68 61 73 53  ert( !pIdx->hasS
1ccd0 74 61 74 31 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  tat1 );..  /* Se
1cce0 74 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  t the first entr
1ccf0 79 20 28 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  y (number of row
1cd00 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 29 20  s in the index) 
1cd10 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  to the estimated
1cd20 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66   .  ** number of
1cd30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
1cd40 6c 65 2c 20 6f 72 20 68 61 6c 66 20 74 68 65 20  le, or half the 
1cd50 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1cd60 6e 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a  n the table.  **
1cd70 20 66 6f 72 20 61 20 70 61 72 74 69 61 6c 20 69   for a partial i
1cd80 6e 64 65 78 2e 20 20 20 42 75 74 20 64 6f 20 6e  ndex.   But do n
1cd90 6f 74 20 6c 65 74 20 74 68 65 20 65 73 74 69 6d  ot let the estim
1cda0 61 74 65 20 64 72 6f 70 20 62 65 6c 6f 77 20 31  ate drop below 1
1cdb0 30 2e 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20 70  0. */.  a[0] = p
1cdc0 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f  Idx->pTable->nRo
1cdd0 77 4c 6f 67 45 73 74 3b 0a 20 20 69 66 28 20 70  wLogEst;.  if( p
1cde0 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
1cdf0 72 65 21 3d 30 20 29 20 61 5b 30 5d 20 2d 3d 20  re!=0 ) a[0] -= 
1ce00 31 30 3b 20 20 61 73 73 65 72 74 28 20 31 30 3d  10;  assert( 10=
1ce10 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
1ce20 29 20 29 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3c  ) );.  if( a[0]<
1ce30 33 33 20 29 20 61 5b 30 5d 20 3d 20 33 33 3b 20  33 ) a[0] = 33; 
1ce40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce50 20 61 73 73 65 72 74 28 20 33 33 3d 3d 73 71 6c   assert( 33==sql
1ce60 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 29  ite3LogEst(10) )
1ce70 3b 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65  ;..  /* Estimate
1ce80 20 74 68 61 74 20 61 5b 31 5d 20 69 73 20 31 30   that a[1] is 10
1ce90 2c 20 61 5b 32 5d 20 69 73 20 39 2c 20 61 5b 33  , a[2] is 9, a[3
1cea0 5d 20 69 73 20 38 2c 20 61 5b 34 5d 20 69 73 20  ] is 8, a[4] is 
1ceb0 37 2c 20 61 5b 35 5d 20 69 73 0a 20 20 2a 2a 20  7, a[5] is.  ** 
1cec0 36 20 61 6e 64 20 65 61 63 68 20 73 75 62 73 65  6 and each subse
1ced0 71 75 65 6e 74 20 76 61 6c 75 65 20 28 69 66 20  quent value (if 
1cee0 61 6e 79 29 20 69 73 20 35 2e 20 20 2a 2f 0a 20  any) is 5.  */. 
1cef0 20 6d 65 6d 63 70 79 28 26 61 5b 31 5d 2c 20 61   memcpy(&a[1], a
1cf00 56 61 6c 2c 20 6e 43 6f 70 79 2a 73 69 7a 65 6f  Val, nCopy*sizeo
1cf10 66 28 4c 6f 67 45 73 74 29 29 3b 0a 20 20 66 6f  f(LogEst));.  fo
1cf20 72 28 69 3d 6e 43 6f 70 79 2b 31 3b 20 69 3c 3d  r(i=nCopy+1; i<=
1cf30 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  pIdx->nKeyCol; i
1cf40 2b 2b 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20  ++){.    a[i] = 
1cf50 32 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  23;             
1cf60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32         assert( 2
1cf70 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
1cf80 28 35 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  (5) );.  }..  as
1cf90 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
1cfa0 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20 69  LogEst(1) );.  i
1cfb0 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  f( IsUniqueIndex
1cfc0 28 70 49 64 78 29 20 29 20 61 5b 70 49 64 78 2d  (pIdx) ) a[pIdx-
1cfd0 3e 6e 4b 65 79 43 6f 6c 5d 20 3d 20 30 3b 0a 7d  >nKeyCol] = 0;.}
1cfe0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1cff0 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61  tine will drop a
1d000 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64  n existing named
1d010 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f   index.  This ro
1d020 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  utine.** impleme
1d030 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44  nts the DROP IND
1d040 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  EX statement..*/
1d050 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
1d060 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  pIndex(Parse *pP
1d070 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
1d080 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73  Name, int ifExis
1d090 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ts){.  Index *pI
1d0a0 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ndex;.  Vdbe *v;
1d0b0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1d0c0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1d0d0 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73 65 72  nt iDb;..  asser
1d0e0 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
1d0f0 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76 65 72  =0 );   /* Never
1d100 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72 69   called with pri
1d110 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  or errors */.  i
1d120 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1d130 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
1d140 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1d150 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1d160 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
1d170 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1d180 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
1d190 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
1d1a0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1d1b0 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70  p_index;.  }.  p
1d1c0 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46  Index = sqlite3F
1d1d0 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61  indIndex(db, pNa
1d1e0 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
1d1f0 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
1d200 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49  abase);.  if( pI
1d210 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ndex==0 ){.    i
1d220 66 28 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a  f( !ifExists ){.
1d230 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1d240 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1d250 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53  o such index: %S
1d260 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ", pName, 0);.  
1d270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1d280 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1d290 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72  NamedSchema(pPar
1d2a0 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  se, pName->a[0].
1d2b0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
1d2c0 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
1d2d0 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
1d2e0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1d2f0 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  p_index;.  }.  i
1d300 66 28 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79  f( pIndex->idxTy
1d310 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe!=SQLITE_IDXTY
1d320 50 45 5f 41 50 50 44 45 46 20 29 7b 0a 20 20 20  PE_APPDEF ){.   
1d330 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1d340 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
1d350 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1d360 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22  UNIQUE ".      "
1d370 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
1d380 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74  onstraint cannot
1d390 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29   be dropped", 0)
1d3a0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
1d3b0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
1d3c0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
1d3d0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
1d3e0 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
1d3f0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1d400 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
1d410 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
1d420 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
1d430 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54  ROP_INDEX;.    T
1d440 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
1d450 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  dex->pTable;.   
1d460 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1d470 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
1d480 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  zDbSName;.    co
1d490 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
1d4a0 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
1d4b0 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  b);.    if( sqli
1d4c0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1d4d0 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
1d4e0 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
1d4f0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
1d500 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1d510 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
1d520 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
1d530 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49  Db ) code = SQLI
1d540 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
1d550 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
1d560 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1d570 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65  rse, code, pInde
1d580 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  x->zName, pTab->
1d590 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
1d5a0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
1d5b0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
1d5c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1d5d0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1d5e0 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  to remove the in
1d5f0 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65  dex and from the
1d600 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f   master table */
1d610 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1d620 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1d630 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
1d640 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1d650 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
1d660 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   1, iDb);.    sq
1d670 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
1d680 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
1d690 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
1d6a0 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  %s WHERE name=%Q
1d6b0 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78   AND type='index
1d6c0 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61  '",.       db->a
1d6d0 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
1d6e0 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70  , MASTER_NAME, p
1d6f0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20  Index->zName.   
1d700 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   );.    sqlite3C
1d710 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
1d720 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78  Parse, iDb, "idx
1d730 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ", pIndex->zName
1d740 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
1d750 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
1d760 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73  e, iDb);.    des
1d770 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
1d780 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  rse, pIndex->tnu
1d790 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  m, iDb);.    sql
1d7a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1d7b0 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20  , OP_DropIndex, 
1d7c0 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65  iDb, 0, 0, pInde
1d7d0 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  x->zName, 0);.  
1d7e0 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  }..exit_drop_ind
1d7f0 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  ex:.  sqlite3Src
1d800 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1d810 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
1d820 70 41 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e  pArray is a poin
1d830 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20  ter to an array 
1d840 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68  of objects. Each
1d850 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a   object in the.*
1d860 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74  * array is szEnt
1d870 72 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ry bytes in size
1d880 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  . This routine u
1d890 73 65 73 20 73 71 6c 69 74 65 33 44 62 52 65 61  ses sqlite3DbRea
1d8a0 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74  lloc().** to ext
1d8b0 65 6e 64 20 74 68 65 20 61 72 72 61 79 20 73 6f  end the array so
1d8c0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73   that there is s
1d8d0 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f  pace for a new o
1d8e0 62 6a 65 63 74 20 61 74 20 74 68 65 20 65 6e 64  bject at the end
1d8f0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1d900 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1d910 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63  lled, *pnEntry c
1d920 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 75 72 72  ontains the curr
1d930 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74  ent size of.** t
1d940 68 65 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74  he array (in ent
1d950 72 69 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c  ries - so the al
1d960 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70  location is ((*p
1d970 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72  nEntry) * szEntr
1d980 79 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74  y) bytes.** in t
1d990 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  otal)..**.** If 
1d9a0 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73  the realloc() is
1d9b0 20 73 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65   successful (i.e
1d9c0 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64  . if no OOM cond
1d9d0 69 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74  ition occurs), t
1d9e0 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f  he.** space allo
1d9f0 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65  cated for the ne
1da00 77 20 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f  w object is zero
1da10 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64  ed, *pnEntry upd
1da20 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65  ated to.** refle
1da30 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20  ct the new size 
1da40 6f 66 20 74 68 65 20 61 72 72 61 79 20 61 6e 64  of the array and
1da50 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1da60 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
1da70 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70  .** returned. *p
1da80 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  Idx is set to th
1da90 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
1daa0 65 77 20 61 72 72 61 79 20 65 6e 74 72 79 20 69  ew array entry i
1dab0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
1dac0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
1dad0 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66   the realloc() f
1dae0 61 69 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73  ails, *pIdx is s
1daf0 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74  et to -1, *pnEnt
1db00 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e  ry remains.** un
1db10 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f  changed and a co
1db20 70 79 20 6f 66 20 70 41 72 72 61 79 20 72 65 74  py of pArray ret
1db30 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  urned..*/.void *
1db40 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
1db50 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20  cate(.  sqlite3 
1db60 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  *db,      /* Con
1db70 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
1db80 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  y of malloc fail
1db90 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ures */.  void *
1dba0 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41  pArray,     /* A
1dbb0 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e  rray of objects.
1dbc0 20 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c    Might be reall
1dbd0 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ocated */.  int 
1dbe0 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a  szEntry,      /*
1dbf0 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62   Size of each ob
1dc00 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72 72 61  ject in the arra
1dc10 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e  y */.  int *pnEn
1dc20 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  try,     /* Numb
1dc30 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75  er of objects cu
1dc40 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a  rrently in use *
1dc50 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20  /.  int *pIdx   
1dc60 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1dc70 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65  he index of a ne
1dc80 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29  w slot here */.)
1dc90 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  {.  char *z;.  i
1dca0 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b  nt n = *pnEntry;
1dcb0 0a 20 20 69 66 28 20 28 6e 20 26 20 28 6e 2d 31  .  if( (n & (n-1
1dcc0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))==0 ){.    int
1dcd0 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31   sz = (n==0) ? 1
1dce0 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64   : 2*n;.    void
1dcf0 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
1dd00 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41  DbRealloc(db, pA
1dd10 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79  rray, sz*szEntry
1dd20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
1dd30 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64  =0 ){.      *pId
1dd40 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  x = -1;.      re
1dd50 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20  turn pArray;.   
1dd60 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20   }.    pArray = 
1dd70 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  pNew;.  }.  z = 
1dd80 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20  (char*)pArray;. 
1dd90 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73   memset(&z[n * s
1dda0 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e  zEntry], 0, szEn
1ddb0 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  try);.  *pIdx = 
1ddc0 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b  n;.  ++*pnEntry;
1ddd0 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79  .  return pArray
1dde0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1ddf0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
1de00 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c  to the given IdL
1de10 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
1de20 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20  ew IdList if.** 
1de30 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41  need be..**.** A
1de40 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72   new IdList is r
1de50 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
1de60 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
1de70 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  ls..*/.IdList *s
1de80 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
1de90 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nd(sqlite3 *db, 
1dea0 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  IdList *pList, T
1deb0 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
1dec0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1ded0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
1dee0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
1def0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
1df00 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a  zeof(IdList) );.
1df10 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
1df20 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
1df30 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71  .  pList->a = sq
1df40 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
1df50 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20  te(.      db,.  
1df60 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20      pList->a,.  
1df70 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74      sizeof(pList
1df80 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26  ->a[0]),.      &
1df90 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20  pList->nId,.    
1dfa0 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20    &i.  );.  if( 
1dfb0 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  i<0 ){.    sqlit
1dfc0 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
1dfd0 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  b, pList);.    r
1dfe0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1dff0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1e000 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1e010 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
1e020 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  en);.  return pL
1e030 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ist;.}../*.** De
1e040 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a  lete an IdList..
1e050 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49  */.void sqlite3I
1e060 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  dListDelete(sqli
1e070 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
1e080 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1e090 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1e0a0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1e0b0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1e0c0 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
1e0d0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1e0e0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1e0f0 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
1e100 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
1e110 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
1e120 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69  DbFreeNN(db, pLi
1e130 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
1e140 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
1e150 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69  n pList of the i
1e160 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20  dentifier named 
1e170 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  zId.  Return -1.
1e180 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ** if not found.
1e190 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
1e1a0 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73  dListIndex(IdLis
1e1b0 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20  t *pList, const 
1e1c0 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
1e1d0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1e1e0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d  st==0 ) return -
1e1f0 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
1e200 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
1e210 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1e220 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
1e230 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  a[i].zName, zNam
1e240 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  e)==0 ) return i
1e250 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
1e260 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61  1;.}../*.** Expa
1e270 6e 64 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c  nd the space all
1e280 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 67  ocated for the g
1e290 69 76 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a  iven SrcList obj
1e2a0 65 63 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69  ect by.** creati
1e2b0 6e 67 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c  ng nExtra new sl
1e2c0 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ots beginning at
1e2d0 20 69 53 74 61 72 74 2e 20 20 69 53 74 61 72 74   iStart.  iStart
1e2e0 20 69 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a   is zero based..
1e2f0 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65  ** New slots are
1e300 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46   zeroed..**.** F
1e310 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70  or example, supp
1e320 6f 73 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e  ose a SrcList in
1e330 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73  itially contains
1e340 20 74 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c   two entries: A,
1e350 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20  B..** To append 
1e360 33 20 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e  3 new entries on
1e370 74 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74  to the end, do t
1e380 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71  his:.**.**    sq
1e390 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
1e3a0 72 67 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74  rge(db, pSrclist
1e3b0 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41  , 3, 2);.**.** A
1e3c0 66 74 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62  fter the call ab
1e3d0 6f 76 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e  ove it would con
1e3e0 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c  tain:  A, B, nil
1e3f0 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49  , nil, nil..** I
1e400 66 20 74 68 65 20 69 53 74 61 72 74 20 61 72 67  f the iStart arg
1e410 75 6d 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31  ument had been 1
1e420 20 69 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74   instead of 2, t
1e430 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  hen the result.*
1e440 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  * would have bee
1e450 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  n:  A, nil, nil,
1e460 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65   nil, B.  To pre
1e470 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f  pend the new slo
1e480 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72  ts,.** the iStar
1e490 74 20 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65  t value would be
1e4a0 20 30 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20   0.  The result 
1e4b0 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65  then would.** be
1e4c0 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  : nil, nil, nil,
1e4d0 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   A, B..**.** If 
1e4e0 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
1e4f0 69 6f 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72  ion fails the Sr
1e500 63 4c 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67  cList is unchang
1e510 65 64 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e  ed.  The.** db->
1e520 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
1e530 67 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  g will be set to
1e540 20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73   true..*/.SrcLis
1e550 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
1e560 74 45 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69  tEnlarge(.  sqli
1e570 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f  te3 *db,       /
1e580 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
1e590 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
1e5a0 6f 66 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f  of OOM errors */
1e5b0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1e5c0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63  ,     /* The Src
1e5d0 4c 69 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72  List to be enlar
1e5e0 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ged */.  int nEx
1e5f0 74 72 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  tra,        /* N
1e600 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f  umber of new slo
1e610 74 73 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72  ts to add to pSr
1e620 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  c->a[] */.  int 
1e630 69 53 74 61 72 74 20 20 20 20 20 20 20 20 20 2f  iStart         /
1e640 2a 20 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d  * Index in pSrc-
1e650 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65  >a[] of first ne
1e660 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69  w slot */.){.  i
1e670 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69  nt i;..  /* Sani
1e680 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63  ty checking on c
1e690 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72  alling parameter
1e6a0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
1e6b0 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73  Start>=0 );.  as
1e6c0 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20  sert( nExtra>=1 
1e6d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
1e6e0 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  c!=0 );.  assert
1e6f0 28 20 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e  ( iStart<=pSrc->
1e700 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  nSrc );..  /* Al
1e710 6c 6f 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61  locate additiona
1e720 6c 20 73 70 61 63 65 20 69 66 20 6e 65 65 64 65  l space if neede
1e730 64 20 2a 2f 0a 20 20 69 66 28 20 28 75 33 32 29  d */.  if( (u32)
1e740 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72  pSrc->nSrc+nExtr
1e750 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29  a>pSrc->nAlloc )
1e760 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  {.    SrcList *p
1e770 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c  New;.    int nAl
1e780 6c 6f 63 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63  loc = pSrc->nSrc
1e790 2a 32 2b 6e 45 78 74 72 61 3b 0a 20 20 20 20 69  *2+nExtra;.    i
1e7a0 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20 70 4e 65  nt nGot;.    pNe
1e7b0 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
1e7c0 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a 20  lloc(db, pSrc,. 
1e7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
1e7e0 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20 28 6e  zeof(*pSrc) + (n
1e7f0 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28  Alloc-1)*sizeof(
1e800 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  pSrc->a[0]) );. 
1e810 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1e820 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1e830 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1e840 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1e850 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20   pSrc;.    }.   
1e860 20 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20   pSrc = pNew;.  
1e870 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c 69 74 65    nGot = (sqlite
1e880 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62  3DbMallocSize(db
1e890 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a 65 6f 66  , pNew) - sizeof
1e8a0 28 2a 70 53 72 63 29 29 2f 73 69 7a 65 6f 66 28  (*pSrc))/sizeof(
1e8b0 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20  pSrc->a[0])+1;. 
1e8c0 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20     pSrc->nAlloc 
1e8d0 3d 20 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f  = nGot;.  }..  /
1e8e0 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67 20  * Move existing 
1e8f0 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65 20  slots that come 
1e900 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79 20  after the newly 
1e910 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a 20  inserted slots. 
1e920 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 77   ** out of the w
1e930 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53  ay */.  for(i=pS
1e940 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69  rc->nSrc-1; i>=i
1e950 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20  Start; i--){.   
1e960 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72   pSrc->a[i+nExtr
1e970 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b  a] = pSrc->a[i];
1e980 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72  .  }.  pSrc->nSr
1e990 63 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a 20 20  c += nExtra;..  
1e9a0 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c  /* Zero the newl
1e9b0 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74  y allocated slot
1e9c0 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70  s */.  memset(&p
1e9d0 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20  Src->a[iStart], 
1e9e0 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  0, sizeof(pSrc->
1e9f0 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20  a[0])*nExtra);. 
1ea00 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69   for(i=iStart; i
1ea10 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20  <iStart+nExtra; 
1ea20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e  i++){.    pSrc->
1ea30 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d  a[i].iCursor = -
1ea40 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74  1;.  }..  /* Ret
1ea50 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1ea60 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72   the enlarged Sr
1ea70 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72  cList */.  retur
1ea80 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n pSrc;.}.../*.*
1ea90 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74  * Append a new t
1eaa0 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65  able name to the
1eab0 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20   given SrcList. 
1eac0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72   Create a new Sr
1ead0 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  cList if.** need
1eae0 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72   be.  A new entr
1eaf0 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  y is created in 
1eb00 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e  the SrcList even
1eb10 20 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55   if pTable is NU
1eb20 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c  LL..**.** A SrcL
1eb30 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
1eb40 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72   or NULL if ther
1eb50 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  e is an OOM erro
1eb60 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64  r.  The returned
1eb70 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68  .** SrcList migh
1eb80 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
1eb90 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
1eba0 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69  t was input or i
1ebb0 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20  t might be.** a 
1ebc0 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20  new one.  If an 
1ebd0 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f  OOM error does o
1ebe0 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
1ebf0 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70  prior value of p
1ec00 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20  List.** that is 
1ec10 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f  input to this ro
1ec20 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74  utine is automat
1ec30 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a  ically freed..**
1ec40 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65  .** If pDatabase
1ec50 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74   is not null, it
1ec60 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1ec70 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74  table has an opt
1ec80 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ional.** databas
1ec90 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20  e name prefix.  
1eca0 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74  Like this:  "dat
1ecb0 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54  abase.table".  T
1ecc0 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  he pDatabase.** 
1ecd0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61  points to the ta
1ece0 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
1ecf0 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74   pTable points t
1ed00 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  o the database n
1ed10 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c  ame..** The SrcL
1ed20 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69  ist.a[].zName fi
1ed30 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69  eld is filled wi
1ed40 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  th the table nam
1ed50 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a  e which might.**
1ed60 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   come from pTabl
1ed70 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20  e (if pDatabase 
1ed80 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d  is NULL) or from
1ed90 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a   pDatabase.  .**
1eda0 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61   SrcList.a[].zDa
1edb0 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64  tabase is filled
1edc0 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
1edd0 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61  se name from pTa
1ede0 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20  ble,.** or with 
1edf0 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62  NULL if no datab
1ee00 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ase is specified
1ee10 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ..**.** In other
1ee20 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20   words, if call 
1ee30 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1ee40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ee50 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
1ee60 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,0);.**.** Th
1ee70 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20  en B is a table 
1ee80 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
1ee90 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e  abase name is un
1eea0 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63  specified.  If c
1eeb0 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68  alled.** like th
1eec0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
1eed0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1eee0 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b  Append(D,A,B,C);
1eef0 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73  .**.** Then C is
1ef00 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
1ef10 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74  and B is the dat
1ef20 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20  abase name.  If 
1ef30 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20  C is defined.** 
1ef40 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49  then so is B.  I
1ef50 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  n other words, w
1ef60 65 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 63  e never have a c
1ef70 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a  ase where:.**.**
1ef80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ef90 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
1efa0 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f  A,0,C);.**.** Bo
1efb0 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  th pTable and pD
1efc0 61 74 61 62 61 73 65 20 61 72 65 20 61 73 73 75  atabase are assu
1efd0 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64  med to be quoted
1efe0 2e 20 20 54 68 65 79 20 61 72 65 20 64 65 71 75  .  They are dequ
1eff0 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62  oted.** before b
1f000 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68  eing added to th
1f010 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72  e SrcList..*/.Sr
1f020 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
1f030 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73  cListAppend(.  s
1f040 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1f050 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1f060 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61   to notify of ma
1f070 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f  lloc failures */
1f080 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  .  SrcList *pLis
1f090 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  t,     /* Append
1f0a0 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74   to this SrcList
1f0b0 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61  . NULL creates a
1f0c0 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a   new SrcList */.
1f0d0 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
1f0e0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
1f0f0 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f  o append */.  To
1f100 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20  ken *pDatabase  
1f110 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66    /* Database of
1f120 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b   the table */.){
1f130 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1f140 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1f150 20 61 73 73 65 72 74 28 20 70 44 61 74 61 62 61   assert( pDataba
1f160 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21  se==0 || pTable!
1f170 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74  =0 );  /* Cannot
1f180 20 68 61 76 65 20 43 20 77 69 74 68 6f 75 74 20   have C without 
1f190 42 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64  B */.  assert( d
1f1a0 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  b!=0 );.  if( pL
1f1b0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
1f1c0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
1f1d0 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
1f1e0 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
1f1f0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
1f200 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1f210 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
1f220 20 3d 20 31 3b 0a 20 20 20 20 70 4c 69 73 74 2d   = 1;.    pList-
1f230 3e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 6d  >nSrc = 1;.    m
1f240 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b  emset(&pList->a[
1f250 30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c  0], 0, sizeof(pL
1f260 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
1f270 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75   pList->a[0].iCu
1f280 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c  rsor = -1;.  }el
1f290 73 65 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  se{.    pList = 
1f2a0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
1f2b0 6c 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c  large(db, pList,
1f2c0 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29   1, pList->nSrc)
1f2d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
1f2e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1f2f0 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
1f300 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
1f310 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  st);.    return 
1f320 30 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  0;.  }.  pItem =
1f330 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
1f340 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28  ->nSrc-1];.  if(
1f350 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44   pDatabase && pD
1f360 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b  atabase->z==0 ){
1f370 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
1f380 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44   0;.  }.  if( pD
1f390 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 70  atabase ){.    p
1f3a0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
1f3b0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1f3c0 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73 65  en(db, pDatabase
1f3d0 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44  );.    pItem->zD
1f3e0 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
1f3f0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1f400 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65  b, pTable);.  }e
1f410 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  lse{.    pItem->
1f420 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
1f430 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
1f440 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 49   pTable);.    pI
1f450 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
1f460 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1f470 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
1f480 20 41 73 73 69 67 6e 20 56 64 62 65 43 75 72 73   Assign VdbeCurs
1f490 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 73  or index numbers
1f4a0 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   to all tables i
1f4b0 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76  n a SrcList.*/.v
1f4c0 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
1f4d0 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
1f4e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1f4f0 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
1f500 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1f510 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1f520 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  pItem;.  assert(
1f530 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d  pList || pParse-
1f540 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1f550 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  d );.  if( pList
1f560 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c   ){.    for(i=0,
1f570 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
1f580 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20   i<pList->nSrc; 
1f590 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
1f5a0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1f5b0 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65  iCursor>=0 ) bre
1f5c0 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ak;.      pItem-
1f5d0 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  >iCursor = pPars
1f5e0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
1f5f0 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
1f600 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
1f610 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
1f620 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
1f630 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
1f640 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20  t->pSrc);.      
1f650 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
1f660 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
1f670 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e  ntire SrcList in
1f680 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20  cluding all its 
1f690 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  substructure..*/
1f6a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
1f6b0 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
1f6c0 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20  e3 *db, SrcList 
1f6d0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1f6e0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1f6f0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1f700 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1f710 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70   return;.  for(p
1f720 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
1f730 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
1f740 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
1f750 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
1f760 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
1f770 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73  Database);.    s
1f780 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1f790 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
1f7a0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1f7b0 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  e(db, pItem->zAl
1f7c0 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ias);.    if( pI
1f7d0 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
1f7e0 64 42 79 20 29 20 73 71 6c 69 74 65 33 44 62 46  dBy ) sqlite3DbF
1f7f0 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75  ree(db, pItem->u
1f800 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20  1.zIndexedBy);. 
1f810 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
1f820 2e 69 73 54 61 62 46 75 6e 63 20 29 20 73 71 6c  .isTabFunc ) sql
1f830 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
1f840 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31  te(db, pItem->u1
1f850 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20 20 20 20  .pFuncArg);.    
1f860 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
1f870 6c 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54  le(db, pItem->pT
1f880 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ab);.    sqlite3
1f890 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1f8a0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29   pItem->pSelect)
1f8b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1f8c0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  rDelete(db, pIte
1f8d0 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c  m->pOn);.    sql
1f8e0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
1f8f0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69  (db, pItem->pUsi
1f900 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ng);.  }.  sqlit
1f910 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
1f920 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
1f930 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1f940 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
1f950 72 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65  rser to add a ne
1f960 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a  w term to the.**
1f970 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e   end of a growin
1f980 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  g FROM clause.  
1f990 54 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  The "p" paramete
1f9a0 72 20 69 73 20 74 68 65 20 70 61 72 74 20 6f 66  r is the part of
1f9b0 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
1f9c0 75 73 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  use that has alr
1f9d0 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72  eady been constr
1f9e0 75 63 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e  ucted.  "p" is N
1f9f0 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69  ULL.** if this i
1fa00 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
1fa10 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1fa20 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64  use.  pTable and
1fa30 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72   pDatabase.** ar
1fa40 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
1fa50 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61  e table and data
1fa60 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  base named in th
1fa70 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
1fa80 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  rm..** pDatabase
1fa90 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
1faa0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75  database name qu
1fab0 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73 69  alifier is missi
1fac0 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61  ng - the.** usua
1fad0 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68 65 20  l case.  If the 
1fae0 74 65 72 6d 20 68 61 73 20 61 6e 20 61 6c 69 61  term has an alia
1faf0 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20 70  s, then pAlias p
1fb00 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
1fb10 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66  alias token.  If
1fb20 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20 73   the term is a s
1fb30 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70 53  ubquery, then pS
1fb40 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a 2a  ubquery is the.*
1fb50 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
1fb60 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62 71  nt that the subq
1fb70 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20 54  uery encodes.  T
1fb80 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a  he pTable and.**
1fb90 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61 6d   pDatabase param
1fba0 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20 66  eters are NULL f
1fbb0 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20 20  or subqueries.  
1fbc0 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73 69  The pOn and pUsi
1fbd0 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  ng.** parameters
1fbe0 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74   are the content
1fbf0 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20 55   of the ON and U
1fc00 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SING clauses..**
1fc10 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65 77  .** Return a new
1fc20 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20 65   SrcList which e
1fc30 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46 52  ncodes is the FR
1fc40 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a  OM with the new.
1fc50 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a  ** term added..*
1fc60 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
1fc70 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
1fc80 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73 65  romTerm(.  Parse
1fc90 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1fca0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1fcb0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
1fcc0 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  st *p,          
1fcd0 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 70     /* The left p
1fce0 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  art of the FROM 
1fcf0 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 73  clause already s
1fd00 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  een */.  Token *
1fd10 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  pTable,         
1fd20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1fd30 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f 20  table to add to 
1fd40 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1fd50 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
1fd60 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  abase,       /* 
1fd70 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
1fd80 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
1fd90 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65  pTable */.  Toke
1fda0 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20 20  n *pAlias,      
1fdb0 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
1fdc0 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
1fdd0 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73 69  e AS subexpressi
1fde0 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
1fdf0 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20 20  pSubquery,      
1fe00 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75 73  /* A subquery us
1fe10 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
1fe20 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   table name */. 
1fe30 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20   Expr *pOn,     
1fe40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1fe50 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a  ON clause of a j
1fe60 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  oin */.  IdList 
1fe70 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20 20  *pUsing         
1fe80 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c   /* The USING cl
1fe90 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a  ause of a join *
1fea0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
1feb0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1fec0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
1fed0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1fee0 20 69 66 28 20 21 70 20 26 26 20 28 70 4f 6e 20   if( !p && (pOn 
1fef0 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a 20 20  || pUsing) ){.  
1ff00 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1ff10 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a 4f 49  g(pParse, "a JOI
1ff20 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75  N clause is requ
1ff30 69 72 65 64 20 62 65 66 6f 72 65 20 25 73 22 2c  ired before %s",
1ff40 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f 20 22   .      (pOn ? "
1ff50 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29 0a 20  ON" : "USING"). 
1ff60 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61     );.    goto a
1ff70 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
1ff80 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
1ff90 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1ffa0 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20  (db, p, pTable, 
1ffb0 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  pDatabase);.  if
1ffc0 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  ( p==0 ){.    go
1ffd0 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  to append_from_e
1ffe0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rror;.  }.  asse
1fff0 72 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20 29 3b  rt( p->nSrc>0 );
20000 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61  .  pItem = &p->a
20010 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61  [p->nSrc-1];.  a
20020 73 73 65 72 74 28 20 70 41 6c 69 61 73 21 3d 30  ssert( pAlias!=0
20030 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73   );.  if( pAlias
20040 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d  ->n ){.    pItem
20050 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
20060 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
20070 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d  db, pAlias);.  }
20080 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  .  pItem->pSelec
20090 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20  t = pSubquery;. 
200a0 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f   pItem->pOn = pO
200b0 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69  n;.  pItem->pUsi
200c0 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72  ng = pUsing;.  r
200d0 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e  eturn p;.. appen
200e0 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20  d_from_error:.  
200f0 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
20100 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
20110 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20  ete(db, pOn);.  
20120 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
20130 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b  ete(db, pUsing);
20140 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
20150 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 71  Delete(db, pSubq
20160 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20  uery);.  return 
20170 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
20180 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72  an INDEXED BY or
20190 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
201a0 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74 20  use to the most 
201b0 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 0a  recently added .
201c0 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ** element of th
201d0 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70 61  e source-list pa
201e0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
201f0 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
20200 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
20210 69 73 74 49 6e 64 65 78 65 64 42 79 28 50 61 72  istIndexedBy(Par
20220 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
20230 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70  ist *p, Token *p
20240 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 61 73  IndexedBy){.  as
20250 73 65 72 74 28 20 70 49 6e 64 65 78 65 64 42 79  sert( pIndexedBy
20260 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 20 26  !=0 );.  if( p &
20270 26 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3e  & pIndexedBy->n>
20280 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
20290 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
202a0 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  tem;.    assert(
202b0 20 70 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20   p->nSrc>0 );.  
202c0 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b    pItem = &p->a[
202d0 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
202e0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
202f0 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  g.notIndexed==0 
20300 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
20310 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
20320 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61  edBy==0 );.    a
20330 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
20340 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b  .isTabFunc==0 );
20350 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 65  .    if( pIndexe
20360 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49  dBy->n==1 && !pI
20370 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20  ndexedBy->z ){. 
20380 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49       /* A "NOT I
20390 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65 20 77  NDEXED" clause w
203a0 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65  as supplied. See
203b0 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20   parse.y .      
203c0 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e  ** construct "in
203d0 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64  dexed_opt" for d
203e0 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20  etails. */.     
203f0 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e   pItem->fg.notIn
20400 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  dexed = 1;.    }
20410 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
20420 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
20430 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
20440 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
20450 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b  db, pIndexedBy);
20460 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
20470 2e 69 73 49 6e 64 65 78 65 64 42 79 20 3d 20 31  .isIndexedBy = 1
20480 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
20490 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 6c 69 73  *.** Add the lis
204a0 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  t of function ar
204b0 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 53  guments to the S
204c0 72 63 4c 69 73 74 20 65 6e 74 72 79 20 66 6f 72  rcList entry for
204d0 20 61 0a 2a 2a 20 74 61 62 6c 65 2d 76 61 6c 75   a.** table-valu
204e0 65 64 2d 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ed-function..*/.
204f0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
20500 69 73 74 46 75 6e 63 41 72 67 73 28 50 61 72 73  istFuncArgs(Pars
20510 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
20520 73 74 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20  st *p, ExprList 
20530 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70  *pList){.  if( p
20540 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53   ){.    struct S
20550 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
20560 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53  em = &p->a[p->nS
20570 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  rc-1];.    asser
20580 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74  t( pItem->fg.not
20590 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20  Indexed==0 );.  
205a0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
205b0 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 3d  >fg.isIndexedBy=
205c0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
205d0 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61  ( pItem->fg.isTa
205e0 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  bFunc==0 );.    
205f0 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  pItem->u1.pFuncA
20600 72 67 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  rg = pList;.    
20610 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pItem->fg.isTabF
20620 75 6e 63 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  unc = 1;.  }else
20630 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
20640 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
20650 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a  se->db, pList);.
20660 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
20670 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20  n building up a 
20680 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
20690 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a  he parser, the j
206a0 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  oin operator.** 
206b0 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74  is initially att
206c0 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
206d0 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20  t operand.  But 
206e0 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
206f0 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68  or.** expects th
20700 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
20710 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67  to be on the rig
20720 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  ht operand.  Thi
20730 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69  s routine.** Shi
20740 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65  fts all join ope
20750 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74  rators from left
20760 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e   to right for an
20770 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20   entire FROM.** 
20780 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78  clause..**.** Ex
20790 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74  ample: Suppose t
207a0 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20  he join is like 
207b0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
207c0 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20        A natural 
207d0 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a  cross join B.**.
207e0 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  ** The operator 
207f0 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73  is "natural cros
20800 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20  s join".  The A 
20810 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61  and B operands a
20820 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  re stored.** in 
20830 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61  p->a[0] and p->a
20840 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c  [1], respectivel
20850 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  y.  The parser i
20860 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20  nitially stores 
20870 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20  the.** operator 
20880 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f  with A.  This ro
20890 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68 61  utine shifts tha
208a0 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20  t operator over 
208b0 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  to B..*/.void sq
208c0 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66  lite3SrcListShif
208d0 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73  tJoinType(SrcLis
208e0 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  t *p){.  if( p )
208f0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
20900 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31   for(i=p->nSrc-1
20910 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20  ; i>0; i--){.   
20920 20 20 20 70 2d 3e 61 5b 69 5d 2e 66 67 2e 6a 6f     p->a[i].fg.jo
20930 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d  intype = p->a[i-
20940 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a  1].fg.jointype;.
20950 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30      }.    p->a[0
20960 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  ].fg.jointype = 
20970 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
20980 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
20990 64 65 20 66 6f 72 20 61 20 42 45 47 49 4e 20 73  de for a BEGIN s
209a0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
209b0 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72  d sqlite3BeginTr
209c0 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
209d0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70  *pParse, int typ
209e0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
209f0 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
20a00 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74  int i;..  assert
20a10 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
20a20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
20a30 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
20a40 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
20a50 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
20a60 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
20a70 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c  ACTION, "BEGIN",
20a80 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65   0, 0) ){.    re
20a90 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  turn;.  }.  v = 
20aa0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
20ab0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76  Parse);.  if( !v
20ac0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
20ad0 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52   type!=TK_DEFERR
20ae0 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ED ){.    for(i=
20af0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
20b00 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
20b10 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20b20 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
20b30 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c  , (type==TK_EXCL
20b40 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20  USIVE)+1);.     
20b50 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
20b60 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20  Btree(v, i);.   
20b70 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
20b80 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
20b90 5f 41 75 74 6f 43 6f 6d 6d 69 74 29 3b 0a 7d 0a  _AutoCommit);.}.
20ba0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
20bb0 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20  VDBE code for a 
20bc0 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41  COMMIT or ROLLBA
20bd0 43 4b 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CK statement..**
20be0 20 43 6f 64 65 20 66 6f 72 20 52 4f 4c 4c 42 41   Code for ROLLBA
20bf0 43 4b 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  CK is generated 
20c00 69 66 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c  if eType==TK_ROL
20c10 4c 42 41 43 4b 2e 20 20 4f 74 68 65 72 77 69 73  LBACK.  Otherwis
20c20 65 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65 6e  e.** code is gen
20c30 65 72 61 74 65 64 20 66 6f 72 20 61 20 43 4f 4d  erated for a COM
20c40 4d 49 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  MIT..*/.void sql
20c50 69 74 65 33 45 6e 64 54 72 61 6e 73 61 63 74 69  ite3EndTransacti
20c60 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
20c70 2c 20 69 6e 74 20 65 54 79 70 65 29 7b 0a 20 20  , int eType){.  
20c80 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
20c90 73 52 6f 6c 6c 62 61 63 6b 3b 0a 0a 20 20 61 73  sRollback;..  as
20ca0 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
20cb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20cc0 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  rse->db!=0 );.  
20cd0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 54  assert( eType==T
20ce0 4b 5f 43 4f 4d 4d 49 54 20 7c 7c 20 65 54 79 70  K_COMMIT || eTyp
20cf0 65 3d 3d 54 4b 5f 45 4e 44 20 7c 7c 20 65 54 79  e==TK_END || eTy
20d00 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 20  pe==TK_ROLLBACK 
20d10 29 3b 0a 20 20 69 73 52 6f 6c 6c 62 61 63 6b 20  );.  isRollback 
20d20 3d 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c  = eType==TK_ROLL
20d30 42 41 43 4b 3b 0a 20 20 69 66 28 20 73 71 6c 69  BACK;.  if( sqli
20d40 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
20d50 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
20d60 53 41 43 54 49 4f 4e 2c 20 0a 20 20 20 20 20 20  SACTION, .      
20d70 20 69 73 52 6f 6c 6c 62 61 63 6b 20 3f 20 22 52   isRollback ? "R
20d80 4f 4c 4c 42 41 43 4b 22 20 3a 20 22 43 4f 4d 4d  OLLBACK" : "COMM
20d90 49 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  IT", 0, 0) ){.  
20da0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
20db0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
20dc0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
20dd0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
20de0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20df0 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
20e00 2c 20 69 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20  , isRollback);. 
20e10 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
20e20 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
20e30 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
20e40 72 20 77 68 65 6e 20 69 74 20 70 61 72 73 65 73  r when it parses
20e50 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72   a command to cr
20e60 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65  eate,.** release
20e70 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20   or rollback an 
20e80 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a  SQL savepoint. .
20e90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
20ea0 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20 2a  avepoint(Parse *
20eb0 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20  pParse, int op, 
20ec0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
20ed0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73   char *zName = s
20ee0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
20ef0 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
20f00 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
20f10 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ame ){.    Vdbe 
20f20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
20f30 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69 66  dbe(pParse);.#if
20f40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20f50 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
20f60 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
20f70 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b  char * const az[
20f80 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22  ] = { "BEGIN", "
20f90 52 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42  RELEASE", "ROLLB
20fa0 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65  ACK" };.    asse
20fb0 72 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42  rt( !SAVEPOINT_B
20fc0 45 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e  EGIN && SAVEPOIN
20fd0 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20  T_RELEASE==1 && 
20fe0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
20ff0 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a  CK==2 );.#endif.
21000 20 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71      if( !v || sq
21010 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
21020 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41  Parse, SQLITE_SA
21030 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c  VEPOINT, az[op],
21040 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20   zName, 0) ){.  
21050 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
21060 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e  e(pParse->db, zN
21070 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
21080 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rn;.    }.    sq
21090 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
210a0 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c  v, OP_Savepoint,
210b0 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65   op, 0, 0, zName
210c0 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
210d0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
210e0 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64   sure the TEMP d
210f0 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20  atabase is open 
21100 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  and available fo
21110 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a  r use.  Return.*
21120 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
21130 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61  errors.  Leave a
21140 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
21150 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  s in the pParse 
21160 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
21170 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d  t sqlite3OpenTem
21180 70 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20  pDatabase(Parse 
21190 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
211a0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
211b0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ->db;.  if( db->
211c0 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26  aDb[1].pBt==0 &&
211d0 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
211e0 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  n ){.    int rc;
211f0 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b  .    Btree *pBt;
21200 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
21210 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20  t int flags = . 
21220 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
21230 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
21240 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
21250 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
21260 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
21270 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
21280 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
21290 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
212a0 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20  CLOSE |.        
212b0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
212c0 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d  MP_DB;..    rc =
212d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
212e0 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64  n(db->pVfs, 0, d
212f0 62 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c 61 67  b, &pBt, 0, flag
21300 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
21310 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21320 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
21330 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
21340 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  le to open a tem
21350 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
21360 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20  ".        "file 
21370 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70  for storing temp
21380 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a  orary tables");.
21390 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
213a0 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
213b0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
213c0 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20   db->aDb[1].pBt 
213d0 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  = pBt;.    asser
213e0 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  t( db->aDb[1].pS
213f0 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28  chema );.    if(
21400 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73   SQLITE_NOMEM==s
21410 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
21420 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e  geSize(pBt, db->
21430 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d 31  nextPagesize, -1
21440 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  , 0) ){.      sq
21450 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
21460 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
21470 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
21480 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
21490 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63  * Record the fac
214a0 74 20 74 68 61 74 20 74 68 65 20 73 63 68 65 6d  t that the schem
214b0 61 20 63 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e 65  a cookie will ne
214c0 65 64 20 74 6f 20 62 65 20 76 65 72 69 66 69 65  ed to be verifie
214d0 64 0a 2a 2a 20 66 6f 72 20 64 61 74 61 62 61 73  d.** for databas
214e0 65 20 69 44 62 2e 20 20 54 68 65 20 63 6f 64 65  e iDb.  The code
214f0 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 76 65 72   to actually ver
21500 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
21510 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63  ookie.** will oc
21520 63 75 72 20 61 74 20 74 68 65 20 65 6e 64 20 6f  cur at the end o
21530 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
21540 56 44 42 45 20 61 6e 64 20 77 69 6c 6c 20 62 65  VDBE and will be
21550 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 6c 61   generated.** la
21560 74 65 72 2c 20 62 79 20 73 71 6c 69 74 65 33 46  ter, by sqlite3F
21570 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a  inishCoding()..*
21580 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
21590 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50  deVerifySchema(P
215a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
215b0 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20  t iDb){.  Parse 
215c0 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
215d0 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
215e0 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 61 73  l(pParse);..  as
215f0 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
21600 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e  iDb<pParse->db->
21610 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
21620 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
21630 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20  [iDb].pBt!=0 || 
21640 69 44 62 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  iDb==1 );.  asse
21650 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d  rt( iDb<SQLITE_M
21660 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b  AX_ATTACHED+2 );
21670 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
21680 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
21690 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 69 44  d(pParse->db, iD
216a0 62 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 44  b, 0) );.  if( D
216b0 62 4d 61 73 6b 54 65 73 74 28 70 54 6f 70 6c 65  bMaskTest(pTople
216c0 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c  vel->cookieMask,
216d0 20 69 44 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20   iDb)==0 ){.    
216e0 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65  DbMaskSet(pTople
216f0 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c  vel->cookieMask,
21700 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21   iDb);.    if( !
21710 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
21720 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  Db==1 ){.      s
21730 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
21740 74 61 62 61 73 65 28 70 54 6f 70 6c 65 76 65 6c  tabase(pToplevel
21750 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
21760 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  /*.** If argumen
21770 74 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74  t zDb is NULL, t
21780 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  hen call sqlite3
21790 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
217a0 28 29 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20  () for each .** 
217b0 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
217c0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 6e  e. Otherwise, in
217d0 76 6f 6b 65 20 69 74 20 66 6f 72 20 74 68 65 20  voke it for the 
217e0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 7a  database named z
217f0 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  Db only..*/.void
21800 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
21810 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 50 61  fyNamedSchema(Pa
21820 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
21830 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
21840 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
21850 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
21860 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
21870 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
21880 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
21890 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
218a0 66 28 20 70 44 62 2d 3e 70 42 74 20 26 26 20 28  f( pDb->pBt && (
218b0 21 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74  !zDb || 0==sqlit
218c0 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 70  e3StrICmp(zDb, p
218d0 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 29 20 29  Db->zDbSName)) )
218e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
218f0 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
21900 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20  pParse, i);.    
21910 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
21920 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
21930 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20  e that prepares 
21940 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65  for doing an ope
21950 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d  ration that.** m
21960 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20  ight change the 
21970 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
21980 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61  This routine sta
21990 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61  rts a new transa
219a0 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20  ction if we are 
219b0 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68  not already with
219c0 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  in.** a transact
219d0 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20  ion.  If we are 
219e0 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61  already within a
219f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
21a00 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a  en a checkpoint.
21a10 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65  ** is set if the
21a20 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61   setStatement pa
21a30 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e  rameter is true.
21a40 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73    A checkpoint s
21a50 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20  hould.** be set 
21a60 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  for operations t
21a70 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28  hat might fail (
21a80 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61  due to a constra
21a90 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20  int) part of.** 
21aa0 74 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20  the way through 
21ab0 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e  and which will n
21ac0 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65  eed to undo some
21ad0 20 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20   writes without 
21ae0 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c  having to.** rol
21af0 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20  lback the whole 
21b00 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f  transaction.  Fo
21b10 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65  r operations whe
21b20 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  re all constrain
21b30 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65  ts.** can be che
21b40 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  cked before any 
21b50 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
21b60 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
21b70 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a  , it is never.**
21b80 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e   necessary to un
21b90 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74  do a write and t
21ba0 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68  he checkpoint sh
21bb0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e  ould not be set.
21bc0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21bd0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
21be0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
21bf0 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d  e, int setStatem
21c00 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  ent, int iDb){. 
21c10 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
21c20 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
21c30 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
21c40 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  ;.  sqlite3CodeV
21c50 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
21c60 73 65 2c 20 69 44 62 29 3b 0a 20 20 44 62 4d 61  se, iDb);.  DbMa
21c70 73 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d  skSet(pToplevel-
21c80 3e 77 72 69 74 65 4d 61 73 6b 2c 20 69 44 62 29  >writeMask, iDb)
21c90 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69  ;.  pToplevel->i
21ca0 73 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d 20 73  sMultiWrite |= s
21cb0 65 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a  etStatement;.}..
21cc0 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74  /*.** Indicate t
21cd0 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
21ce0 74 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  t currently unde
21cf0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d  r construction m
21d00 69 67 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f  ight write.** mo
21d10 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72  re than one entr
21d20 79 20 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65  y (example: dele
21d30 74 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68 65  ting one row the
21d40 6e 20 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74  n inserting anot
21d50 68 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e  her,.** insertin
21d60 67 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  g multiple rows 
21d70 69 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72 20 69  in a table, or i
21d80 6e 73 65 72 74 69 6e 67 20 61 20 72 6f 77 20 61  nserting a row a
21d90 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  nd index entries
21da0 2e 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72  .).** If an abor
21db0 74 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 73  t occurs after s
21dc0 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 77 72 69  ome of these wri
21dd0 74 65 73 20 68 61 76 65 20 63 6f 6d 70 6c 65 74  tes have complet
21de0 65 64 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  ed, then it will
21df0 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79  .** be necessary
21e00 20 74 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d   to undo the com
21e10 70 6c 65 74 65 64 20 77 72 69 74 65 73 2e 0a 2a  pleted writes..*
21e20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 75  /.void sqlite3Mu
21e30 6c 74 69 57 72 69 74 65 28 50 61 72 73 65 20 2a  ltiWrite(Parse *
21e40 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65  pParse){.  Parse
21e50 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
21e60 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
21e70 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54  el(pParse);.  pT
21e80 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69  oplevel->isMulti
21e90 57 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  Write = 1;.}../*
21ea0 20 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65   .** The code ge
21eb0 6e 65 72 61 74 6f 72 20 63 61 6c 6c 73 20 74 68  nerator calls th
21ec0 69 73 20 72 6f 75 74 69 6e 65 20 69 66 20 69 73  is routine if is
21ed0 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20   discovers that 
21ee0 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c  it is.** possibl
21ef0 65 20 74 6f 20 61 62 6f 72 74 20 61 20 73 74 61  e to abort a sta
21f00 74 65 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f 20  tement prior to 
21f10 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20  completion.  In 
21f20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72  order to .** per
21f30 66 6f 72 6d 20 74 68 69 73 20 61 62 6f 72 74 20  form this abort 
21f40 77 69 74 68 6f 75 74 20 63 6f 72 72 75 70 74 69  without corrupti
21f50 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ng the database,
21f60 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65   we need to make
21f70 0a 2a 2a 20 73 75 72 65 20 74 68 61 74 20 74 68  .** sure that th
21f80 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  e statement is p
21f90 72 6f 74 65 63 74 65 64 20 62 79 20 61 20 73 74  rotected by a st
21fa0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
21fb0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e  ion..**.** Techn
21fc0 69 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20  ically, we only 
21fd0 6e 65 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  need to set the 
21fe0 6d 61 79 41 62 6f 72 74 20 66 6c 61 67 20 69 66  mayAbort flag if
21ff0 20 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57   the.** isMultiW
22000 72 69 74 65 20 66 6c 61 67 20 77 61 73 20 70 72  rite flag was pr
22010 65 76 69 6f 75 73 6c 79 20 73 65 74 2e 20 20 54  eviously set.  T
22020 68 65 72 65 20 69 73 20 61 20 74 69 6d 65 20 64  here is a time d
22030 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63  ependency.** suc
22040 68 20 74 68 61 74 20 74 68 65 20 61 62 6f 72 74  h that the abort
22050 20 6d 75 73 74 20 6f 63 63 75 72 20 61 66 74 65   must occur afte
22060 72 20 74 68 65 20 6d 75 6c 74 69 77 72 69 74 65  r the multiwrite
22070 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a  .  This makes.**
22080 20 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74 73   some statements
22090 20 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20 52   involving the R
220a0 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20  EPLACE conflict 
220b0 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
220c0 69 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74  ithm.** go a lit
220d0 74 6c 65 20 66 61 73 74 65 72 2e 20 20 42 75 74  tle faster.  But
220e0 20 74 61 6b 69 6e 67 20 61 64 76 61 6e 74 61 67   taking advantag
220f0 65 20 6f 66 20 74 68 69 73 20 74 69 6d 65 20 64  e of this time d
22100 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b  ependency.** mak
22110 65 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66 69  es it more diffi
22120 63 75 6c 74 20 74 6f 20 70 72 6f 76 65 20 74 68  cult to prove th
22130 61 74 20 74 68 65 20 63 6f 64 65 20 69 73 20 63  at the code is c
22140 6f 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70  orrect (in .** p
22150 61 72 74 69 63 75 6c 61 72 2c 20 69 74 20 70 72  articular, it pr
22160 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 77  events us from w
22170 72 69 74 69 6e 67 20 61 6e 20 65 66 66 65 63 74  riting an effect
22180 69 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ive.** implement
22190 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  ation of sqlite3
221a0 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29  AssertMayAbort()
221b0 29 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65  ) and so we have
221c0 20 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61   chosen.** to ta
221d0 6b 65 20 74 68 65 20 73 61 66 65 20 72 6f 75 74  ke the safe rout
221e0 65 20 61 6e 64 20 73 6b 69 70 20 74 68 65 20 6f  e and skip the o
221f0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a  ptimization..*/.
22200 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 79 41  void sqlite3MayA
22210 62 6f 72 74 28 50 61 72 73 65 20 2a 70 50 61 72  bort(Parse *pPar
22220 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  se){.  Parse *pT
22230 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
22240 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
22250 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65  Parse);.  pTople
22260 76 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20  vel->mayAbort = 
22270 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  1;.}../*.** Code
22280 20 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61 74   an OP_Halt that
22290 20 63 61 75 73 65 73 20 74 68 65 20 76 64 62 65   causes the vdbe
222a0 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 53 51   to return an SQ
222b0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a  LITE_CONSTRAINT.
222c0 2a 2a 20 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e  ** error. The on
222d0 45 72 72 6f 72 20 70 61 72 61 6d 65 74 65 72 20  Error parameter 
222e0 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
222f0 20 28 69 66 20 61 6e 79 29 20 6f 66 20 74 68 65   (if any) of the
22300 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e   statement.** an
22310 64 2f 6f 72 20 63 75 72 72 65 6e 74 20 74 72 61  d/or current tra
22320 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
22330 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64  ed back..*/.void
22340 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73   sqlite3HaltCons
22350 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
22360 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
22370 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
22380 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 2c  /.  int errCode,
22390 20 20 20 20 20 20 2f 2a 20 65 78 74 65 6e 64 65        /* extende
223a0 64 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  d error code */.
223b0 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
223c0 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e      /* Constrain
223d0 74 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72  t type */.  char
223e0 20 2a 70 34 2c 20 20 20 20 20 20 20 20 20 2f 2a   *p4,         /*
223f0 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a   Error message *
22400 2f 0a 20 20 69 38 20 70 34 74 79 70 65 2c 20 20  /.  i8 p4type,  
22410 20 20 20 20 20 20 2f 2a 20 50 34 5f 53 54 41 54        /* P4_STAT
22420 49 43 20 6f 72 20 50 34 5f 54 52 41 4e 53 49 45  IC or P4_TRANSIE
22430 4e 54 20 2a 2f 0a 20 20 75 38 20 70 35 45 72 72  NT */.  u8 p5Err
22440 6d 73 67 20 20 20 20 20 20 20 2f 2a 20 50 35 5f  msg       /* P5_
22450 45 72 72 4d 73 67 20 74 79 70 65 20 2a 2f 0a 29  ErrMsg type */.)
22460 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
22470 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
22480 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
22490 28 65 72 72 43 6f 64 65 26 30 78 66 66 29 3d 3d  (errCode&0xff)==
224a0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
224b0 54 20 29 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72  T );.  if( onErr
224c0 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  or==OE_Abort ){.
224d0 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
224e0 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ort(pParse);.  }
224f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
22500 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  dOp4(v, OP_Halt,
22510 20 65 72 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f   errCode, onErro
22520 72 2c 20 30 2c 20 70 34 2c 20 70 34 74 79 70 65  r, 0, p4, p4type
22530 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
22540 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 45 72  ChangeP5(v, p5Er
22550 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rmsg);.}../*.** 
22560 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20  Code an OP_Halt 
22570 64 75 65 20 74 6f 20 55 4e 49 51 55 45 20 6f 72  due to UNIQUE or
22580 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
22590 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f  straint violatio
225a0 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
225b0 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69  e3UniqueConstrai
225c0 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
225d0 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
225e0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
225f0 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
22600 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20    /* Constraint 
22610 74 79 70 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  type */.  Index 
22620 2a 70 49 64 78 20 20 20 20 20 20 20 2f 2a 20 54  *pIdx       /* T
22630 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 74 72  he index that tr
22640 69 67 67 65 72 73 20 74 68 65 20 63 6f 6e 73 74  iggers the const
22650 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68  raint */.){.  ch
22660 61 72 20 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20  ar *zErr;.  int 
22670 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 65 72  j;.  StrAccum er
22680 72 4d 73 67 3b 0a 20 20 54 61 62 6c 65 20 2a 70  rMsg;.  Table *p
22690 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  Tab = pIdx->pTab
226a0 6c 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53 74  le;..  sqlite3St
226b0 72 41 63 63 75 6d 49 6e 69 74 28 26 65 72 72 4d  rAccumInit(&errM
226c0 73 67 2c 20 70 50 61 72 73 65 2d 3e 64 62 2c 20  sg, pParse->db, 
226d0 30 2c 20 30 2c 20 32 30 30 29 3b 0a 20 20 69 66  0, 0, 200);.  if
226e0 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72  ( pIdx->aColExpr
226f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58   ){.    sqlite3X
22700 50 72 69 6e 74 66 28 26 65 72 72 4d 73 67 2c 20  Printf(&errMsg, 
22710 22 69 6e 64 65 78 20 27 25 71 27 22 2c 20 70 49  "index '%q'", pI
22720 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  dx->zName);.  }e
22730 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  lse{.    for(j=0
22740 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; j<pIdx->nKeyCo
22750 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; j++){.      c
22760 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20  har *zCol;.     
22770 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
22780 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b  iColumn[j]>=0 );
22790 0a 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54  .      zCol = pT
227a0 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61  ab->aCol[pIdx->a
227b0 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d  iColumn[j]].zNam
227c0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 20 29  e;.      if( j )
227d0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
227e0 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20  Append(&errMsg, 
227f0 22 2c 20 22 2c 20 32 29 3b 0a 20 20 20 20 20 20  ", ", 2);.      
22800 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
22810 70 70 65 6e 64 41 6c 6c 28 26 65 72 72 4d 73 67  ppendAll(&errMsg
22820 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
22830 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
22840 41 63 63 75 6d 41 70 70 65 6e 64 28 26 65 72 72  AccumAppend(&err
22850 4d 73 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20  Msg, ".", 1);.  
22860 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
22870 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 65 72  cumAppendAll(&er
22880 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  rMsg, zCol);.   
22890 20 7d 0a 20 20 7d 0a 20 20 7a 45 72 72 20 3d 20   }.  }.  zErr = 
228a0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
228b0 69 6e 69 73 68 28 26 65 72 72 4d 73 67 29 3b 0a  inish(&errMsg);.
228c0 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
228d0 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
228e0 0a 20 20 20 20 49 73 50 72 69 6d 61 72 79 4b 65  .    IsPrimaryKe
228f0 79 49 6e 64 65 78 28 70 49 64 78 29 20 3f 20 53  yIndex(pIdx) ? S
22900 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
22910 5f 50 52 49 4d 41 52 59 4b 45 59 20 0a 20 20 20  _PRIMARYKEY .   
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22930 20 20 20 20 20 20 20 20 20 3a 20 53 51 4c 49 54           : SQLIT
22940 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49  E_CONSTRAINT_UNI
22950 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72 72 6f 72  QUE,.    onError
22960 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d  , zErr, P4_DYNAM
22970 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e  IC, P5_Constrain
22980 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a  tUnique);.}.../*
22990 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48  .** Code an OP_H
229a0 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f 6e 2d 75  alt due to non-u
229b0 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a  nique rowid..*/.
229c0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 77 69  void sqlite3Rowi
229d0 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  dConstraint(.  P
229e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
229f0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
22a00 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  ext */.  int onE
22a10 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f  rror,      /* Co
22a20 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
22a30 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20  n algorithm */. 
22a40 20 54 61 62 6c 65 20 2a 70 54 61 62 20 20 20 20   Table *pTab    
22a50 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
22a60 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d 75 6e 69  with the non-uni
22a70 71 75 65 20 72 6f 77 69 64 20 2a 2f 20 0a 29 7b  que rowid */ .){
22a80 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20  .  char *zMsg;. 
22a90 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
22aa0 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b  Tab->iPKey>=0 ){
22ab0 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
22ac0 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
22ad0 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  e->db, "%s.%s", 
22ae0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
22af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b00 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f         pTab->aCo
22b10 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a  l[pTab->iPKey].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 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20  T_PRIMARYKEY;.  
22b50 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d 73 67 20  }else{.    zMsg 
22b60 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
22b70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73  (pParse->db, "%s
22b80 2e 72 6f 77 69 64 22 2c 20 70 54 61 62 2d 3e 7a  .rowid", pTab->z
22b90 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Name);.    rc = 
22ba0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
22bb0 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20 73  T_ROWID;.  }.  s
22bc0 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
22bd0 61 69 6e 74 28 70 50 61 72 73 65 2c 20 72 63 2c  aint(pParse, rc,
22be0 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73 67 2c 20   onError, zMsg, 
22bf0 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20 20 20 20  P4_DYNAMIC,.    
22c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c10 20 20 20 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e      P5_Constrain
22c20 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a  tUnique);.}../*.
22c30 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
22c40 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20 74  if pIndex uses t
22c50 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
22c60 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65  uence pColl.  Re
22c70 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
22c80 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73  it does and fals
22c90 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  e if it does not
22ca0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
22cb0 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
22cc0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c  .static int coll
22cd0 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74  ationMatch(const
22ce0 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e   char *zColl, In
22cf0 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20  dex *pIndex){.  
22d00 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
22d10 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66   zColl!=0 );.  f
22d20 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78  or(i=0; i<pIndex
22d30 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
22d40 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
22d50 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43  *z = pIndex->azC
22d60 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  oll[i];.    asse
22d70 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70 49 6e 64  rt( z!=0 || pInd
22d80 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c  ex->aiColumn[i]<
22d90 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
22da0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
22db0 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  >=0 && 0==sqlite
22dc0 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c  3StrICmp(z, zCol
22dd0 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  l) ){.      retu
22de0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
22df0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
22e00 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ndif../*.** Reco
22e10 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
22e20 73 20 6f 66 20 70 54 61 62 20 74 68 61 74 20 75  s of pTab that u
22e30 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  se the collating
22e40 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
22e50 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20  .** If pColl==0 
22e60 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61  then recompute a
22e70 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54  ll indices of pT
22e80 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ab..*/.#ifndef S
22e90 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
22ea0 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  EX.static void r
22eb0 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73  eindexTable(Pars
22ec0 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
22ed0 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e   *pTab, char con
22ee0 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e  st *zColl){.  In
22ef0 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
22f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
22f10 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
22f20 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20   with pTab */.. 
22f30 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62   for(pIndex=pTab
22f40 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ->pIndex; pIndex
22f50 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d  ; pIndex=pIndex-
22f60 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
22f70 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c   zColl==0 || col
22f80 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c  lationMatch(zCol
22f90 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  l, pIndex) ){.  
22fa0 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
22fb0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
22fc0 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
22fd0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
22fe0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
22ff0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
23000 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
23010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
23020 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
23030 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20  , pIndex, -1);. 
23040 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
23050 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
23060 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
23070 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  f all tables in 
23080 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 68  all databases wh
23090 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63  ere the.** indic
230a0 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61  es use the colla
230b0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
230c0 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d  oll.  If pColl==
230d0 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65  0 then recompute
230e0 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  .** all indices 
230f0 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23  everywhere..*/.#
23100 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23110 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
23120 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61  c void reindexDa
23130 74 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70  tabases(Parse *p
23140 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73  Parse, char cons
23150 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20  t *zColl){.  Db 
23160 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
23170 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
23180 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f  ngle database */
23190 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
231b0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69  * The database i
231c0 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
231d0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
231e0 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
231f0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
23200 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73  nection */.  Has
23210 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20  hElem *k;       
23220 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
23230 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62  looping over tab
23240 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20  les in pDb */.  
23250 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
23260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
23270 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
23280 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  tabase */..  ass
23290 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
232a0 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
232b0 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64  (db) );  /* Need
232c0 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63  ed for schema ac
232d0 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44  cess */.  for(iD
232e0 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62  b=0, pDb=db->aDb
232f0 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
23300 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20  Db++, pDb++){.  
23310 20 20 61 73 73 65 72 74 28 20 70 44 62 21 3d 30    assert( pDb!=0
23320 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71   );.    for(k=sq
23330 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
23340 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
23350 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c  Hash);  k; k=sql
23360 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b  iteHashNext(k)){
23370 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54  .      pTab = (T
23380 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  able*)sqliteHash
23390 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72  Data(k);.      r
233a0 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
233b0 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29  se, pTab, zColl)
233c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
233d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
233e0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
233f0 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  e REINDEX comman
23400 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  d..**.**        
23410 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20  REINDEX         
23420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23430 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20     -- 1.**      
23440 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c    REINDEX  <coll
23450 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20  ation>          
23460 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20       -- 2.**    
23470 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
23480 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65  atabase>.?<table
23490 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20  name>  -- 3.**  
234a0 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
234b0 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64  <database>.?<ind
234c0 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a  exname>  -- 4.**
234d0 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65  .** Form 1 cause
234e0 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
234f0 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
23500 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 65  tabases to be re
23510 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32  built..** Form 2
23520 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e   rebuilds all in
23530 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  dices in all dat
23540 61 62 61 73 65 73 20 74 68 61 74 20 75 73 65 20  abases that use 
23550 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c  the named.** col
23560 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  lating function.
23570 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20    Forms 3 and 4 
23580 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65  rebuild the name
23590 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a  d index or all.*
235a0 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  * indices associ
235b0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
235c0 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69  med table..*/.#i
235d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
235e0 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73  T_REINDEX.void s
235f0 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 61  qlite3Reindex(Pa
23600 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
23610 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65  en *pName1, Toke
23620 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f  n *pName2){.  Co
23630 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
23640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
23650 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
23660 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c  to be reindexed,
23670 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68   or NULL */.  ch
23680 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
23690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
236a0 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
236b0 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74  index */.  const
236c0 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20   char *zDb;     
236d0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
236e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
236f0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
23700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23710 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
23720 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
23730 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
23740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
23750 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  n index associat
23760 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a  ed with pTab */.
23770 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
23780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23790 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
237a0 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
237b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
237c0 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
237d0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
237e0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ection */.  Toke
237f0 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20  n *pObjName;    
23800 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
23810 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
23820 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e  index to be rein
23830 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52  dexed */..  /* R
23840 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
23850 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
23860 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
23870 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
23880 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
23890 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
238a0 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
238b0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
238c0 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
238d0 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
238e0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
238f0 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29   if( pName1==0 )
23900 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74  {.    reindexDat
23910 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30  abases(pParse, 0
23920 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
23930 20 7d 65 6c 73 65 20 69 66 28 20 4e 45 56 45 52   }else if( NEVER
23940 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70  (pName2==0) || p
23950 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  Name2->z==0 ){. 
23960 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a     char *zColl;.
23970 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
23980 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f  e1->z );.    zCo
23990 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ll = sqlite3Name
239a0 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
239b0 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20  ->db, pName1);. 
239c0 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20     if( !zColl ) 
239d0 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c  return;.    pCol
239e0 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
239f0 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
23a00 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20  b), zColl, 0);. 
23a10 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
23a20 20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74        reindexDat
23a30 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a  abases(pParse, z
23a40 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Coll);.      sql
23a50 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
23a60 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74  Coll);.      ret
23a70 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  urn;.    }.    s
23a80 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
23a90 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69   zColl);.  }.  i
23aa0 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
23ab0 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
23ac0 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
23ad0 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66  &pObjName);.  if
23ae0 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
23af0 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e  ;.  z = sqlite3N
23b00 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
23b10 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66   pObjName);.  if
23b20 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
23b30 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  zDb = db->aDb
23b40 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
23b50 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
23b60 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c  FindTable(db, z,
23b70 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61   zDb);.  if( pTa
23b80 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78  b ){.    reindex
23b90 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
23ba0 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ab, 0);.    sqli
23bb0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
23bc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
23bd0 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
23be0 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
23bf0 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c  , z, zDb);.  sql
23c00 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
23c10 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  );.  if( pIndex 
23c20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
23c30 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
23c40 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
23c50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
23c60 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
23c70 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20  , pIndex, -1);. 
23c80 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
23c90 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
23ca0 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
23cb0 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65   to identify the
23cc0 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65   object to be re
23cd0 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e  indexed");.}.#en
23ce0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
23cf0 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  n a KeyInfo stru
23d00 63 74 75 72 65 20 74 68 61 74 20 69 73 20 61 70  cture that is ap
23d10 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
23d20 65 20 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a  e given Index..*
23d30 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
23d40 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71  should invoke sq
23d50 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
23d60 66 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72  f() on the retur
23d70 6e 65 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 68  ned object.** wh
23d80 65 6e 20 69 74 20 68 61 73 20 66 69 6e 69 73 68  en it has finish
23d90 65 64 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a  ed using it..*/.
23da0 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
23db0 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 50  KeyInfoOfIndex(P
23dc0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
23dd0 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e  dex *pIdx){.  in
23de0 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20  t i;.  int nCol 
23df0 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  = pIdx->nColumn;
23e00 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49  .  int nKey = pI
23e10 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b  dx->nKeyCol;.  K
23e20 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20  eyInfo *pKey;.  
23e30 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
23e40 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
23e50 66 28 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74  f( pIdx->uniqNot
23e60 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4b 65 79  Null ){.    pKey
23e70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
23e80 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  oAlloc(pParse->d
23e90 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b  b, nKey, nCol-nK
23ea0 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ey);.  }else{.  
23eb0 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
23ec0 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61  KeyInfoAlloc(pPa
23ed0 72 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30  rse->db, nCol, 0
23ee0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b 65  );.  }.  if( pKe
23ef0 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  y ){.    assert(
23f00 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
23f10 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 29  sWriteable(pKey)
23f20 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
23f30 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
23f40 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
23f50 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61  *zColl = pIdx->a
23f60 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zColl[i];.      
23f70 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pKey->aColl[i] =
23f80 20 7a 43 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33 53   zColl==sqlite3S
23f90 74 72 42 49 4e 41 52 59 20 3f 20 30 20 3a 0a 20  trBINARY ? 0 :. 
23fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
23fc0 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
23fd0 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  se, zColl);.    
23fe0 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64    pKey->aSortOrd
23ff0 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53  er[i] = pIdx->aS
24000 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20  ortOrder[i];.   
24010 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72 73   }.    if( pPars
24020 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20  e->nErr ){.     
24030 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
24040 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f  >rc==SQLITE_ERRO
24050 52 5f 4d 49 53 53 49 4e 47 5f 43 4f 4c 4c 53 45  R_MISSING_COLLSE
24060 51 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Q );.      if( p
24070 49 64 78 2d 3e 62 4e 6f 51 75 65 72 79 3d 3d 30  Idx->bNoQuery==0
24080 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44   ){.        /* D
24090 65 61 63 74 69 76 61 74 65 20 74 68 65 20 69 6e  eactivate the in
240a0 64 65 78 20 62 65 63 61 75 73 65 20 69 74 20 63  dex because it c
240b0 6f 6e 74 61 69 6e 73 20 61 6e 20 75 6e 6b 6e 6f  ontains an unkno
240c0 77 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 20  wn collating.   
240d0 20 20 20 20 20 2a 2a 20 73 65 71 75 65 6e 63 65       ** sequence
240e0 2e 20 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 20  .  The only way 
240f0 74 6f 20 72 65 61 63 74 69 76 65 20 74 68 65 20  to reactive the 
24100 69 6e 64 65 78 20 69 73 20 74 6f 20 72 65 6c 6f  index is to relo
24110 61 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ad the.        *
24120 2a 20 73 63 68 65 6d 61 2e 20 20 41 64 64 69 6e  * schema.  Addin
24130 67 20 74 68 65 20 6d 69 73 73 69 6e 67 20 63 6f  g the missing co
24140 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
24150 20 6c 61 74 65 72 20 64 6f 65 73 20 6e 6f 74 0a   later does not.
24160 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61 63 74          ** react
24170 69 76 65 20 74 68 65 20 69 6e 64 65 78 2e 20 20  ive the index.  
24180 54 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  The application 
24190 68 61 64 20 74 68 65 20 63 68 61 6e 63 65 20 74  had the chance t
241a0 6f 20 72 65 67 69 73 74 65 72 0a 20 20 20 20 20  o register.     
241b0 20 20 20 2a 2a 20 74 68 65 20 6d 69 73 73 69 6e     ** the missin
241c0 67 20 69 6e 64 65 78 20 75 73 69 6e 67 20 74 68  g index using th
241d0 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65 64  e collation-need
241e0 65 64 20 63 61 6c 6c 62 61 63 6b 2e 20 20 46 6f  ed callback.  Fo
241f0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6d  r.        ** sim
24200 70 6c 69 63 69 74 79 2c 20 53 51 4c 69 74 65 20  plicity, SQLite 
24210 77 69 6c 6c 20 6e 6f 74 20 67 69 76 65 20 74 68  will not give th
24220 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 61 20  e application a 
24230 73 65 63 6f 6e 64 20 63 68 61 6e 63 65 2e 0a 20  second chance.. 
24240 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
24250 20 20 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72 79    pIdx->bNoQuery
24260 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50   = 1;.        pP
24270 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
24280 45 5f 45 52 52 4f 52 5f 52 45 54 52 59 3b 0a 20  E_ERROR_RETRY;. 
24290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
242a0 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
242b0 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 70 4b  (pKey);.      pK
242c0 65 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ey = 0;.    }.  
242d0 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b  }.  return pKey;
242e0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
242f0 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a  TE_OMIT_CTE./* .
24300 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
24310 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
24320 70 65 72 20 43 54 45 20 62 79 20 74 68 65 20 70  per CTE by the p
24330 61 72 73 65 72 20 77 68 69 6c 65 20 70 61 72 73  arser while pars
24340 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48 20 63  ing a .** WITH c
24350 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68 20  lause. .*/.With 
24360 2a 73 71 6c 69 74 65 33 57 69 74 68 41 64 64 28  *sqlite3WithAdd(
24370 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
24380 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
24390 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
243a0 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  .  With *pWith, 
243b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
243c0 69 73 74 69 6e 67 20 57 49 54 48 20 63 6c 61 75  isting WITH clau
243d0 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  se, or NULL */. 
243e0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20   Token *pName,  
243f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
24400 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74   of the common-t
24410 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
24420 73 74 20 2a 70 41 72 67 6c 69 73 74 2c 20 20 20  st *pArglist,   
24430 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63 6f    /* Optional co
24440 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20 66  lumn name list f
24450 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  or the table */.
24460 20 20 53 65 6c 65 63 74 20 2a 70 51 75 65 72 79    Select *pQuery
24470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65            /* Que
24480 72 79 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69  ry used to initi
24490 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65 20  alize the table 
244a0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
244b0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
244c0 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65 77 3b 0a  ;.  With *pNew;.
244d0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a    char *zName;..
244e0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
244f0 74 68 65 20 43 54 45 20 6e 61 6d 65 20 69 73 20  the CTE name is 
24500 75 6e 69 71 75 65 20 77 69 74 68 69 6e 20 74 68  unique within th
24510 69 73 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20  is WITH clause. 
24520 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f  If.  ** not, sto
24530 72 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74  re an error in t
24540 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74 75  he Parse structu
24550 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d  re. */.  zName =
24560 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
24570 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
24580 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
24590 7a 4e 61 6d 65 20 26 26 20 70 57 69 74 68 20 29  zName && pWith )
245a0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
245b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74   for(i=0; i<pWit
245c0 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  h->nCte; i++){. 
245d0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
245e0 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70  StrICmp(zName, p
245f0 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  With->a[i].zName
24600 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
24610 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
24620 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61  pParse, "duplica
24630 74 65 20 57 49 54 48 20 74 61 62 6c 65 20 6e 61  te WITH table na
24640 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  me: %s", zName);
24650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
24660 20 7d 0a 0a 20 20 69 66 28 20 70 57 69 74 68 20   }..  if( pWith 
24670 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  ){.    int nByte
24680 20 3d 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68   = sizeof(*pWith
24690 29 20 2b 20 28 73 69 7a 65 6f 66 28 70 57 69 74  ) + (sizeof(pWit
246a0 68 2d 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74 68  h->a[1]) * pWith
246b0 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e 65  ->nCte);.    pNe
246c0 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
246d0 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74 68 2c 20  lloc(db, pWith, 
246e0 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  nByte);.  }else{
246f0 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
24700 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
24710 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69 74  db, sizeof(*pWit
24720 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  h));.  }.  asser
24730 74 28 20 28 70 4e 65 77 21 3d 30 20 26 26 20 7a  t( (pNew!=0 && z
24740 4e 61 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d 3e  Name!=0) || db->
24750 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
24760 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
24770 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
24780 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
24790 6c 65 74 65 28 64 62 2c 20 70 41 72 67 6c 69 73  lete(db, pArglis
247a0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  t);.    sqlite3S
247b0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
247c0 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c  pQuery);.    sql
247d0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
247e0 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 20  Name);.    pNew 
247f0 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65  = pWith;.  }else
24800 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e  {.    pNew->a[pN
24810 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63  ew->nCte].pSelec
24820 74 20 3d 20 70 51 75 65 72 79 3b 0a 20 20 20 20  t = pQuery;.    
24830 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43  pNew->a[pNew->nC
24840 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67  te].pCols = pArg
24850 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  list;.    pNew->
24860 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e  a[pNew->nCte].zN
24870 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
24880 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
24890 43 74 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20 30  Cte].zCteErr = 0
248a0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65  ;.    pNew->nCte
248b0 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ++;.  }..  retur
248c0 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
248d0 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e   Free the conten
248e0 74 73 20 6f 66 20 74 68 65 20 57 69 74 68 20 6f  ts of the With o
248f0 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
24900 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
24910 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
24920 69 74 65 33 57 69 74 68 44 65 6c 65 74 65 28 73  ite3WithDelete(s
24930 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68  qlite3 *db, With
24940 20 2a 70 57 69 74 68 29 7b 0a 20 20 69 66 28 20   *pWith){.  if( 
24950 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74  pWith ){.    int
24960 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
24970 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20   i<pWith->nCte; 
24980 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
24990 63 74 20 43 74 65 20 2a 70 43 74 65 20 3d 20 26  ct Cte *pCte = &
249a0 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20  pWith->a[i];.   
249b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
249c0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74  stDelete(db, pCt
249d0 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20  e->pCols);.     
249e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
249f0 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70  lete(db, pCte->p
24a00 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73  Select);.      s
24a10 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
24a20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
24a30 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
24a40 44 62 46 72 65 65 28 64 62 2c 20 70 57 69 74 68  DbFree(db, pWith
24a50 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
24a60 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
24a70 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a  TE_OMIT_CTE) */.