/ Hex Artifact Content
Login

Artifact a6424bece3662d57b19f8ead1541c959036bc632ac57f7f6f7801833c8e544da:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e   ){.    /* A min
1c40: 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73  imum of one curs
1c50: 6f 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69  or is required i
1c60: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
1c70: 69 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53  is used.    *  S
1c80: 65 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33  ee ticket [a6963
1c90: 37 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20  79c1f08866] */. 
1ca0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1cb0: 65 2d 3e 70 41 69 6e 63 3d 3d 30 20 7c 7c 20 70  e->pAinc==0 || p
1cc0: 50 61 72 73 65 2d 3e 6e 54 61 62 3e 30 20 29 3b  Parse->nTab>0 );
1cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ce0: 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61  MakeReady(v, pPa
1cf0: 72 73 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  rse);.    pParse
1d00: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f  ->rc = SQLITE_DO
1d10: 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
1d20: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
1d30: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1d40: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65  }../*.** Run the
1d50: 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65   parser and code
1d60: 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72   generator recur
1d70: 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20  sively in order 
1d80: 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63  to generate.** c
1d90: 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20  ode for the SQL 
1da0: 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
1db0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
1dc0: 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65  the pParse conte
1dd0: 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  xt.** currently 
1de0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1df0: 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61  on.  When the pa
1e00: 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75  rser is run recu
1e10: 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20  rsively.** this 
1e20: 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f  way, the final O
1e30: 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70  P_Halt is not ap
1e40: 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72  pended and other
1e50: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
1e60: 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74  ** and finalizat
1e70: 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d  ion steps are om
1e80: 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68  itted because th
1e90: 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67  ose are handling
1ea0: 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72   by the.** outer
1eb0: 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a  most parser..**.
1ec0: 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e  ** Not everythin
1ed0: 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20  g is nestable.  
1ee0: 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73  This facility is
1ef0: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72   designed to per
1f00: 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55  mit.** INSERT, U
1f10: 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54  PDATE, and DELET
1f20: 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61  E operations aga
1f30: 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54  inst SQLITE_MAST
1f40: 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65  ER.  Use.** care
1f50: 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74   if you decide t
1f60: 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69  o try to use thi
1f70: 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f  s routine for so
1f80: 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1f90: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1fa0: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61  e3NestedParse(Pa
1fb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
1fc0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1fd0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1fe0: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
1ff0: 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
2000: 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Msg = 0;.  sqlit
2010: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
2020: 3e 64 62 3b 0a 20 20 63 68 61 72 20 73 61 76 65  >db;.  char save
2030: 42 75 66 5b 50 41 52 53 45 5f 54 41 49 4c 5f 53  Buf[PARSE_TAIL_S
2040: 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Z];..  if( pPars
2050: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
2060: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
2070: 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b  se->nested<10 );
2080: 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f    /* Nesting sho
2090: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c  uld only be of l
20a0: 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a  imited depth */.
20b0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
20c0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20  Format);.  zSql 
20d0: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
20e0: 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  f(db, zFormat, a
20f0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
2100: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
2110: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
2120: 61 6e 20 72 65 73 75 6c 74 20 65 69 74 68 65 72  an result either
2130: 20 66 72 6f 6d 20 61 6e 20 4f 4f 4d 20 6f 72 20   from an OOM or 
2140: 62 65 63 61 75 73 65 20 74 68 65 20 66 6f 72 6d  because the form
2150: 61 74 74 65 64 20 73 74 72 69 6e 67 0a 20 20 20  atted string.   
2160: 20 2a 2a 20 65 78 63 65 65 64 73 20 53 51 4c 49   ** exceeds SQLI
2170: 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 2e  TE_LIMIT_LENGTH.
2180: 20 20 49 6e 20 74 68 65 20 6c 61 74 74 65 72 20    In the latter 
2190: 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f  case, we need to
21a0: 20 73 65 74 0a 20 20 20 20 2a 2a 20 61 6e 20 65   set.    ** an e
21b0: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  rror */.    if( 
21c0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
21d0: 64 20 29 20 70 50 61 72 73 65 2d 3e 72 63 20 3d  d ) pParse->rc =
21e0: 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3b 0a   SQLITE_TOOBIG;.
21f0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
2200: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
2210: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65    }.  pParse->ne
2220: 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  sted++;.  memcpy
2230: 28 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f  (saveBuf, PARSE_
2240: 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50 41  TAIL(pParse), PA
2250: 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20  RSE_TAIL_SZ);.  
2260: 6d 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41 49  memset(PARSE_TAI
2270: 4c 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50 41  L(pParse), 0, PA
2280: 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20  RSE_TAIL_SZ);.  
2290: 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72  sqlite3RunParser
22a0: 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26  (pParse, zSql, &
22b0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
22c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
22d0: 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
22e0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c  3DbFree(db, zSql
22f0: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41 52 53  );.  memcpy(PARS
2300: 45 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20  E_TAIL(pParse), 
2310: 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54  saveBuf, PARSE_T
2320: 41 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73  AIL_SZ);.  pPars
2330: 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a  e->nested--;.}..
2340: 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
2350: 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f  AUTHENTICATION./
2360: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
2370: 20 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74 68   if zTable is th
2380: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79  e name of the sy
2390: 73 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74 20  stem table that 
23a0: 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c 69  stores the.** li
23b0: 73 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64 20  st of users and 
23c0: 74 68 65 69 72 20 61 63 63 65 73 73 20 63 72 65  their access cre
23d0: 64 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e 74  dentials..*/.int
23e0: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
23f0: 54 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  Table(const char
2400: 20 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65 74   *zTable){.  ret
2410: 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72 69  urn sqlite3_stri
2420: 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c  cmp(zTable, "sql
2430: 69 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a 7d  ite_user")==0;.}
2440: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c  .#endif../*.** L
2450: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
2460: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
2470: 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70  at describes a p
2480: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
2490: 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65  se.** table give
24a0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
24b0: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
24c0: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
24d0: 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  me of the.** dat
24e0: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
24f0: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2500: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
2510: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
2520: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
2530: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
2540: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
2550: 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  he table and the
2560: 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69  .** first matchi
2570: 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75  ng table is retu
2580: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
2590: 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ing for duplicat
25a0: 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73  e table.** names
25b0: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
25c0: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20  search order is 
25d0: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
25e0: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a   MAIN, then any.
25f0: 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ** auxiliary dat
2600: 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69  abases added usi
2610: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
2620: 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  mmand..**.** See
2630: 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63   also sqlite3Loc
2640: 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54  ateTable()..*/.T
2650: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e  able *sqlite3Fin
2660: 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  dTable(sqlite3 *
2670: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
2680: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
2690: 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20  r *zDatabase){. 
26a0: 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20   Table *p = 0;. 
26b0: 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 6c   int i;..  /* Al
26c0: 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65  l mutexes are re
26d0: 71 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d  quired for schem
26e0: 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20  a access.  Make 
26f0: 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65  sure we hold the
2700: 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  m. */.  assert( 
2710: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c 20  zDatabase!=0 || 
2720: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2730: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
2740: 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53  );.#if SQLITE_US
2750: 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
2760: 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20  N.  /* Only the 
2770: 61 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61 6c  admin user is al
2780: 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68  lowed to know th
2790: 61 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75 73  at the sqlite_us
27a0: 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65 78  er table.  ** ex
27b0: 69 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64 62  ists */.  if( db
27c0: 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c  ->auth.authLevel
27d0: 3c 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26 20  <UAUTH_Admin && 
27e0: 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54  sqlite3UserAuthT
27f0: 61 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20 29  able(zName)!=0 )
2800: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2810: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68 69    }.#endif.  whi
2820: 6c 65 28 31 29 7b 0a 20 20 20 20 66 6f 72 28 69  le(1){.    for(i
2830: 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c  =OMIT_TEMPDB; i<
2840: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2850: 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c       int j = (i<
2860: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20  2) ? i^1 : i;   
2870: 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62  /* Search TEMP b
2880: 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20  efore MAIN */.  
2890: 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73      if( zDatabas
28a0: 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53  e==0 || sqlite3S
28b0: 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65  trICmp(zDatabase
28c0: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62  , db->aDb[j].zDb
28d0: 53 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  SName)==0 ){.   
28e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
28f0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
2900: 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b  eld(db, j, 0) );
2910: 0a 20 20 20 20 20 20 20 20 70 20 3d 20 73 71 6c  .        p = sql
2920: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
2930: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
2940: 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65  ->tblHash, zName
2950: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2960: 20 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20   ) return p;.   
2970: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f     }.    }.    /
2980: 2a 20 4e 6f 74 20 66 6f 75 6e 64 2e 20 20 49 66  * Not found.  If
2990: 20 74 68 65 20 6e 61 6d 65 20 77 65 20 77 65 72   the name we wer
29a0: 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 77 61  e looking for wa
29b0: 73 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 6d 61  s temp.sqlite_ma
29c0: 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 6e  ster.    ** then
29d0: 20 63 68 61 6e 67 65 20 74 68 65 20 6e 61 6d 65   change the name
29e0: 20 74 6f 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f   to sqlite_temp_
29f0: 6d 61 73 74 65 72 20 61 6e 64 20 74 72 79 20 61  master and try a
2a00: 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  gain. */.    if(
2a10: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2a20: 7a 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  zName, MASTER_NA
2a30: 4d 45 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ME)!=0 ) break;.
2a40: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
2a50: 73 74 72 69 63 6d 70 28 7a 44 61 74 61 62 61 73  stricmp(zDatabas
2a60: 65 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44  e, db->aDb[1].zD
2a70: 62 53 4e 61 6d 65 29 21 3d 30 20 29 20 62 72 65  bSName)!=0 ) bre
2a80: 61 6b 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  ak;.    zName = 
2a90: 54 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d 45  TEMP_MASTER_NAME
2aa0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2ab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
2ac0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
2ad0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
2ae0: 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69  escribes a parti
2af0: 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a  cular database.*
2b00: 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  * table given th
2b10: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74  e name of that t
2b20: 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e  able and (option
2b30: 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f  ally) the name o
2b40: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
2b50: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
2b60: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
2b70: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
2b80: 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61  d.  Also leave a
2b90: 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  n.** error messa
2ba0: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
2bb0: 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rrMsg..**.** The
2bc0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
2bd0: 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
2be0: 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64   and sqlite3Find
2bf0: 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20  Table() is that 
2c00: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
2c10: 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20  leaves an error 
2c20: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
2c30: 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65  e->zErrMsg where
2c40: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54  .** sqlite3FindT
2c50: 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e  able() does not.
2c60: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
2c70: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20  e3LocateTable(. 
2c80: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2c90: 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65          /* conte
2ca0: 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72  xt in which to r
2cb0: 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a  eport errors */.
2cc0: 20 20 75 33 32 20 66 6c 61 67 73 2c 20 20 20 20    u32 flags,    
2cd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 43 41           /* LOCA
2ce0: 54 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43 41 54  TE_VIEW or LOCAT
2cf0: 45 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63 6f 6e  E_NOERR */.  con
2d00: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
2d10: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2d20: 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
2d30: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20  looking for */. 
2d40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2d50: 61 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ase     /* Name 
2d60: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
2d70: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
2d80: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
2d90: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2da0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
2db0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
2dc0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
2dd0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2de0: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
2df0: 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
2e00: 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
2e10: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
2e20: 2e 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e  . */.  if( (db->
2e30: 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41  mDbFlags & DBFLA
2e40: 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 29  G_SchemaKnownOk)
2e50: 3d 3d 30 20 0a 20 20 20 26 26 20 53 51 4c 49 54  ==0 .   && SQLIT
2e60: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
2e70: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 0a  dSchema(pParse).
2e80: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2e90: 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71  0;.  }..  p = sq
2ea0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
2eb0: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65  b, zName, zDbase
2ec0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
2ed0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ee0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2ef0: 45 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  E.    /* If zNam
2f00: 65 20 69 73 20 74 68 65 20 6e 6f 74 20 74 68 65  e is the not the
2f10: 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65   name of a table
2f20: 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63   in the schema c
2f30: 72 65 61 74 65 64 20 75 73 69 6e 67 0a 20 20 20  reated using.   
2f40: 20 2a 2a 20 43 52 45 41 54 45 2c 20 74 68 65 6e   ** CREATE, then
2f50: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
2f60: 20 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20   it is the name 
2f70: 6f 66 20 61 6e 20 76 69 72 74 75 61 6c 20 74 61  of an virtual ta
2f80: 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ble that.    ** 
2f90: 63 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d  can be an eponym
2fa0: 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ous virtual tabl
2fb0: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  e. */.    if( pP
2fc0: 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 56 74 61  arse->disableVta
2fd0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d 6f  b==0 ){.      Mo
2fe0: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
2ff0: 64 75 6c 65 2a 29 73 71 6c 69 74 65 33 48 61 73  dule*)sqlite3Has
3000: 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75  hFind(&db->aModu
3010: 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  le, zName);.    
3020: 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20 26 26    if( pMod==0 &&
3030: 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
3040: 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d 61  p(zName, "pragma
3050: 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  _", 7)==0 ){.   
3060: 20 20 20 20 20 70 4d 6f 64 20 3d 20 73 71 6c 69       pMod = sqli
3070: 74 65 33 50 72 61 67 6d 61 56 74 61 62 52 65 67  te3PragmaVtabReg
3080: 69 73 74 65 72 28 64 62 2c 20 7a 4e 61 6d 65 29  ister(db, zName)
3090: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30a0: 69 66 28 20 70 4d 6f 64 20 26 26 20 73 71 6c 69  if( pMod && sqli
30b0: 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73  te3VtabEponymous
30c0: 54 61 62 6c 65 49 6e 69 74 28 70 50 61 72 73 65  TableInit(pParse
30d0: 2c 20 70 4d 6f 64 29 20 29 7b 0a 20 20 20 20 20  , pMod) ){.     
30e0: 20 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e     return pMod->
30f0: 70 45 70 6f 54 61 62 3b 0a 20 20 20 20 20 20 7d  pEpoTab;.      }
3100: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
3110: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4c 4f    if( flags & LO
3120: 43 41 54 45 5f 4e 4f 45 52 52 20 29 20 72 65 74  CATE_NOERR ) ret
3130: 75 72 6e 20 30 3b 0a 20 20 20 20 70 50 61 72 73  urn 0;.    pPars
3140: 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
3150: 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
3160: 49 73 56 69 72 74 75 61 6c 28 70 29 20 26 26 20  IsVirtual(p) && 
3170: 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 56  pParse->disableV
3180: 74 61 62 20 29 7b 0a 20 20 20 20 70 20 3d 20 30  tab ){.    p = 0
3190: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 3d 3d  ;.  }..  if( p==
31a0: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
31b0: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 66 6c 61 67  har *zMsg = flag
31c0: 73 20 26 20 4c 4f 43 41 54 45 5f 56 49 45 57 20  s & LOCATE_VIEW 
31d0: 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22  ? "no such view"
31e0: 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c   : "no such tabl
31f0: 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 61  e";.    if( zDba
3200: 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  se ){.      sqli
3210: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3220: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c  se, "%s: %s.%s",
3230: 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a   zMsg, zDbase, z
3240: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
3250: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
3260: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3270: 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20  "%s: %s", zMsg, 
3280: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
3290: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  }..  return p;.}
32a0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
32b0: 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66  he table identif
32c0: 69 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a  ied by *p..**.**
32d0: 20 54 68 69 73 20 69 73 20 61 20 77 72 61 70 70   This is a wrapp
32e0: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
32f0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20  3LocateTable(). 
3300: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
3310: 65 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65  etween.** sqlite
3320: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61  3LocateTable() a
3330: 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
3340: 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
3350: 6e 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73  nction restricts
3360: 0a 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 74  .** the search t
3370: 6f 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63  o schema (p->pSc
3380: 68 65 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e  hema) if it is n
3390: 6f 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68  ot NULL. p->pSch
33a0: 65 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f  ema may be.** no
33b0: 6e 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20  n-NULL if it is 
33c0: 70 61 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f  part of a view o
33d0: 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  r trigger progra
33e0: 6d 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65  m definition. Se
33f0: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53  e.** sqlite3FixS
3400: 72 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74  rcList() for det
3410: 61 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  ails..*/.Table *
3420: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
3430: 6c 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20  leItem(.  Parse 
3440: 2a 70 50 61 72 73 65 2c 20 0a 20 20 75 33 32 20  *pParse, .  u32 
3450: 66 6c 61 67 73 2c 0a 20 20 73 74 72 75 63 74 20  flags,.  struct 
3460: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a  SrcList_item *p.
3470: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
3480: 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20  *zDb;.  assert( 
3490: 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c  p->pSchema==0 ||
34a0: 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30   p->zDatabase==0
34b0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 63   );.  if( p->pSc
34c0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74 20  hema ){.    int 
34d0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
34e0: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
34f0: 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  e->db, p->pSchem
3500: 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70 50  a);.    zDb = pP
3510: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
3520: 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 7d  b].zDbSName;.  }
3530: 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20  else{.    zDb = 
3540: 70 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20  p->zDatabase;.  
3550: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
3560: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
3570: 61 72 73 65 2c 20 66 6c 61 67 73 2c 20 70 2d 3e  arse, flags, p->
3580: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a  zName, zDb);.}..
3590: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
35a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
35b0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
35c0: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
35d0: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
35e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
35f0: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
3600: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
3610: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
3620: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
3630: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
3640: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
3650: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
3660: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
3670: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
3680: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
3690: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
36a0: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
36b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
36c0: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
36d0: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
36e0: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
36f0: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
3700: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
3710: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
3720: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
3730: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
3740: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
3750: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
3760: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
3770: 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  e3FindIndex(sqli
3780: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
3790: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
37a0: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
37b0: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
37c0: 69 6e 74 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20  int i;.  /* All 
37d0: 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71 75  mutexes are requ
37e0: 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20  ired for schema 
37f0: 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75  access.  Make su
3800: 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e  re we hold them.
3810: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44   */.  assert( zD
3820: 62 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42  b!=0 || sqlite3B
3830: 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65  treeHoldsAllMute
3840: 78 65 73 28 64 62 29 20 29 3b 0a 20 20 66 6f 72  xes(db) );.  for
3850: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
3860: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
3870: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
3880: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f  2) ? i^1 : i;  /
3890: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
38a0: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
38b0: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
38c0: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53   = db->aDb[j].pS
38d0: 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72  chema;.    asser
38e0: 74 28 20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  t( pSchema );.  
38f0: 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c    if( zDb && sql
3900: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
3910: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53   db->aDb[j].zDbS
3920: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
3930: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
3940: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
3950: 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29  Held(db, j, 0) )
3960: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
3970: 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68 65  3HashFind(&pSche
3980: 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61  ma->idxHash, zNa
3990: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
39a0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
39b0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
39c0: 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d   Reclaim the mem
39d0: 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20 69  ory used by an i
39e0: 6e 64 65 78 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ndex.*/.void sql
39f0: 69 74 65 33 46 72 65 65 49 6e 64 65 78 28 73 71  ite3FreeIndex(sq
3a00: 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78  lite3 *db, Index
3a10: 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53 51   *p){.#ifndef SQ
3a20: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a  LITE_OMIT_ANALYZ
3a30: 45 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74  E.  sqlite3Delet
3a40: 65 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 64 62  eIndexSamples(db
3a50: 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  , p);.#endif.  s
3a60: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3a70: 28 64 62 2c 20 70 2d 3e 70 50 61 72 74 49 64 78  (db, p->pPartIdx
3a80: 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
3a90: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
3aa0: 64 62 2c 20 70 2d 3e 61 43 6f 6c 45 78 70 72 29  db, p->aColExpr)
3ab0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
3ac0: 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66  e(db, p->zColAff
3ad0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65  );.  if( p->isRe
3ae0: 73 69 7a 65 64 20 29 20 73 71 6c 69 74 65 33 44  sized ) sqlite3D
3af0: 62 46 72 65 65 28 64 62 2c 20 28 76 6f 69 64 20  bFree(db, (void 
3b00: 2a 29 70 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 23 69  *)p->azColl);.#i
3b10: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3b20: 4c 45 5f 53 54 41 54 34 0a 20 20 73 71 6c 69 74  LE_STAT4.  sqlit
3b30: 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f 77  e3_free(p->aiRow
3b40: 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  Est);.#endif.  s
3b50: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3b60: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f   p);.}../*.** Fo
3b70: 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c 6c  r the index call
3b80: 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69 63  ed zIdxName whic
3b90: 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68  h is found in th
3ba0: 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c 0a  e database iDb,.
3bb0: 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20 69  ** unlike that i
3bc0: 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54 61  ndex from its Ta
3bd0: 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65 20  ble then remove 
3be0: 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a  the index from.*
3bf0: 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68  * the index hash
3c00: 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20   table and free 
3c10: 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  all memory struc
3c20: 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
3c30: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64  .** with the ind
3c40: 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ex..*/.void sqli
3c50: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
3c60: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  teIndex(sqlite3 
3c70: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
3c80: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61  nst char *zIdxNa
3c90: 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  me){.  Index *pI
3ca0: 6e 64 65 78 3b 0a 20 20 48 61 73 68 20 2a 70 48  ndex;.  Hash *pH
3cb0: 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ash;..  assert( 
3cc0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
3cd0: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
3ce0: 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d 20  0) );.  pHash = 
3cf0: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53  &db->aDb[iDb].pS
3d00: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a  chema->idxHash;.
3d10: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
3d20: 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61  e3HashInsert(pHa
3d30: 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30 29  sh, zIdxName, 0)
3d40: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
3d50: 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69 66  Index) ){.    if
3d60: 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ( pIndex->pTable
3d70: 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78  ->pIndex==pIndex
3d80: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
3d90: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
3da0: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
3db0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3dc0: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
3dd0: 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74     /* Justificat
3de0: 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b  ion of ALWAYS();
3df0: 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74    The index must
3e00: 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20   be on the list 
3e10: 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69  of.      ** indi
3e20: 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20  ces. */.      p 
3e30: 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
3e40: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
3e50: 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29  while( ALWAYS(p)
3e60: 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49   && p->pNext!=pI
3e70: 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70  ndex ){ p = p->p
3e80: 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66  Next; }.      if
3e90: 28 20 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d  ( ALWAYS(p && p-
3ea0: 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20  >pNext==pIndex) 
3eb0: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  ){.        p->pN
3ec0: 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  ext = pIndex->pN
3ed0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
3ee0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 72   }.    sqlite3Fr
3ef0: 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  eeIndex(db, pInd
3f00: 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6d  ex);.  }.  db->m
3f10: 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41  DbFlags |= DBFLA
3f20: 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  G_SchemaChange;.
3f30: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68  }../*.** Look th
3f40: 72 6f 75 67 68 20 74 68 65 20 6c 69 73 74 20 6f  rough the list o
3f50: 66 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  f open database 
3f60: 66 69 6c 65 73 20 69 6e 20 64 62 2d 3e 61 44 62  files in db->aDb
3f70: 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79  [] and if.** any
3f80: 20 68 61 76 65 20 62 65 65 6e 20 63 6c 6f 73 65   have been close
3f90: 64 2c 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66  d, remove them f
3fa0: 72 6f 6d 20 74 68 65 20 6c 69 73 74 2e 20 20 52  rom the list.  R
3fb0: 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a  eallocate the.**
3fc0: 20 64 62 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63   db->aDb[] struc
3fd0: 74 75 72 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65  ture to a smalle
3fe0: 72 20 73 69 7a 65 2c 20 69 66 20 70 6f 73 73 69  r size, if possi
3ff0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79  ble..**.** Entry
4000: 20 30 20 28 74 68 65 20 22 6d 61 69 6e 22 20 64   0 (the "main" d
4010: 61 74 61 62 61 73 65 29 20 61 6e 64 20 65 6e 74  atabase) and ent
4020: 72 79 20 31 20 28 74 68 65 20 22 74 65 6d 70 22  ry 1 (the "temp"
4030: 20 64 61 74 61 62 61 73 65 29 0a 2a 2a 20 61 72   database).** ar
4040: 65 20 6e 65 76 65 72 20 63 61 6e 64 69 64 61 74  e never candidat
4050: 65 73 20 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c  es for being col
4060: 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  lapsed..*/.void 
4070: 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44  sqlite3CollapseD
4080: 61 74 61 62 61 73 65 41 72 72 61 79 28 73 71 6c  atabaseArray(sql
4090: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
40a0: 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a   i, j;.  for(i=j
40b0: 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =2; i<db->nDb; i
40c0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
40d0: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
40e0: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
40f0: 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  Db->pBt==0 ){.  
4100: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4110: 65 28 64 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e  e(db, pDb->zDbSN
4120: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  ame);.      pDb-
4130: 3e 7a 44 62 53 4e 61 6d 65 20 3d 20 30 3b 0a 20  >zDbSName = 0;. 
4140: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
4150: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69     }.    if( j<i
4160: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   ){.      db->aD
4170: 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69  b[j] = db->aDb[i
4180: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b  ];.    }.    j++
4190: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 44 62 20  ;.  }.  db->nDb 
41a0: 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e  = j;.  if( db->n
41b0: 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62  Db<=2 && db->aDb
41c0: 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20  !=db->aDbStatic 
41d0: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62  ){.    memcpy(db
41e0: 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d  ->aDbStatic, db-
41f0: 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64  >aDb, 2*sizeof(d
4200: 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20  b->aDb[0]));.   
4210: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4220: 62 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20  b, db->aDb);.   
4230: 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
4240: 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a  DbStatic;.  }.}.
4250: 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65  ./*.** Reset the
4260: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20   schema for the 
4270: 64 61 74 61 62 61 73 65 20 61 74 20 69 6e 64 65  database at inde
4280: 78 20 69 44 62 2e 20 20 41 6c 73 6f 20 72 65 73  x iDb.  Also res
4290: 65 74 20 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73  et the.** TEMP s
42a0: 63 68 65 6d 61 2e 20 20 54 68 65 20 72 65 73 65  chema.  The rese
42b0: 74 20 69 73 20 64 65 66 65 72 72 65 64 20 69 66  t is deferred if
42c0: 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b   db->nSchemaLock
42d0: 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2e 0a 2a 2a   is not zero..**
42e0: 20 44 65 66 65 72 72 65 64 20 72 65 73 65 74 73   Deferred resets
42f0: 20 6d 61 79 20 62 65 20 72 75 6e 20 62 79 20 63   may be run by c
4300: 61 6c 6c 69 6e 67 20 77 69 74 68 20 69 44 62 3c  alling with iDb<
4310: 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
4320: 65 33 52 65 73 65 74 4f 6e 65 53 63 68 65 6d 61  e3ResetOneSchema
4330: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
4340: 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 69 3b  t iDb){.  int i;
4350: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64  .  assert( iDb<d
4360: 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 69 66 28  b->nDb );..  if(
4370: 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61   iDb>=0 ){.    a
4380: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
4390: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
43a0: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
43b0: 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64   DbSetProperty(d
43c0: 62 2c 20 69 44 62 2c 20 44 42 5f 52 65 73 65 74  b, iDb, DB_Reset
43d0: 57 61 6e 74 65 64 29 3b 0a 20 20 20 20 44 62 53  Wanted);.    DbS
43e0: 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 31  etProperty(db, 1
43f0: 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64  , DB_ResetWanted
4400: 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c  );.    db->mDbFl
4410: 61 67 73 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53  ags &= ~DBFLAG_S
4420: 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 3b 0a 20 20  chemaKnownOk;.  
4430: 7d 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 63  }..  if( db->nSc
4440: 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  hemaLock==0 ){. 
4450: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
4460: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
4470: 20 20 20 69 66 28 20 44 62 48 61 73 50 72 6f 70     if( DbHasProp
4480: 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 52  erty(db, i, DB_R
4490: 65 73 65 74 57 61 6e 74 65 64 29 20 29 7b 0a 20  esetWanted) ){. 
44a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63         sqlite3Sc
44b0: 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44  hemaClear(db->aD
44c0: 62 5b 69 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20  b[i].pSchema);. 
44d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
44e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
44f0: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
4500: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20  mation from all 
4510: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
4520: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a  es (including.**
4530: 20 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d   "main" and "tem
4540: 70 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  p") for a single
4550: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
4560: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
4570: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
4580: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
4590: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
45a0: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
45b0: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
45c0: 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  b);.  for(i=0; i
45d0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
45e0: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
45f0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
4600: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20  f( pDb->pSchema 
4610: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  ){.      if( db-
4620: 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20  >nSchemaLock==0 
4630: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4640: 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44  e3SchemaClear(pD
4650: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
4660: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4670: 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28    DbSetProperty(
4680: 64 62 2c 20 69 2c 20 44 42 5f 52 65 73 65 74 57  db, i, DB_ResetW
4690: 61 6e 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 0a  anted);.      }.
46a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e      }.  }.  db->
46b0: 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e 28 44 42  mDbFlags &= ~(DB
46c0: 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67  FLAG_SchemaChang
46d0: 65 7c 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b  e|DBFLAG_SchemaK
46e0: 6e 6f 77 6e 4f 6b 29 3b 0a 20 20 73 71 6c 69 74  nownOk);.  sqlit
46f0: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74  e3VtabUnlockList
4700: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  (db);.  sqlite3B
4710: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
4720: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68  ;.  if( db->nSch
4730: 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  emaLock==0 ){.  
4740: 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73    sqlite3Collaps
4750: 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64  eDatabaseArray(d
4760: 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  b);.  }.}../*.**
4770: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4780: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   called when a c
4790: 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f  ommit occurs..*/
47a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
47b0: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
47c0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
47d0: 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20  .  db->mDbFlags 
47e0: 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63 68 65 6d  &= ~DBFLAG_Schem
47f0: 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  aChange;.}../*.*
4800: 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20  * Delete memory 
4810: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
4820: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f  e column names o
4830: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
4840: 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e  w (the.** Table.
4850: 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a  aCol[] array)..*
4860: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
4870: 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
4880: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
4890: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69  le *pTable){.  i
48a0: 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  nt i;.  Column *
48b0: 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  pCol;.  assert( 
48c0: 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69  pTable!=0 );.  i
48d0: 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c  f( (pCol = pTabl
48e0: 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20  e->aCol)!=0 ){. 
48f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
4900: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  able->nCol; i++,
4910: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
4920: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4930: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCol->zName);.
4940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
4950: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  rDelete(db, pCol
4960: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
4970: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4980: 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a  , pCol->zColl);.
4990: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
49a0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
49b0: 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d  le->aCol);.  }.}
49c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
49d0: 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73  he memory data s
49e0: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
49f0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
4a00: 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e  ven.** Table.  N
4a10: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
4a20: 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68  de to disk by th
4a30: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
4a40: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a  * This routine j
4a50: 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20  ust deletes the 
4a60: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20  data structure. 
4a70: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c   It does not unl
4a80: 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ink.** the table
4a90: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
4aa0: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
4ab0: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65  ble.  But it doe
4ac0: 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  s destroy.** mem
4ad0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
4ae0: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e  f the indices an
4af0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  d foreign keys a
4b00: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
4b10: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  ** the table..**
4b20: 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61 6d  .** The db param
4b30: 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61 6c  eter is optional
4b40: 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65 64 20  .  It is needed 
4b50: 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  if the Table obj
4b60: 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ect .** contains
4b70: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
4b80: 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65 63  y.  (Table objec
4b90: 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ts in the schema
4ba0: 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c   do not use.** l
4bb0: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2c  ookaside memory,
4bc0: 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d 65   but some epheme
4bd0: 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  ral Table object
4be0: 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a 2a  s do.)  Or the.*
4bf0: 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 63  * db parameter c
4c00: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
4c10: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
4c20: 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20   to measure the 
4c30: 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20 62  memory.** used b
4c40: 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  y the Table obje
4c50: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
4c60: 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  id SQLITE_NOINLI
4c70: 4e 45 20 64 65 6c 65 74 65 54 61 62 6c 65 28 73  NE deleteTable(s
4c80: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
4c90: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e  e *pTable){.  In
4ca0: 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e  dex *pIndex, *pN
4cb0: 65 78 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ext;..#ifdef SQL
4cc0: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 52  ITE_DEBUG.  /* R
4cd0: 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
4ce0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
4cf0: 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61  lookaside alloca
4d00: 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d 61 20  tions in schema 
4d10: 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72 69 6f  Tables.  ** prio
4d20: 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 66  r to doing any f
4d30: 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 73  ree() operations
4d40: 2e 20 53 69 6e 63 65 20 73 63 68 65 6d 61 20 54  . Since schema T
4d50: 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 75 73 65  ables do not use
4d60: 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c  .  ** lookaside,
4d70: 20 74 68 69 73 20 6e 75 6d 62 65 72 20 73 68 6f   this number sho
4d80: 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20  uld not change. 
4d90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 6d 61  .  **.  ** If ma
4da0: 6c 6c 6f 63 20 68 61 73 20 61 6c 72 65 61 64 79  lloc has already
4db0: 20 66 61 69 6c 65 64 2c 20 69 74 20 6d 61 79 20   failed, it may 
4dc0: 62 65 20 74 68 61 74 20 69 74 20 66 61 69 6c 65  be that it faile
4dd0: 64 20 77 68 69 6c 65 20 61 6c 6c 6f 63 61 74 69  d while allocati
4de0: 6e 67 0a 20 20 2a 2a 20 61 20 54 61 62 6c 65 20  ng.  ** a Table 
4df0: 6f 62 6a 65 63 74 20 74 68 61 74 20 77 61 73 20  object that was 
4e00: 67 6f 69 6e 67 20 74 6f 20 62 65 20 6d 61 72 6b  going to be mark
4e10: 65 64 20 65 70 68 65 6d 65 72 61 6c 2e 20 53 6f  ed ephemeral. So
4e20: 20 64 6f 20 6e 6f 74 20 63 68 65 63 6b 0a 20 20   do not check.  
4e30: 2a 2a 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61  ** that no looka
4e40: 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 75  side memory is u
4e50: 73 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  sed in this case
4e60: 20 65 69 74 68 65 72 2e 20 2a 2f 0a 20 20 69 6e   either. */.  in
4e70: 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 30  t nLookaside = 0
4e80: 3b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 64  ;.  if( db && !d
4e90: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4ea0: 26 26 20 28 70 54 61 62 6c 65 2d 3e 74 61 62 46  && (pTable->tabF
4eb0: 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
4ec0: 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  ral)==0 ){.    n
4ed0: 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 73 71 6c 69  Lookaside = sqli
4ee0: 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64  te3LookasideUsed
4ef0: 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  (db, 0);.  }.#en
4f00: 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  dif..  /* Delete
4f10: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
4f20: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
4f30: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f  s table. */.  fo
4f40: 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c  r(pIndex = pTabl
4f50: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  e->pIndex; pInde
4f60: 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29  x; pIndex=pNext)
4f70: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
4f80: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
4f90: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
4fa0: 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65  >pSchema==pTable
4fb0: 2d 3e 70 53 63 68 65 6d 61 0a 20 20 20 20 20 20  ->pSchema.      
4fc0: 20 20 20 7c 7c 20 28 49 73 56 69 72 74 75 61 6c     || (IsVirtual
4fd0: 28 70 54 61 62 6c 65 29 20 26 26 20 70 49 6e 64  (pTable) && pInd
4fe0: 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c  ex->idxType!=SQL
4ff0: 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
5000: 45 46 29 20 29 3b 0a 20 20 20 20 69 66 28 20 28  EF) );.    if( (
5010: 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42  db==0 || db->pnB
5020: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
5030: 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
5040: 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  le) ){.      cha
5050: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65  r *zName = pInde
5060: 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20  x->zName; .     
5070: 20 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65   TESTONLY ( Inde
5080: 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69  x *pOld = ) sqli
5090: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 0a 20  te3HashInsert(. 
50a0: 20 20 20 20 20 20 20 20 26 70 49 6e 64 65 78 2d          &pIndex-
50b0: 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
50c0: 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20  h, zName, 0.    
50d0: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
50e0: 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69  t( db==0 || sqli
50f0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
5100: 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78  ld(db, 0, pIndex
5110: 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
5120: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64      assert( pOld
5130: 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64  ==pIndex || pOld
5140: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
5150: 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65   sqlite3FreeInde
5160: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
5170: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
5180: 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  any foreign keys
5190: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 69   attached to thi
51a0: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71  s table. */.  sq
51b0: 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62  lite3FkDelete(db
51c0: 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a  , pTable);..  /*
51d0: 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c   Delete the Tabl
51e0: 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  e structure itse
51f0: 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  lf..  */.  sqlit
5200: 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61  e3DeleteColumnNa
5210: 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  mes(db, pTable);
5220: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
5230: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  (db, pTable->zNa
5240: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
5250: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  Free(db, pTable-
5260: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
5270: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
5280: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65  (db, pTable->pSe
5290: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
52a0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
52b0: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  b, pTable->pChec
52c0: 6b 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  k);.#ifndef SQLI
52d0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
52e0: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74  ABLE.  sqlite3Vt
52f0: 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62  abClear(db, pTab
5300: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  le);.#endif.  sq
5310: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5320: 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56  pTable);..  /* V
5330: 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f  erify that no lo
5340: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 77  okaside memory w
5350: 61 73 20 75 73 65 64 20 62 79 20 73 63 68 65 6d  as used by schem
5360: 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73  a tables */.  as
5370: 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65  sert( nLookaside
5380: 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64  ==0 || nLookasid
5390: 65 3d 3d 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73  e==sqlite3Lookas
53a0: 69 64 65 55 73 65 64 28 64 62 2c 30 29 20 29 3b  ideUsed(db,0) );
53b0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  .}.void sqlite3D
53c0: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
53d0: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
53e0: 54 61 62 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20  Table){.  /* Do 
53f0: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74  not delete the t
5400: 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72  able until the r
5410: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
5420: 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a  eaches zero. */.
5430: 20 20 69 66 28 20 21 70 54 61 62 6c 65 20 29 20    if( !pTable ) 
5440: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 28  return;.  if( ((
5450: 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  !db || db->pnByt
5460: 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20 28  esFreed==0) && (
5470: 2d 2d 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65  --pTable->nTabRe
5480: 66 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  f)>0) ) return;.
5490: 20 20 64 65 6c 65 74 65 54 61 62 6c 65 28 64 62    deleteTable(db
54a0: 2c 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f  , pTable);.}.../
54b0: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20  *.** Unlink the 
54c0: 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d  given table from
54d0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73   the hash tables
54e0: 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20   and the delete 
54f0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72  the.** table str
5500: 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20  ucture with all 
5510: 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20  its indices and 
5520: 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f  foreign keys..*/
5530: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c  .void sqlite3Unl
5540: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c  inkAndDeleteTabl
5550: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  e(sqlite3 *db, i
5560: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68  nt iDb, const ch
5570: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20  ar *zTabName){. 
5580: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20   Table *p;.  Db 
5590: 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
55a0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
55b0: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
55c0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
55d0: 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20  ssert( zTabName 
55e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
55f0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
5600: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
5610: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 7a  );.  testcase( z
5620: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b  TabName[0]==0 );
5630: 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68    /* Zero-length
5640: 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65   table names are
5650: 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44   allowed */.  pD
5660: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
5670: 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ];.  p = sqlite3
5680: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
5690: 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
56a0: 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b  h, zTabName, 0);
56b0: 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  .  sqlite3Delete
56c0: 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20  Table(db, p);.  
56d0: 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20  db->mDbFlags |= 
56e0: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61  DBFLAG_SchemaCha
56f0: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  nge;.}../*.** Gi
5700: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74  ven a token, ret
5710: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
5720: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  t consists of th
5730: 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a  e text of that.*
5740: 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20  * token.  Space 
5750: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
5760: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
5770: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
5780: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
5790: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
57a0: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
57b0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  ** function..**.
57c0: 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e  ** Any quotation
57d0: 20 6d 61 72 6b 73 20 28 65 78 3a 20 20 22 6e 61   marks (ex:  "na
57e0: 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61  me", 'name', [na
57f0: 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20  me], or `name`) 
5800: 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64  that.** surround
5810: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
5820: 20 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76   token are remov
5830: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73  ed..**.** Tokens
5840: 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20   are often just 
5850: 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68  pointers into th
5860: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74  e original SQL t
5870: 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72  ext and so.** ar
5880: 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69  e not \000 termi
5890: 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f  nated and are no
58a0: 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54  t persistent.  T
58b0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
58c0: 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65  ng.** is \000 te
58d0: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20  rminated and is 
58e0: 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63  persistent..*/.c
58f0: 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65  har *sqlite3Name
5900: 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65  FromToken(sqlite
5910: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
5920: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
5930: 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  ame;.  if( pName
5940: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
5950: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
5960: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d  (db, (char*)pNam
5970: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
5980: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
5990: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  ote(zName);.  }e
59a0: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  lse{.    zName =
59b0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
59c0: 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zName;.}../*.**
59d0: 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   Open the sqlite
59e0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74  _master table st
59f0: 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65  ored in database
5a00: 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a   number iDb for.
5a10: 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20  ** writing. The 
5a20: 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  table is opened 
5a30: 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a  using cursor 0..
5a40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f  */.void sqlite3O
5a50: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50  penMasterTable(P
5a60: 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62  arse *p, int iDb
5a70: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
5a80: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29  qlite3GetVdbe(p)
5a90: 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  ;.  sqlite3Table
5aa0: 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53  Lock(p, iDb, MAS
5ab0: 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53  TER_ROOT, 1, MAS
5ac0: 54 45 52 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c  TER_NAME);.  sql
5ad0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
5ae0: 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  t(v, OP_OpenWrit
5af0: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
5b00: 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66  T, iDb, 5);.  if
5b10: 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a  ( p->nTab==0 ){.
5b20: 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b      p->nTab = 1;
5b30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  .  }.}../*.** Pa
5b40: 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f  rameter zName po
5b50: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65  ints to a nul-te
5b60: 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20  rminated buffer 
5b70: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
5b80: 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61  ame.** of a data
5b90: 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  base ("main", "t
5ba0: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
5bb0: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
5bc0: 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  db). This.** fun
5bd0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
5be0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
5bf0: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
5c00: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a   db->aDb[], or.*
5c10: 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  * -1 if the name
5c20: 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66  d db cannot be f
5c30: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
5c40: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73  ite3FindDbName(s
5c50: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
5c60: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
5c70: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20    int i = -1;   
5c80: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5c90: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66  e number */.  if
5ca0: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44  ( zName ){.    D
5cb0: 62 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f 72 28  b *pDb;.    for(
5cc0: 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70  i=(db->nDb-1), p
5cd0: 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20  Db=&db->aDb[i]; 
5ce0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d  i>=0; i--, pDb--
5cf0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
5d00: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
5d10: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a  pDb->zDbSName, z
5d20: 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20  Name) ) break;. 
5d30: 20 20 20 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69       /* "main" i
5d40: 73 20 61 6c 77 61 79 73 20 61 6e 20 61 63 63 65  s always an acce
5d50: 70 74 61 62 6c 65 20 61 6c 69 61 73 20 66 6f 72  ptable alias for
5d60: 20 74 68 65 20 70 72 69 6d 61 72 79 20 64 61 74   the primary dat
5d70: 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 65  abase.      ** e
5d80: 76 65 6e 20 69 66 20 69 74 20 68 61 73 20 62 65  ven if it has be
5d90: 65 6e 20 72 65 6e 61 6d 65 64 20 75 73 69 6e 67  en renamed using
5da0: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
5db0: 5f 4d 41 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a  _MAINDBNAME. */.
5dc0: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 26        if( i==0 &
5dd0: 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  & 0==sqlite3_str
5de0: 69 63 6d 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61  icmp("main", zNa
5df0: 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  me) ) break;.   
5e00: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5e10: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  i;.}../*.** The 
5e20: 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e  token *pName con
5e30: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
5e40: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69  f a database (ei
5e50: 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a  ther "main" or.*
5e60: 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  * "temp" or the 
5e70: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
5e80: 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f  hed db). This ro
5e90: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
5ea0: 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68  e.** index of th
5eb0: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
5ec0: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
5ed0: 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  r -1 if the name
5ee0: 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d db .** does no
5ef0: 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  t exist..*/.int 
5f00: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71  sqlite3FindDb(sq
5f10: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
5f20: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *pName){.  int 
5f30: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f50: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
5f60: 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ber */.  char *z
5f70: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
5f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5f90: 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61   Name we are sea
5fa0: 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  rching for */.  
5fb0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
5fc0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
5fd0: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73   pName);.  i = s
5fe0: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
5ff0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73  (db, zName);.  s
6000: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
6010: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
6020: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74  n i;.}../* The t
6030: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20  able or view or 
6040: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20  trigger name is 
6050: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
6060: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
6070: 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20  s.** pName1 and 
6080: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
6090: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
60a0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
60b0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
60c0: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
60d0: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a  xx.yyy (...);.**
60e0: 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31   .** Then pName1
60f0: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
6100: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
6110: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
6120: 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74  hand if.** the t
6130: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
6140: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
6150: 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52  , i.e.:.**.** CR
6160: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
6170: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ..);.**.** Then 
6180: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
6190: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
61a0: 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54  2 is ""..**.** T
61b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
61c0: 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70   the *ppUnqual p
61d0: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
61e0: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
61f0: 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65  ame1 or.** pName
6200: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
6210: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
6220: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
6230: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
6240: 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69  database "xxx" i
6250: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
6260: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
6270: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
6280: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
6290: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
62a0: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
62b0: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
62c0: 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20  pName1,      /* 
62d0: 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65  The "xxx" in the
62e0: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
62f0: 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f  or "xxx" */.  To
6300: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
6310: 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69    /* The "yyy" i
6320: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
6330: 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  yyy" */.  Token 
6340: 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a  **pUnqual     /*
6350: 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61   Write the unqua
6360: 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61  lified object na
6370: 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  me here */.){.  
6380: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
6390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
63a0: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
63b0: 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
63c0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
63d0: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73  arse->db;..  ass
63e0: 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 29  ert( pName2!=0 )
63f0: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e  ;.  if( pName2->
6400: 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  n>0 ){.    if( d
6410: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b  b->init.busy ) {
6420: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
6430: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6440: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
6450: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
6460: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a   -1;.    }.    *
6470: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32  pUnqual = pName2
6480: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
6490: 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e  te3FindDb(db, pN
64a0: 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69  ame1);.    if( i
64b0: 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  Db<0 ){.      sq
64c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
64d0: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  arse, "unknown d
64e0: 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61  atabase %T", pNa
64f0: 6d 65 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75  me1);.      retu
6500: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn -1;.    }.  }
6510: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
6520: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
6530: 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75  0 || db->init.bu
6540: 73 79 20 7c 7c 20 49 4e 5f 52 45 4e 41 4d 45 5f  sy || IN_RENAME_
6550: 4f 42 4a 45 43 54 0a 20 20 20 20 20 20 20 20 20  OBJECT.         
6560: 20 20 20 20 7c 7c 20 28 64 62 2d 3e 6d 44 62 46      || (db->mDbF
6570: 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f 56 61  lags & DBFLAG_Va
6580: 63 75 75 6d 29 21 3d 30 29 3b 0a 20 20 20 20 69  cuum)!=0);.    i
6590: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
65a0: 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  b;.    *pUnqual 
65b0: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20  = pName1;.  }.  
65c0: 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f  return iDb;.}../
65d0: 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 50 52 41  *.** True if PRA
65e0: 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
65f0: 65 6d 61 20 69 73 20 4f 4e 0a 2a 2f 0a 69 6e 74  ema is ON.*/.int
6600: 20 73 71 6c 69 74 65 33 57 72 69 74 61 62 6c 65   sqlite3Writable
6610: 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a  Schema(sqlite3 *
6620: 64 62 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  db){.  testcase(
6630: 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c   (db->flags&(SQL
6640: 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c  ITE_WriteSchema|
6650: 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65  SQLITE_Defensive
6660: 29 29 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  ))==0 );.  testc
6670: 61 73 65 28 20 28 64 62 2d 3e 66 6c 61 67 73 26  ase( (db->flags&
6680: 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68  (SQLITE_WriteSch
6690: 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e  ema|SQLITE_Defen
66a0: 73 69 76 65 29 29 3d 3d 0a 20 20 20 20 20 20 20  sive))==.       
66b0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57          SQLITE_W
66c0: 72 69 74 65 53 63 68 65 6d 61 20 29 3b 0a 20 20  riteSchema );.  
66d0: 74 65 73 74 63 61 73 65 28 20 28 64 62 2d 3e 66  testcase( (db->f
66e0: 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72 69  lags&(SQLITE_Wri
66f0: 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f  teSchema|SQLITE_
6700: 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20  Defensive))==.  
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
6720: 49 54 45 5f 44 65 66 65 6e 73 69 76 65 20 29 3b  ITE_Defensive );
6730: 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 64 62  .  testcase( (db
6740: 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f  ->flags&(SQLITE_
6750: 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49  WriteSchema|SQLI
6760: 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d  TE_Defensive))==
6770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6780: 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68  (SQLITE_WriteSch
6790: 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e  ema|SQLITE_Defen
67a0: 73 69 76 65 29 20 29 3b 0a 20 20 72 65 74 75 72  sive) );.  retur
67b0: 6e 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51  n (db->flags&(SQ
67c0: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
67d0: 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76  |SQLITE_Defensiv
67e0: 65 29 29 3d 3d 53 51 4c 49 54 45 5f 57 72 69 74  e))==SQLITE_Writ
67f0: 65 53 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  eSchema;.}../*.*
6800: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
6810: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
6820: 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72  if the UTF-8 str
6830: 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c  ing zName is a l
6840: 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66  egal.** unqualif
6850: 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ied name for a n
6860: 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  ew schema object
6870: 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20   (table, index, 
6880: 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67  view or.** trigg
6890: 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61  er). All names a
68a0: 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20  re legal except 
68b0: 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e  those that begin
68c0: 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67   with the string
68d0: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69  .** "sqlite_" (i
68e0: 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f  n upper, lower o
68f0: 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54  r mixed case). T
6900: 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  his portion of t
6910: 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20  he namespace.** 
6920: 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  is reserved for 
6930: 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2a  internal use..**
6940: 0a 2a 2a 20 57 68 65 6e 20 70 61 72 73 69 6e 67  .** When parsing
6950: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
6960: 65 72 20 74 61 62 6c 65 2c 20 74 68 69 73 20 72  er table, this r
6970: 6f 75 74 69 6e 65 20 61 6c 73 6f 20 63 68 65 63  outine also chec
6980: 6b 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75  ks to.** make su
6990: 72 65 20 74 68 65 20 22 74 79 70 65 22 2c 20 22  re the "type", "
69a0: 6e 61 6d 65 22 2c 20 61 6e 64 20 22 74 62 6c 5f  name", and "tbl_
69b0: 6e 61 6d 65 22 20 63 6f 6c 75 6d 6e 73 20 61 72  name" columns ar
69c0: 65 20 63 6f 6e 73 69 73 74 65 6e 74 0a 2a 2a 20  e consistent.** 
69d0: 77 69 74 68 20 74 68 65 20 53 51 4c 2e 0a 2a 2f  with the SQL..*/
69e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
69f0: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 0a 20 20 50  kObjectName(.  P
6a00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
6a20: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
6a30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
6a40: 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  me,        /* Na
6a50: 6d 65 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74  me of the object
6a60: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 63   to check */.  c
6a70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
6a80: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65  ,        /* Type
6a90: 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20   of this object 
6aa0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
6ab0: 2a 7a 54 62 6c 4e 61 6d 65 20 20 20 20 20 20 2f  *zTblName      /
6ac0: 2a 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20 6e  * Parent table n
6ad0: 61 6d 65 20 66 6f 72 20 74 72 69 67 67 65 72 73  ame for triggers
6ae0: 20 61 6e 64 20 69 6e 64 65 78 65 73 20 2a 2f 0a   and indexes */.
6af0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
6b00: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
6b10: 20 69 66 28 20 73 71 6c 69 74 65 33 57 72 69 74   if( sqlite3Writ
6b20: 61 62 6c 65 53 63 68 65 6d 61 28 64 62 29 20 7c  ableSchema(db) |
6b30: 7c 20 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73  | db->init.impos
6b40: 74 65 72 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  terTable ){.    
6b50: 2f 2a 20 53 6b 69 70 20 74 68 65 73 65 20 65 72  /* Skip these er
6b60: 72 6f 72 20 63 68 65 63 6b 73 20 66 6f 72 20 77  ror checks for w
6b70: 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
6b80: 4e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  N */.    return 
6b90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
6ba0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
6bb0: 73 79 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  sy ){.    if( sq
6bc0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
6bd0: 79 70 65 2c 20 64 62 2d 3e 69 6e 69 74 2e 61 7a  ype, db->init.az
6be0: 49 6e 69 74 5b 30 5d 29 0a 20 20 20 20 20 7c 7c  Init[0]).     ||
6bf0: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
6c00: 28 7a 4e 61 6d 65 2c 20 64 62 2d 3e 69 6e 69 74  (zName, db->init
6c10: 2e 61 7a 49 6e 69 74 5b 31 5d 29 0a 20 20 20 20  .azInit[1]).    
6c20: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69   || sqlite3_stri
6c30: 63 6d 70 28 7a 54 62 6c 4e 61 6d 65 2c 20 64 62  cmp(zTblName, db
6c40: 2d 3e 69 6e 69 74 2e 61 7a 49 6e 69 74 5b 32 5d  ->init.azInit[2]
6c50: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  ).    ){.      i
6c60: 66 28 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67  f( sqlite3Config
6c70: 2e 62 45 78 74 72 61 53 63 68 65 6d 61 43 68 65  .bExtraSchemaChe
6c80: 63 6b 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  cks ){.        s
6c90: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6ca0: 50 61 72 73 65 2c 20 22 22 29 3b 20 2f 2a 20 63  Parse, ""); /* c
6cb0: 6f 72 72 75 70 74 53 63 68 65 6d 61 28 29 20 77  orruptSchema() w
6cc0: 69 6c 6c 20 73 75 70 70 6c 79 20 74 68 65 20 65  ill supply the e
6cd0: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
6ce0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
6cf0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
6d00: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
6d10: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  if( pParse->nest
6d20: 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 30  ed==0 .     && 0
6d30: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
6d40: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
6d50: 5f 22 2c 20 37 29 0a 20 20 20 20 29 7b 0a 20 20  _", 7).    ){.  
6d60: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6d70: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a  Msg(pParse, "obj
6d80: 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65  ect name reserve
6d90: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
6da0: 73 65 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20  se: %s",.       
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
6dc0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
6dd0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
6de0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
6df0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6e00: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
6e10: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
6e20: 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62 6c 65  index of a table
6e30: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
6e40: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
6e50: 78 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  x(Table *pTab){.
6e60: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 66 6f    Index *p;.  fo
6e70: 72 28 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  r(p=pTab->pIndex
6e80: 3b 20 70 20 26 26 20 21 49 73 50 72 69 6d 61 72  ; p && !IsPrimar
6e90: 79 4b 65 79 49 6e 64 65 78 28 70 29 3b 20 70 3d  yKeyIndex(p); p=
6ea0: 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 72 65  p->pNext){}.  re
6eb0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
6ec0: 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6c 75   Return the colu
6ed0: 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78  mn of index pIdx
6ee0: 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
6ef0: 73 20 74 6f 20 74 61 62 6c 65 0a 2a 2a 20 63 6f  s to table.** co
6f00: 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20 52 65 74 75  lumn iCol.  Retu
6f10: 72 6e 20 2d 31 20 69 66 20 6e 6f 74 20 66 6f 75  rn -1 if not fou
6f20: 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c 69 74  nd..*/.i16 sqlit
6f30: 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
6f40: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 31 36  Index *pIdx, i16
6f50: 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b   iCol){.  int i;
6f60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
6f70: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
6f80: 29 7b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d  ){.    if( iCol=
6f90: 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
6fa0: 69 5d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  i] ) return i;. 
6fb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
6fc0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
6fd0: 45 5f 4f 4d 49 54 5f 47 45 4e 45 52 41 54 45 44  E_OMIT_GENERATED
6fe0: 5f 43 4f 4c 55 4d 4e 53 0a 2f 2a 0a 2a 2a 20 4f  _COLUMNS./*.** O
6ff0: 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  f the iCol-th co
7000: 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 70 54  lumn in table pT
7010: 61 62 2c 20 72 65 74 75 72 6e 20 74 68 65 20 69  ab, return the i
7020: 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 6f 6c  ndex of that col
7030: 75 6d 6e 0a 2a 2a 20 61 73 20 73 74 6f 72 65 64  umn.** as stored
7040: 20 6f 6e 20 64 69 73 6b 2e 20 20 55 73 75 61 6c   on disk.  Usual
7050: 6c 79 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  ly the return va
7060: 6c 75 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  lue is the same 
7070: 61 73 20 74 68 65 20 69 43 6f 6c 0a 2a 2a 20 69  as the iCol.** i
7080: 6e 70 75 74 2c 20 68 6f 77 65 76 65 72 20 74 68  nput, however th
7090: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d  e return value m
70a0: 61 79 20 62 65 20 6c 65 73 73 20 74 68 65 72 65  ay be less there
70b0: 20 61 72 65 20 70 72 69 6f 72 20 56 49 52 54 55   are prior VIRTU
70c0: 41 4c 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  AL.** columns..*
70d0: 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f  *.** If SQLITE_O
70e0: 4d 49 54 5f 47 45 4e 45 52 41 54 45 44 5f 43 4f  MIT_GENERATED_CO
70f0: 4c 55 4d 4e 53 2c 20 74 68 69 73 20 72 6f 75 74  LUMNS, this rout
7100: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6d  ine is a no-op m
7110: 61 63 72 6f 0a 2a 2f 0a 69 31 36 20 73 71 6c 69  acro.*/.i16 sqli
7120: 74 65 33 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  te3ColumnOfTable
7130: 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69 31  (Table *pTab, i1
7140: 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69  6 iCol){.  int i
7150: 3b 0a 20 20 69 31 36 20 6e 3b 0a 20 20 61 73 73  ;.  i16 n;.  ass
7160: 65 72 74 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  ert( iCol<pTab->
7170: 6e 43 6f 6c 20 29 3b 0a 20 20 69 66 28 20 28 70  nCol );.  if( (p
7180: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
7190: 54 46 5f 48 61 73 56 69 72 74 75 61 6c 29 3d 3d  TF_HasVirtual)==
71a0: 30 20 29 20 72 65 74 75 72 6e 20 69 43 6f 6c 3b  0 ) return iCol;
71b0: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6e 3d 30 3b  .  for(i=0, n=0;
71c0: 20 69 3c 69 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<iCol; i++){. 
71d0: 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 61 43     if( (pTab->aC
71e0: 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26  ol[i].colFlags &
71f0: 20 43 4f 4c 46 4c 41 47 5f 56 49 52 54 55 41 4c   COLFLAG_VIRTUAL
7200: 29 3d 3d 30 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a  )==0 ) n++;.  }.
7210: 20 20 72 65 74 75 72 6e 20 6e 3b 20 20 20 20 0a    return n;    .
7220: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
7230: 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69  Begin constructi
7240: 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72  ng a new table r
7250: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e  epresentation in
7260: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
7270: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f  s.** the first o
7280: 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e  f several action
7290: 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67   routines that g
72a0: 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73  et called in res
72b0: 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52  ponse.** to a CR
72c0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
72d0: 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63  ment.  In partic
72e0: 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69  ular, this routi
72f0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  ne is called.** 
7300: 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b  after seeing tok
7310: 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64  ens "CREATE" and
7320: 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65   "TABLE" and the
7330: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65   table name. The
7340: 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20   isTemp.** flag 
7350: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74  is true if the t
7360: 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73  able should be s
7370: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78  tored in the aux
7380: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a  iliary database.
7390: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
73a0: 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  of in the main d
73b0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
73c0: 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
73d0: 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e  the case.** when
73e0: 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22   the "TEMP" or "
73f0: 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f  TEMPORARY" keywo
7400: 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  rd occurs in bet
7410: 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61  ween.** CREATE a
7420: 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  nd TABLE..**.** 
7430: 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65  The new table re
7440: 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69  cord is initiali
7450: 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70  zed and put in p
7460: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
7470: 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20  ..** As more of 
7480: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
7490: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
74a0: 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c  rsed, additional
74b0: 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69   action.** routi
74c0: 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  nes will be call
74d0: 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69  ed to add more i
74e0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
74f0: 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74  is record..** At
7500: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
7510: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
7520: 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69  tement, the sqli
7530: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f  te3EndTable() ro
7540: 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
7550: 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  ed to complete t
7560: 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  he construction 
7570: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
7580: 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64   record..*/.void
7590: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
75a0: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
75b0: 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72  rse,   /* Parser
75c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
75d0: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f  ken *pName1,   /
75e0: 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20  * First part of 
75f0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
7600: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
7610: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
7620: 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61  ,   /* Second pa
7630: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
7640: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
7650: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
7660: 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  emp,      /* Tru
7670: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 54  e if this is a T
7680: 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  EMP table */.  i
7690: 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20  nt isView,      
76a0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
76b0: 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69  is a VIEW */.  i
76c0: 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20  nt isVirtual,   
76d0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
76e0: 69 73 20 61 20 56 49 52 54 55 41 4c 20 74 61 62  is a VIRTUAL tab
76f0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72  le */.  int noEr
7700: 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  r        /* Do n
7710: 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20  othing if table 
7720: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
7730: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
7740: 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  able;.  char *zN
7750: 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20  ame = 0; /* The 
7760: 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20  name of the new 
7770: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
7780: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
7790: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  >db;.  Vdbe *v;.
77a0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
77b0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
77c0: 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20  umber to create 
77d0: 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a  the table in */.
77e0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20    Token *pName; 
77f0: 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
7800: 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  d name of the ta
7810: 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  ble to create */
7820: 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  ..  if( db->init
7830: 2e 62 75 73 79 20 26 26 20 64 62 2d 3e 69 6e 69  .busy && db->ini
7840: 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31 20 29 7b 0a  t.newTnum==1 ){.
7850: 20 20 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63      /* Special c
7860: 61 73 65 3a 20 20 50 61 72 73 69 6e 67 20 74 68  ase:  Parsing th
7870: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
7880: 6f 72 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  or sqlite_temp_m
7890: 61 73 74 65 72 20 73 63 68 65 6d 61 20 2a 2f 0a  aster schema */.
78a0: 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e      iDb = db->in
78b0: 69 74 2e 69 44 62 3b 0a 20 20 20 20 7a 4e 61 6d  it.iDb;.    zNam
78c0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
78d0: 44 75 70 28 64 62 2c 20 53 43 48 45 4d 41 5f 54  Dup(db, SCHEMA_T
78e0: 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 20 20  ABLE(iDb));.    
78f0: 70 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 31 3b 0a  pName = pName1;.
7900: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
7910: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
7920: 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  */.    iDb = sql
7930: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
7940: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
7950: 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
7960: 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29  .    if( iDb<0 )
7970: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28   return;.    if(
7980: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
7990: 20 69 73 54 65 6d 70 20 26 26 20 70 4e 61 6d 65   isTemp && pName
79a0: 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21 3d 31  2->n>0 && iDb!=1
79b0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
79c0: 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20  creating a temp 
79d0: 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20  table, the name 
79e0: 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69  may not be quali
79f0: 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20 20  fied. Unless .  
7a00: 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
7a10: 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74 65 6d  ase name is "tem
7a20: 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a 20  p" anyway.  */. 
7a30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7a40: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65  rMsg(pParse, "te
7a50: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61  mporary table na
7a60: 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61  me must be unqua
7a70: 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20  lified");.      
7a80: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
7a90: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
7aa0: 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 20 69  DB && isTemp ) i
7ab0: 44 62 20 3d 20 31 3b 0a 20 20 20 20 7a 4e 61 6d  Db = 1;.    zNam
7ac0: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
7ad0: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
7ae0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 49 4e 5f  me);.    if( IN_
7af0: 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
7b00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
7b10: 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61  nameTokenMap(pPa
7b20: 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a 4e 61 6d  rse, (void*)zNam
7b30: 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, pName);.    }
7b40: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 73  .  }.  pParse->s
7b50: 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61  NameToken = *pNa
7b60: 6d 65 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  me;.  if( zName=
7b70: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
7b80: 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  f( sqlite3CheckO
7b90: 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
7ba0: 2c 20 7a 4e 61 6d 65 2c 20 69 73 56 69 65 77 3f  , zName, isView?
7bb0: 22 76 69 65 77 22 3a 22 74 61 62 6c 65 22 2c 20  "view":"table", 
7bc0: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f  zName) ){.    go
7bd0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7be0: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rror;.  }.  if( 
7bf0: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20  db->init.iDb==1 
7c00: 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69  ) isTemp = 1;.#i
7c10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7c20: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
7c30: 20 20 61 73 73 65 72 74 28 20 69 73 54 65 6d 70    assert( isTemp
7c40: 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d 31  ==0 || isTemp==1
7c50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
7c60: 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65  View==0 || isVie
7c70: 77 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20 20  w==1 );.  {.    
7c80: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
7c90: 61 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  aCode[] = {.    
7ca0: 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45     SQLITE_CREATE
7cb0: 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53  _TABLE,.       S
7cc0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
7cd0: 50 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20  P_TABLE,.       
7ce0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
7cf0: 45 57 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54  EW,.       SQLIT
7d00: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49  E_CREATE_TEMP_VI
7d10: 45 57 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68  EW.    };.    ch
7d20: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
7d30: 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
7d40: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
7d50: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
7d60: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
7d70: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73   SCHEMA_TABLE(is
7d80: 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29  Temp), 0, zDb) )
7d90: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  {.      goto beg
7da0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
7db0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69      }.    if( !i
7dc0: 73 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69  sVirtual && sqli
7dd0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
7de0: 72 73 65 2c 20 28 69 6e 74 29 61 43 6f 64 65 5b  rse, (int)aCode[
7df0: 69 73 54 65 6d 70 2b 32 2a 69 73 56 69 65 77 5d  isTemp+2*isView]
7e00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e20: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20           zName, 
7e30: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
7e40: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
7e50: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
7e60: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
7e70: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
7e80: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
7e90: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
7ea0: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
7eb0: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
7ec0: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
7ed0: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
7ee0: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
7ef0: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
7f00: 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70   does. The excep
7f10: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73  tion is if the s
7f20: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
7f30: 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64  arsed was passed
7f40: 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69  .  ** to an sqli
7f50: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
7f60: 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74  () call. In that
7f70: 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63   case only the c
7f80: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a  olumn names.  **
7f90: 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20   and types will 
7fa0: 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72  be used, so ther
7fb0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
7fc0: 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61  test for namespa
7fd0: 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f  ce.  ** collisio
7fe0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
7ff0: 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45  IN_SPECIAL_PARSE
8000: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44   ){.    char *zD
8010: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
8020: 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69  .zDbSName;.    i
8030: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
8040: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
8050: 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20  pParse) ){.     
8060: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
8070: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
8080: 20 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69     pTable = sqli
8090: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
80a0: 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20   zName, zDb);.  
80b0: 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a    if( pTable ){.
80c0: 20 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72        if( !noErr
80d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
80e0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
80f0: 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c  se, "table %T al
8100: 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70  ready exists", p
8110: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Name);.      }el
8120: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
8130: 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
8140: 73 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  sy || CORRUPT_DB
8150: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
8160: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
8170: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
8180: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8190: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
81a0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
81b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
81c0: 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
81d0: 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20  , zDb)!=0 ){.   
81e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
81f0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
8200: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
8210: 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c  index named %s",
8220: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67   zName);.      g
8230: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
8240: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  error;.    }.  }
8250: 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  ..  pTable = sql
8260: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
8270: 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
8280: 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  e));.  if( pTabl
8290: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  e==0 ){.    asse
82a0: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
82b0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 50 61 72  iled );.    pPar
82c0: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
82d0: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
82e0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
82f0: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
8300: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
8310: 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20    pTable->zName 
8320: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c  = zName;.  pTabl
8330: 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  e->iPKey = -1;. 
8340: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
8350: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
8360: 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c  pSchema;.  pTabl
8370: 65 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a  e->nTabRef = 1;.
8380: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
8390: 46 41 55 4c 54 5f 52 4f 57 45 53 54 0a 20 20 70  FAULT_ROWEST.  p
83a0: 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73  Table->nRowLogEs
83b0: 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
83c0: 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  t(SQLITE_DEFAULT
83d0: 5f 52 4f 57 45 53 54 29 3b 0a 23 65 6c 73 65 0a  _ROWEST);.#else.
83e0: 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f    pTable->nRowLo
83f0: 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
8400: 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
8410: 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
8420: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
8430: 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  rt( pParse->pNew
8440: 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50  Table==0 );.  pP
8450: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
8460: 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20  = pTable;..  /* 
8470: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d  If this is the m
8480: 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75  agic sqlite_sequ
8490: 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20  ence table used 
84a0: 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  by autoincrement
84b0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f  ,.  ** then reco
84c0: 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rd a pointer to 
84d0: 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68  this table in th
84e0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
84f0: 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73  structure.  ** s
8500: 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61  o that INSERT ca
8510: 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65  n find the table
8520: 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69   easily..  */.#i
8530: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8540: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
8550: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e    if( !pParse->n
8560: 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28  ested && strcmp(
8570: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73  zName, "sqlite_s
8580: 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a  equence")==0 ){.
8590: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
85a0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
85b0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
85c0: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53  ;.    pTable->pS
85d0: 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d  chema->pSeqTab =
85e0: 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e   pTable;.  }.#en
85f0: 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  dif..  /* Begin 
8600: 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63  generating the c
8610: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
8620: 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72  sert the table r
8630: 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  ecord into.  ** 
8640: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
8650: 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69  R table.  Note i
8660: 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61  n particular tha
8670: 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65  t we must go ahe
8680: 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f  ad.  ** and allo
8690: 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20  cate the record 
86a0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
86b0: 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20  able entry now. 
86c0: 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   Before any.  **
86d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
86e0: 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20  UNIQUE keywords 
86f0: 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f  are parsed.  Tho
8700: 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c  se keywords will
8710: 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69   cause.  ** indi
8720: 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65  ces to be create
8730: 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  d and the table 
8740: 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65  record must come
8750: 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a   before the .  *
8760: 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63  * indices.  Henc
8770: 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  e, the record nu
8780: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
8790: 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  le must be alloc
87a0: 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20  ated.  ** now.. 
87b0: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
87c0: 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d  nit.busy && (v =
87d0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
87e0: 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20  pParse))!=0 ){. 
87f0: 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20     int addr1;.  
8800: 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74    int fileFormat
8810: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20  ;.    int reg1, 
8820: 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20  reg2, reg3;.    
8830: 2f 2a 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73 20  /* nullRow[] is 
8840: 61 6e 20 4f 50 5f 52 65 63 6f 72 64 20 65 6e 63  an OP_Record enc
8850: 6f 64 69 6e 67 20 6f 66 20 61 20 72 6f 77 20 63  oding of a row c
8860: 6f 6e 74 61 69 6e 69 6e 67 20 35 20 4e 55 4c 4c  ontaining 5 NULL
8870: 73 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20  s */.    static 
8880: 63 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c 52  const char nullR
8890: 6f 77 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c 20 30  ow[] = { 6, 0, 0
88a0: 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20  , 0, 0, 0 };.   
88b0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
88c0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
88d0: 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69  se, 1, iDb);..#i
88e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
88f0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
8900: 20 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c     if( isVirtual
8910: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8920: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
8930: 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d  P_VBegin);.    }
8940: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
8950: 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d  If the file form
8960: 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20  at and encoding 
8970: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
8980: 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65  have not been se
8990: 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  t, .    ** set t
89a0: 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a  hem now..    */.
89b0: 20 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73      reg1 = pPars
89c0: 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b  e->regRowid = ++
89d0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
89e0: 20 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d    reg2 = pParse-
89f0: 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61  >regRoot = ++pPa
8a00: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
8a10: 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  eg3 = ++pParse->
8a20: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
8a30: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8a40: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44  P_ReadCookie, iD
8a50: 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46  b, reg3, BTREE_F
8a60: 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20  ILE_FORMAT);.   
8a70: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
8a80: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
8a90: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
8aa0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
8ab0: 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 20 56 64  OP_If, reg3); Vd
8ac0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
8ad0: 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20     fileFormat = 
8ae0: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
8af0: 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d  ITE_LegacyFileFm
8b00: 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20  t)!=0 ?.        
8b10: 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53 51            1 : SQ
8b20: 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f  LITE_MAX_FILE_FO
8b30: 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65  RMAT;.    sqlite
8b40: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8b50: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
8b60: 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52  , BTREE_FILE_FOR
8b70: 4d 41 54 2c 20 66 69 6c 65 46 6f 72 6d 61 74 29  MAT, fileFormat)
8b80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8b90: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
8ba0: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54  tCookie, iDb, BT
8bb0: 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e  REE_TEXT_ENCODIN
8bc0: 47 2c 20 45 4e 43 28 64 62 29 29 3b 0a 20 20 20  G, ENC(db));.   
8bd0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
8be0: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
8bf0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73  .    /* This jus
8c00: 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63  t creates a plac
8c10: 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20  e-holder record 
8c20: 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  in the sqlite_ma
8c30: 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20  ster table..    
8c40: 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72  ** The record cr
8c50: 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63  eated does not c
8c60: 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20  ontain anything 
8c70: 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  yet.  It will be
8c80: 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a   replaced.    **
8c90: 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74   by the real ent
8ca0: 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72  ry in code gener
8cb0: 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45  ated at sqlite3E
8cc0: 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a  ndTable()..    *
8cd0: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  *.    ** The row
8ce0: 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65  id for the new e
8cf0: 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e 20  ntry is left in 
8d00: 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d  register pParse-
8d10: 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a  >regRowid..    *
8d20: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
8d30: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
8d40: 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74 20  w table is left 
8d50: 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e 72  in reg pParse->r
8d60: 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54  egRoot..    ** T
8d70: 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f  he rowid and roo
8d80: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61  t page number va
8d90: 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65 64 20  lues are needed 
8da0: 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  by the code that
8db0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45  .    ** sqlite3E
8dc0: 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e  ndTable will gen
8dd0: 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69  erate..    */.#i
8de0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
8df0: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
8e00: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8e10: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
8e20: 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69 65  E).    if( isVie
8e30: 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29  w || isVirtual )
8e40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8e50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8e60: 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32  Integer, 0, reg2
8e70: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
8e80: 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
8e90: 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61  pParse->addrCrTa
8ea0: 62 20 3d 0a 20 20 20 20 20 20 20 20 20 73 71 6c  b =.         sql
8eb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8ec0: 2c 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65  , OP_CreateBtree
8ed0: 2c 20 69 44 62 2c 20 72 65 67 32 2c 20 42 54 52  , iDb, reg2, BTR
8ee0: 45 45 5f 49 4e 54 4b 45 59 29 3b 0a 20 20 20 20  EE_INTKEY);.    
8ef0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  }.    sqlite3Ope
8f00: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61  nMasterTable(pPa
8f10: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  rse, iDb);.    s
8f20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8f30: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
8f40: 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73   0, reg1);.    s
8f50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
8f60: 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c 20  (v, OP_Blob, 6, 
8f70: 72 65 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f 77  reg3, 0, nullRow
8f80: 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
8f90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8fa0: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
8fb0: 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29  , 0, reg3, reg1)
8fc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8fd0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
8fe0: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
8ff0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9000: 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b  p0(v, OP_Close);
9010: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61  .  }..  /* Norma
9020: 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65  l (non-error) re
9030: 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72  turn. */.  retur
9040: 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  n;..  /* If an e
9050: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20  rror occurs, we 
9060: 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67  jump here */.beg
9070: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a  in_table_error:.
9080: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9090: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  db, zName);.  re
90a0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74 20  turn;.}../* Set 
90b0: 70 72 6f 70 65 72 74 69 65 73 20 6f 66 20 61 20  properties of a 
90c0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61 73  table column bas
90d0: 65 64 20 6f 6e 20 74 68 65 20 28 6d 61 67 69 63  ed on the (magic
90e0: 61 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74  al).** name of t
90f0: 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23 69  he column..*/.#i
9100: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
9110: 48 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a 76  HIDDEN_COLUMNS.v
9120: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  oid sqlite3Colum
9130: 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e  nPropertiesFromN
9140: 61 6d 65 28 54 61 62 6c 65 20 2a 70 54 61 62 2c  ame(Table *pTab,
9150: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a   Column *pCol){.
9160: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
9170: 72 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61  rnicmp(pCol->zNa
9180: 6d 65 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f 22  me, "__hidden__"
9190: 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 10)==0 ){.    
91a0: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
91b0: 3d 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e  = COLFLAG_HIDDEN
91c0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
91d0: 61 62 20 26 26 20 70 43 6f 6c 21 3d 70 54 61 62  ab && pCol!=pTab
91e0: 2d 3e 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c 5b  ->aCol && (pCol[
91f0: 2d 31 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43  -1].colFlags & C
9200: 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 29 20 29  OLFLAG_HIDDEN) )
9210: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46  {.    pTab->tabF
9220: 6c 61 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48 69  lags |= TF_OOOHi
9230: 64 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  dden;.  }.}.#end
9240: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  if.../*.** Add a
9250: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   new column to t
9260: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
9270: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
9280: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cted..**.** The 
9290: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
92a0: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66  s routine once f
92b0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64  or each column d
92c0: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e  eclaration.** in
92d0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
92e0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69  statement.  sqli
92f0: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20  te3StartTable() 
9300: 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66  gets called.** f
9310: 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e  irst to get thin
9320: 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20  gs going.  Then 
9330: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
9340: 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a  called for each.
9350: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f  ** column..*/.vo
9360: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
9370: 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  umn(Parse *pPars
9380: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  e, Token *pName,
9390: 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a   Token *pType){.
93a0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
93b0: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  t i;.  char *z;.
93c0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20    char *zType;. 
93d0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
93e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
93f0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
9400: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
9410: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
9420: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  turn;.  if( p->n
9430: 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74  Col+1>db->aLimit
9440: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
9450: 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c  LUMN] ){.    sql
9460: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
9470: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
9480: 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70  olumns on %s", p
9490: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
94a0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  turn;.  }.  z = 
94b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
94c0: 61 77 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e 20  aw(db, pName->n 
94d0: 2b 20 70 54 79 70 65 2d 3e 6e 20 2b 20 32 29 3b  + pType->n + 2);
94e0: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
94f0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 49 4e 5f 52  turn;.  if( IN_R
9500: 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 20 73  ENAME_OBJECT ) s
9510: 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
9520: 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f  nMap(pParse, (vo
9530: 69 64 2a 29 7a 2c 20 70 4e 61 6d 65 29 3b 0a 20  id*)z, pName);. 
9540: 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d 65   memcpy(z, pName
9550: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
9560: 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20 3d 20    z[pName->n] = 
9570: 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75  0;.  sqlite3Dequ
9580: 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69 3d  ote(z);.  for(i=
9590: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
95a0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
95b0: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c 20 70  te3_stricmp(z, p
95c0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
95d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
95e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
95f0: 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20  rse, "duplicate 
9600: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22  column name: %s"
9610: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , z);.      sqli
9620: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
9630: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
9640: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
9650: 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d  (p->nCol & 0x7)=
9660: 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e  =0 ){.    Column
9670: 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77   *aNew;.    aNew
9680: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
9690: 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28  loc(db,p->aCol,(
96a0: 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f  p->nCol+8)*sizeo
96b0: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
96c0: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
96d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
96e0: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
96f0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
9700: 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d   }.    p->aCol =
9710: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f   aNew;.  }.  pCo
9720: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
9730: 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCol];.  memset(
9740: 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCol, 0, sizeof(
9750: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
9760: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b  pCol->zName = z;
9770: 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  .  sqlite3Column
9780: 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61  PropertiesFromNa
9790: 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a 20 0a 20  me(p, pCol);. . 
97a0: 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d 30   if( pType->n==0
97b0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
97c0: 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73  ere is no type s
97d0: 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e  pecified, column
97e0: 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61 75  s have the defau
97f0: 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  lt affinity.    
9800: 2a 2a 20 27 42 4c 4f 42 27 20 77 69 74 68 20 61  ** 'BLOB' with a
9810: 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f 66   default size of
9820: 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20   4 bytes. */.   
9830: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
9840: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
9850: 42 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45  B;.    pCol->szE
9860: 73 74 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53  st = 1;.#ifdef S
9870: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
9880: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20  TER_REFERENCES. 
9890: 20 20 20 69 66 28 20 34 3e 3d 73 71 6c 69 74 65     if( 4>=sqlite
98a0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
98b0: 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20 20  SorterRef ){.   
98c0: 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67     pCol->colFlag
98d0: 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53 4f 52  s |= COLFLAG_SOR
98e0: 54 45 52 52 45 46 3b 0a 20 20 20 20 7d 0a 23 65  TERREF;.    }.#e
98f0: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
9900: 20 20 7a 54 79 70 65 20 3d 20 7a 20 2b 20 73 71    zType = z + sq
9910: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
9920: 20 2b 20 31 3b 0a 20 20 20 20 6d 65 6d 63 70 79   + 1;.    memcpy
9930: 28 7a 54 79 70 65 2c 20 70 54 79 70 65 2d 3e 7a  (zType, pType->z
9940: 2c 20 70 54 79 70 65 2d 3e 6e 29 3b 0a 20 20 20  , pType->n);.   
9950: 20 7a 54 79 70 65 5b 70 54 79 70 65 2d 3e 6e 5d   zType[pType->n]
9960: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
9970: 33 44 65 71 75 6f 74 65 28 7a 54 79 70 65 29 3b  3Dequote(zType);
9980: 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
9990: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66  ity = sqlite3Aff
99a0: 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c  inityType(zType,
99b0: 20 70 43 6f 6c 29 3b 0a 20 20 20 20 70 43 6f 6c   pCol);.    pCol
99c0: 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f  ->colFlags |= CO
99d0: 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20  LFLAG_HASTYPE;. 
99e0: 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a   }.  p->nCol++;.
99f0: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72    pParse->constr
9a00: 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b 0a  aintName.n = 0;.
9a10: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
9a20: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
9a30: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
9a40: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
9a50: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
9a60: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
9a70: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f  tatement.  A "NO
9a80: 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
9a90: 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73  nt has.** been s
9aa0: 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e  een on a column.
9ab0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
9ac0: 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20  ets the notNull 
9ad0: 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  flag on.** the c
9ae0: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
9af0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
9b00: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
9b10: 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61  te3AddNotNull(Pa
9b20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
9b30: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
9b40: 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20  le *p;.  Column 
9b50: 2a 70 43 6f 6c 3b 0a 20 20 70 20 3d 20 70 50 61  *pCol;.  p = pPa
9b60: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
9b70: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
9b80: 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29  VER(p->nCol<1) )
9b90: 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20   return;.  pCol 
9ba0: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43  = &p->aCol[p->nC
9bb0: 6f 6c 2d 31 5d 3b 0a 20 20 70 43 6f 6c 2d 3e 6e  ol-1];.  pCol->n
9bc0: 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45  otNull = (u8)onE
9bd0: 72 72 6f 72 3b 0a 20 20 70 2d 3e 74 61 62 46 6c  rror;.  p->tabFl
9be0: 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 4e 6f 74  ags |= TF_HasNot
9bf0: 4e 75 6c 6c 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  Null;..  /* Set 
9c00: 74 68 65 20 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  the uniqNotNull 
9c10: 66 6c 61 67 20 6f 6e 20 61 6e 79 20 55 4e 49 51  flag on any UNIQ
9c20: 55 45 20 6f 72 20 50 4b 20 69 6e 64 65 78 65 73  UE or PK indexes
9c30: 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64   already created
9c40: 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 63 6f  .  ** on this co
9c50: 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20  lumn.  */.  if( 
9c60: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26  pCol->colFlags &
9c70: 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45 20   COLFLAG_UNIQUE 
9c80: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
9c90: 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
9ca0: 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  =p->pIndex; pIdx
9cb0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
9cc0: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
9cd0: 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  t( pIdx->nKeyCol
9ce0: 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45  ==1 && pIdx->onE
9cf0: 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b  rror!=OE_None );
9d00: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
9d10: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 70 2d  >aiColumn[0]==p-
9d20: 3e 6e 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  >nCol-1 ){.     
9d30: 20 20 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74     pIdx->uniqNot
9d40: 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20  Null = 1;.      
9d50: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
9d60: 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f  *.** Scan the co
9d70: 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a  lumn type name z
9d80: 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79  Type (length nTy
9d90: 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74  pe) and return t
9da0: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
9db0: 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a   affinity type..
9dc0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
9dd0: 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69  ne does a case-i
9de0: 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63  ndependent searc
9df0: 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74  h of zType for t
9e00: 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67  he .** substring
9e10: 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
9e20: 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65  ng table. If one
9e30: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
9e40: 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20  gs is.** found, 
9e50: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
9e60: 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72 65  g affinity is re
9e70: 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65  turned. If zType
9e80: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72   contains.** mor
9e90: 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68  e than one of th
9ea0: 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e  e substrings, en
9eb0: 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68 65  tries toward the
9ec0: 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20   top of .** the 
9ed0: 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72  table take prior
9ee0: 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ity. For example
9ef0: 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27 42  , if zType is 'B
9f00: 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c  LOBINT', .** SQL
9f10: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
9f20: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
9f30: 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20 20  ** Substring    
9f40: 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d   | Affinity.** -
9f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
9f70: 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20 20  ** 'INT'        
9f80: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   | SQLITE_AFF_IN
9f90: 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20  TEGER.** 'CHAR' 
9fa0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
9fb0: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f  AFF_TEXT.** 'CLO
9fc0: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
9fd0: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
9fe0: 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20 53  TEXT'        | S
9ff0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
a000: 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20  * 'BLOB'        
a010: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  | SQLITE_AFF_BLO
a020: 42 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20  B.** 'REAL'     
a030: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
a040: 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20  REAL.** 'FLOA'  
a050: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
a060: 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42  FF_REAL.** 'DOUB
a070: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
a080: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a  E_AFF_REAL.**.**
a090: 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
a0a0: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
a0b0: 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72  e above table ar
a0c0: 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49  e found,.** SQLI
a0d0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69  TE_AFF_NUMERIC i
a0e0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63  s returned..*/.c
a0f0: 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e  har sqlite3Affin
a100: 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68  ityType(const ch
a110: 61 72 20 2a 7a 49 6e 2c 20 43 6f 6c 75 6d 6e 20  ar *zIn, Column 
a120: 2a 70 43 6f 6c 29 7b 0a 20 20 75 33 32 20 68 20  *pCol){.  u32 h 
a130: 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20  = 0;.  char aff 
a140: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  = SQLITE_AFF_NUM
a150: 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ERIC;.  const ch
a160: 61 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a 0a  ar *zChar = 0;..
a170: 20 20 61 73 73 65 72 74 28 20 7a 49 6e 21 3d 30    assert( zIn!=0
a180: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e   );.  while( zIn
a190: 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28  [0] ){.    h = (
a1a0: 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55  h<<8) + sqlite3U
a1b0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49  pperToLower[(*zI
a1c0: 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49  n)&0xff];.    zI
a1d0: 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d  n++;.    if( h==
a1e0: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c  (('c'<<24)+('h'<
a1f0: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72  <16)+('a'<<8)+'r
a200: 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  ') ){           
a210: 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20    /* CHAR */.   
a220: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
a230: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  AFF_TEXT;.      
a240: 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20  zChar = zIn;.   
a250: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
a260: 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'c'<<24)+('l'<<1
a270: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29  6)+('o'<<8)+'b')
a280: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f   ){       /* CLO
a290: 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  B */.      aff =
a2a0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
a2b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a2c0: 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27  h==(('t'<<24)+('
a2d0: 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29  e'<<16)+('x'<<8)
a2e0: 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'t') ){       /
a2f0: 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20  * TEXT */.      
a300: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
a310: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
a320: 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32   if( h==(('b'<<2
a330: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
a340: 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20  '<<8)+'b')      
a350: 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20      /* BLOB */. 
a360: 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d         && (aff==
a370: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
a380: 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  IC || aff==SQLIT
a390: 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20  E_AFF_REAL) ){. 
a3a0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
a3b0: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
a3c0: 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28    if( zIn[0]=='(
a3d0: 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b  ' ) zChar = zIn;
a3e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a3f0: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
a400: 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  INT.    }else if
a410: 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b  ( h==(('r'<<24)+
a420: 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('e'<<16)+('a'<<
a430: 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20  8)+'l')         
a440: 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20   /* REAL */.    
a450: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
a460: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
a470: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
a480: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
a490: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
a4a0: 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('f'<<24)+('l'<
a4b0: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61  <16)+('o'<<8)+'a
a4c0: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ')          /* F
a4d0: 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOA */.        &
a4e0: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
a4f0: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
a500: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
a510: 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65  AFF_REAL;.    }e
a520: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27  lse if( h==(('d'
a530: 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b  <<24)+('o'<<16)+
a540: 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20  ('u'<<8)+'b')   
a550: 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a         /* DOUB *
a560: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
a570: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
a580: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
a590: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
a5a0: 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EAL;.#endif.    
a5b0: 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78 30  }else if( (h&0x0
a5c0: 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c  0FFFFFF)==(('i'<
a5d0: 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74  <16)+('n'<<8)+'t
a5e0: 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20  ') ){    /* INT 
a5f0: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
a600: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
a610: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
a620: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
a630: 49 66 20 70 43 6f 6c 20 69 73 20 6e 6f 74 20 4e  If pCol is not N
a640: 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65 73  ULL, store an es
a650: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66 69  timate of the fi
a660: 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a 20  eld size.  The. 
a670: 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20   ** estimate is 
a680: 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20 74  scaled so that t
a690: 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e  he size of an in
a6a0: 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a  teger is 1.  */.
a6b0: 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20    if( pCol ){.  
a6c0: 20 20 69 6e 74 20 76 20 3d 20 30 3b 20 20 20 2f    int v = 0;   /
a6d0: 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 69  * default size i
a6e0: 73 20 61 70 70 72 6f 78 20 34 20 62 79 74 65 73  s approx 4 bytes
a6f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66 3c   */.    if( aff<
a700: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
a710: 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  IC ){.      if( 
a720: 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20 20  zChar ){.       
a730: 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30 5d   while( zChar[0]
a740: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
a750: 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  ( sqlite3Isdigit
a760: 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20 20  (zChar[0]) ){.  
a770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f            /* BLO
a780: 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28 6b 29  B(k), VARCHAR(k)
a790: 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d 28  , CHAR(k) -> r=(
a7a0: 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20 20  k/4+1) */.      
a7b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74        sqlite3Get
a7c0: 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76 29  Int32(zChar, &v)
a7d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
a7e0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
a7f0: 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68 61 72  .          zChar
a800: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
a810: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a820: 20 20 20 76 20 3d 20 31 36 3b 20 20 20 2f 2a 20     v = 16;   /* 
a830: 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f 42  BLOB, TEXT, CLOB
a840: 20 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f 78   -> r=5  (approx
a850: 20 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20 20   20 bytes)*/.   
a860: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65     }.    }.#ifde
a870: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
a880: 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
a890: 53 0a 20 20 20 20 69 66 28 20 76 3e 3d 73 71 6c  S.    if( v>=sql
a8a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
a8b0: 2e 73 7a 53 6f 72 74 65 72 52 65 66 20 29 7b 0a  .szSorterRef ){.
a8c0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46        pCol->colF
a8d0: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
a8e0: 53 4f 52 54 45 52 52 45 46 3b 0a 20 20 20 20 7d  SORTERREF;.    }
a8f0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 76 20 3d 20  .#endif.    v = 
a900: 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 69 66 28  v/4 + 1;.    if(
a910: 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32 35 35   v>255 ) v = 255
a920: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45 73  ;.    pCol->szEs
a930: 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74  t = v;.  }.  ret
a940: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
a950: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
a960: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
a970: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f  value for the mo
a980: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
a990: 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74  d column.** of t
a9a0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
a9b0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
a9c0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66  ction..**.** Def
a9d0: 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65  ault value expre
a9e0: 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63  ssions must be c
a9f0: 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20  onstant.  Raise 
aa00: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20  an exception if 
aa10: 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74  this.** is not t
aa20: 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  he case..**.** T
aa30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
aa40: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
aa50: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
aa60: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
aa70: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
aa80: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
aa90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
aaa0: 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 0a  ddDefaultValue(.
aab0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
aac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
aad0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
aae0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
aaf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ab00: 68 65 20 70 61 72 73 65 64 20 65 78 70 72 65 73  he parsed expres
ab10: 73 69 6f 6e 20 6f 66 20 74 68 65 20 64 65 66 61  sion of the defa
ab20: 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63  ult value */.  c
ab30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72  onst char *zStar
ab40: 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  t,      /* Start
ab50: 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   of the default 
ab60: 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 20 20  value text */.  
ab70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64  const char *zEnd
ab80: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
ab90: 74 20 63 68 61 72 61 63 74 65 72 20 70 61 73 74  t character past
aba0: 20 65 6e 64 20 6f 66 20 64 65 66 61 75 74 20 76   end of defaut v
abb0: 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 29 7b 0a  alue text */.){.
abc0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f    Table *p;.  Co
abd0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71  lumn *pCol;.  sq
abe0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
abf0: 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50  se->db;.  p = pP
ac00: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
ac10: 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20  .  if( p!=0 ){. 
ac20: 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61     pCol = &(p->a
ac30: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b  Col[p->nCol-1]);
ac40: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
ac50: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
ac60: 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70 72 2c  rFunction(pExpr,
ac70: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20   db->init.busy) 
ac80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ac90: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
aca0: 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20   "default value 
acb0: 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69  of column [%s] i
acc0: 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c  s not constant",
acd0: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d  .          pCol-
ace0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  >zName);.    }el
acf0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63  se{.      /* A c
ad00: 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20  opy of pExpr is 
ad10: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
ad20: 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73  the original, as
ad30: 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a   pExpr contains.
ad40: 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20        ** tokens 
ad50: 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f  that point to vo
ad60: 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 0a 20  latile memory.. 
ad70: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78       */.      Ex
ad80: 70 72 20 78 3b 0a 20 20 20 20 20 20 73 71 6c 69  pr x;.      sqli
ad90: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
ada0: 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  , pCol->pDflt);.
adb0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 78 2c        memset(&x,
adc0: 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a   0, sizeof(x));.
add0: 20 20 20 20 20 20 78 2e 6f 70 20 3d 20 54 4b 5f        x.op = TK_
ade0: 53 50 41 4e 3b 0a 20 20 20 20 20 20 78 2e 75 2e  SPAN;.      x.u.
adf0: 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33  zToken = sqlite3
ae00: 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53  DbSpanDup(db, zS
ae10: 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 20  tart, zEnd);.   
ae20: 20 20 20 78 2e 70 4c 65 66 74 20 3d 20 70 45 78     x.pLeft = pEx
ae30: 70 72 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61 67  pr;.      x.flag
ae40: 73 20 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20 20  s = EP_Skip;.   
ae50: 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d     pCol->pDflt =
ae60: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
ae70: 64 62 2c 20 26 78 2c 20 45 58 50 52 44 55 50 5f  db, &x, EXPRDUP_
ae80: 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20 73  REDUCE);.      s
ae90: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
aea0: 20 78 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20   x.u.zToken);.  
aeb0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e    }.  }.  if( IN
aec0: 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
aed0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e  {.    sqlite3Ren
aee0: 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 70 50 61  ameExprUnmap(pPa
aef0: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d  rse, pExpr);.  }
af00: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
af10: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
af20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77 61  .}../*.** Backwa
af30: 72 64 73 20 43 6f 6d 70 61 74 69 62 69 6c 69 74  rds Compatibilit
af40: 79 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48  y Hack:.** .** H
af50: 69 73 74 6f 72 69 63 61 6c 20 76 65 72 73 69 6f  istorical versio
af60: 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 63 63  ns of SQLite acc
af70: 65 70 74 65 64 20 73 74 72 69 6e 67 73 20 61 73  epted strings as
af80: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e   column names in
af90: 0a 2a 2a 20 69 6e 64 65 78 65 73 20 61 6e 64 20  .** indexes and 
afa0: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
afb0: 74 72 61 69 6e 74 73 20 61 6e 64 20 69 6e 20 55  traints and in U
afc0: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
afd0: 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  s.  Example:.**.
afe0: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
aff0: 42 4c 45 20 78 79 7a 28 61 2c 62 2c 63 2c 64 2c  BLE xyz(a,b,c,d,
b000: 65 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 27 61  e,PRIMARY KEY('a
b010: 27 29 2c 55 4e 49 51 55 45 28 27 62 27 2c 27 63  '),UNIQUE('b','c
b020: 27 20 43 4f 4c 4c 41 54 45 20 74 72 69 6d 29 0a  ' COLLATE trim).
b030: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 49 4e  **     CREATE IN
b040: 44 45 58 20 61 62 63 20 4f 4e 20 78 79 7a 28 27  DEX abc ON xyz('
b050: 63 27 2c 27 64 27 20 44 45 53 43 2c 27 65 27 20  c','d' DESC,'e' 
b060: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 44  COLLATE nocase D
b070: 45 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ESC);.**.** This
b080: 20 69 73 20 67 6f 6f 66 79 2e 20 20 42 75 74 20   is goofy.  But 
b090: 74 6f 20 70 72 65 73 65 72 76 65 20 62 61 63 6b  to preserve back
b0a0: 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
b0b0: 69 74 79 20 77 65 20 63 6f 6e 74 69 6e 75 65 20  ity we continue 
b0c0: 74 6f 0a 2a 2a 20 61 63 63 65 70 74 20 69 74 2e  to.** accept it.
b0d0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64    This routine d
b0e0: 6f 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  oes the necessar
b0f0: 79 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 20 20 49  y conversion.  I
b100: 74 20 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74 68  t converts.** th
b110: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 67 69 76  e expression giv
b120: 65 6e 20 69 6e 20 69 74 73 20 61 72 67 75 6d 65  en in its argume
b130: 6e 74 20 66 72 6f 6d 20 61 20 54 4b 5f 53 54 52  nt from a TK_STR
b140: 49 4e 47 20 69 6e 74 6f 20 61 20 54 4b 5f 49 44  ING into a TK_ID
b150: 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72 65  .** if the expre
b160: 73 73 69 6f 6e 20 69 73 20 6a 75 73 74 20 61 20  ssion is just a 
b170: 54 4b 5f 53 54 52 49 4e 47 20 77 69 74 68 20 61  TK_STRING with a
b180: 6e 20 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c 41  n optional COLLA
b190: 54 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 49 66  TE clause..** If
b1a0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
b1b0: 69 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65  is anything othe
b1c0: 72 20 74 68 61 6e 20 54 4b 5f 53 54 52 49 4e 47  r than TK_STRING
b1d0: 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  , the expression
b1e0: 20 69 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64   is.** unchanged
b1f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b200: 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f   sqlite3StringTo
b210: 49 64 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  Id(Expr *p){.  i
b220: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  f( p->op==TK_STR
b230: 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 6f 70  ING ){.    p->op
b240: 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c 73   = TK_ID;.  }els
b250: 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  e if( p->op==TK_
b260: 43 4f 4c 4c 41 54 45 20 26 26 20 70 2d 3e 70 4c  COLLATE && p->pL
b270: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49  eft->op==TK_STRI
b280: 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 65  NG ){.    p->pLe
b290: 66 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a  ft->op = TK_ID;.
b2a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73    }.}../*.** Des
b2b0: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
b2c0: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
b2d0: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
b2e0: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
b2f0: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
b300: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
b310: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
b320: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
b330: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
b340: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
b350: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
b360: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
b370: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
b380: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
b390: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
b3a0: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
b3b0: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
b3c0: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
b3d0: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
b3e0: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
b3f0: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
b400: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
b410: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
b420: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
b430: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
b440: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
b450: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
b460: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
b470: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
b480: 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65  s the rowid.  Se
b490: 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65  t the Table.iPKe
b4a0: 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  y.** field of th
b4b0: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
b4c0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
b4d0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
b4e0: 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
b4f0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e  MARY KEY column.
b500: 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73    Table.iPKey is
b510: 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68   set to -1 if th
b520: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54  ere is.** no INT
b530: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
b540: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b  ..**.** If the k
b550: 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54  ey is not an INT
b560: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
b570: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
b580: 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20  unique.** index 
b590: 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f  for the key.  No
b5a0: 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
b5b0: 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52  d for INTEGER PR
b5c0: 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76  IMARY KEYs..*/.v
b5d0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72  oid sqlite3AddPr
b5e0: 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73  imaryKey(.  Pars
b5f0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
b600: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
b610: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
b620: 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  pList,  /* List 
b630: 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74  of field names t
b640: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
b650: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
b660: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
b670: 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e  o with a uniquen
b680: 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ess conflict */.
b690: 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20    int autoInc,  
b6a0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
b6b0: 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  he AUTOINCREMENT
b6c0: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
b6d0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
b6e0: 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51  tOrder     /* SQ
b6f0: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53  LITE_SO_ASC or S
b700: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f  QLITE_SO_DESC */
b710: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
b720: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
b730: 54 61 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20  Table;.  Column 
b740: 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  *pCol = 0;.  int
b750: 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20   iCol = -1, i;. 
b760: 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66   int nTerm;.  if
b770: 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f  ( pTab==0 ) goto
b780: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
b790: 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  t;.  if( pTab->t
b7a0: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
b7b0: 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20  PrimaryKey ){.  
b7c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
b7d0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
b7e0: 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68   "table \"%s\" h
b7f0: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
b800: 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70   primary key", p
b810: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
b820: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
b830: 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54  y_exit;.  }.  pT
b840: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
b850: 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79  TF_HasPrimaryKey
b860: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
b870: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
b880: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
b890: 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d     pCol = &pTab-
b8a0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20  >aCol[iCol];.   
b8b0: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
b8c0: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b  |= COLFLAG_PRIMK
b8d0: 45 59 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20  EY;.    nTerm = 
b8e0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
b8f0: 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e  nTerm = pList->n
b900: 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Expr;.    for(i=
b910: 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29  0; i<nTerm; i++)
b920: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  {.      Expr *pC
b930: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
b940: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c  prSkipCollate(pL
b950: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
b960: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b970: 70 43 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  pCExpr!=0 );.   
b980: 20 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67     sqlite3String
b990: 54 6f 49 64 28 70 43 45 78 70 72 29 3b 0a 20 20  ToId(pCExpr);.  
b9a0: 20 20 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e      if( pCExpr->
b9b0: 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20  op==TK_ID ){.   
b9c0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
b9d0: 2a 7a 43 4e 61 6d 65 20 3d 20 70 43 45 78 70 72  *zCName = pCExpr
b9e0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
b9f0: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
ba00: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
ba10: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
ba20: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
ba30: 74 72 49 43 6d 70 28 7a 43 4e 61 6d 65 2c 20 70  trICmp(zCName, p
ba40: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
ba50: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
ba60: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
ba70: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
ba80: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ];.            p
ba90: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
baa0: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
bab0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
bac0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
bad0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bae0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
baf0: 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26  f( nTerm==1.   &
bb00: 26 20 70 43 6f 6c 0a 20 20 20 26 26 20 73 71 6c  & pCol.   && sql
bb10: 69 74 65 33 53 74 72 49 43 6d 70 28 73 71 6c 69  ite3StrICmp(sqli
bb20: 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43  te3ColumnType(pC
bb30: 6f 6c 2c 22 22 29 2c 20 22 49 4e 54 45 47 45 52  ol,""), "INTEGER
bb40: 22 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72 74  ")==0.   && sort
bb50: 4f 72 64 65 72 21 3d 53 51 4c 49 54 45 5f 53 4f  Order!=SQLITE_SO
bb60: 5f 44 45 53 43 0a 20 20 29 7b 0a 20 20 20 20 69  _DESC.  ){.    i
bb70: 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
bb80: 45 43 54 20 26 26 20 70 4c 69 73 74 20 29 7b 0a  ECT && pList ){.
bb90: 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 45 78        Expr *pCEx
bba0: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
bbb0: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73  SkipCollate(pLis
bbc0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
bbd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e        sqlite3Ren
bbe0: 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50  ameTokenRemap(pP
bbf0: 61 72 73 65 2c 20 26 70 54 61 62 2d 3e 69 50 4b  arse, &pTab->iPK
bc00: 65 79 2c 20 70 43 45 78 70 72 29 3b 0a 20 20 20  ey, pCExpr);.   
bc10: 20 7d 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b   }.    pTab->iPK
bc20: 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70  ey = iCol;.    p
bc30: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28  Tab->keyConf = (
bc40: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  u8)onError;.    
bc50: 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d  assert( autoInc=
bc60: 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31  =0 || autoInc==1
bc70: 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61   );.    pTab->ta
bc80: 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e  bFlags |= autoIn
bc90: 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  c*TF_Autoincreme
bca0: 6e 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  nt;.    if( pLis
bcb0: 74 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b 53  t ) pParse->iPkS
bcc0: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74  ortOrder = pList
bcd0: 2d 3e 61 5b 30 5d 2e 73 6f 72 74 46 6c 61 67 73  ->a[0].sortFlags
bce0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75  ;.  }else if( au
bcf0: 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66  toInc ){.#ifndef
bd00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
bd10: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73  OINCREMENT.    s
bd20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
bd30: 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52  Parse, "AUTOINCR
bd40: 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c  EMENT is only al
bd50: 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20  lowed on an ".  
bd60: 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52       "INTEGER PR
bd70: 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e  IMARY KEY");.#en
bd80: 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
bd90: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
bda0: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
bdb0: 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72  , 0, pList, onEr
bdc0: 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ror, 0,.        
bdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bde0: 20 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c     0, sortOrder,
bdf0: 20 30 2c 20 53 51 4c 49 54 45 5f 49 44 58 54 59   0, SQLITE_IDXTY
be00: 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a  PE_PRIMARYKEY);.
be10: 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
be20: 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f   }..primary_key_
be30: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45  exit:.  sqlite3E
be40: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
be50: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29  arse->db, pList)
be60: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
be70: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43  *.** Add a new C
be80: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
be90: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
bea0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
beb0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
bec0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65  id sqlite3AddChe
bed0: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ckConstraint(.  
bee0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
bef0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
bf00: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
bf10: 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54  pCheckExpr  /* T
bf20: 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73  he check express
bf30: 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  ion */.){.#ifnde
bf40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
bf50: 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ECK.  Table *pTa
bf60: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
bf70: 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33  Table;.  sqlite3
bf80: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
bf90: 62 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26  b;.  if( pTab &&
bfa0: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
bfb0: 42 0a 20 20 20 26 26 20 21 73 71 6c 69 74 65 33  B.   && !sqlite3
bfc0: 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28  BtreeIsReadonly(
bfd0: 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e 69 74  db->aDb[db->init
bfe0: 2e 69 44 62 5d 2e 70 42 74 29 0a 20 20 29 7b 0a  .iDb].pBt).  ){.
bff0: 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b      pTab->pCheck
c000: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
c010: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
c020: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70   pTab->pCheck, p
c030: 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20 20  CheckExpr);.    
c040: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73  if( pParse->cons
c050: 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a  traintName.n ){.
c060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c070: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
c080: 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63  rse, pTab->pChec
c090: 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73  k, &pParse->cons
c0a0: 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a  traintName, 1);.
c0b0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65      }.  }else.#e
c0c0: 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
c0d0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
c0e0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65 63  Parse->db, pChec
c0f0: 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  kExpr);.  }.}../
c100: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c  *.** Set the col
c110: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
c120: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
c130: 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c  ntly parsed tabl
c140: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74  e column.** to t
c150: 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e  he CollSeq given
c160: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
c170: 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28  3AddCollateType(
c180: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
c190: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
c1a0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
c1b0: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   i;.  char *zCol
c1c0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
c1d0: 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65  /* Dequoted name
c1e0: 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   of collation se
c1f0: 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69  quence */.  sqli
c200: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
c210: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
c220: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
c230: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
c240: 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61  ol-1;.  db = pPa
c250: 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c  rse->db;.  zColl
c260: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
c270: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
c280: 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c  en);.  if( !zCol
c290: 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  l ) return;..  i
c2a0: 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  f( sqlite3Locate
c2b0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
c2c0: 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e  zColl) ){.    In
c2d0: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 73  dex *pIdx;.    s
c2e0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
c2f0: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
c300: 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b  l);.    p->aCol[
c310: 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c  i].zColl = zColl
c320: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  ;.  .    /* If t
c330: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63  he column is dec
c340: 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e  lared as "<name>
c350: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c   PRIMARY KEY COL
c360: 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20  LATE <type>",.  
c370: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64    ** then an ind
c380: 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ex may have been
c390: 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73   created on this
c3a0: 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74   column before t
c3b0: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  he.    ** collat
c3c0: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64  ion type was add
c3d0: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73  ed. Correct this
c3e0: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61   if it is the ca
c3f0: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  se..    */.    f
c400: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65  or(pIdx=p->pInde
c410: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
c420: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
c430: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
c440: 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  nKeyCol==1 );.  
c450: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
c460: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a  Column[0]==i ){.
c470: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
c480: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f  Coll[0] = p->aCo
c490: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[i].zColl;.    
c4a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
c4b0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  e{.    sqlite3Db
c4c0: 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
c4d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 68 61 6e 67  .  }.}../* Chang
c4e0: 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  e the most recen
c4f0: 74 6c 79 20 70 61 72 73 65 64 20 63 6f 6c 75 6d  tly parsed colum
c500: 6e 20 74 6f 20 62 65 20 61 20 47 45 4e 45 52 41  n to be a GENERA
c510: 54 45 44 20 41 4c 57 41 59 53 20 41 53 0a 2a 2a  TED ALWAYS AS.**
c520: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64   column..*/.void
c530: 20 73 71 6c 69 74 65 33 41 64 64 47 65 6e 65 72   sqlite3AddGener
c540: 61 74 65 64 28 50 61 72 73 65 20 2a 70 50 61 72  ated(Parse *pPar
c550: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
c560: 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a   Token *pType){.
c570: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c580: 4d 49 54 5f 47 45 4e 45 52 41 54 45 44 5f 43 4f  MIT_GENERATED_CO
c590: 4c 55 4d 4e 53 0a 20 20 75 38 20 65 54 79 70 65  LUMNS.  u8 eType
c5a0: 20 3d 20 43 4f 4c 46 4c 41 47 5f 56 49 52 54 55   = COLFLAG_VIRTU
c5b0: 41 4c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  AL;.  Table *pTa
c5c0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
c5d0: 54 61 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20  Table;.  Column 
c5e0: 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 49 4e 5f  *pCol;.  if( IN_
c5f0: 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
c600: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61  .    sqlite3Rena
c610: 6d 65 45 78 70 72 55 6e 6d 61 70 28 70 50 61 72  meExprUnmap(pPar
c620: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 0a  se, pExpr);.  }.
c630: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
c640: 67 6f 74 6f 20 67 65 6e 65 72 61 74 65 64 5f 64  goto generated_d
c650: 6f 6e 65 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 28  one;.  pCol = &(
c660: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
c670: 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 69 66 28  >nCol-1]);.  if(
c680: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 29 20 67   pCol->pDflt ) g
c690: 6f 74 6f 20 67 65 6e 65 72 61 74 65 64 5f 65 72  oto generated_er
c6a0: 72 6f 72 3b 0a 20 20 69 66 28 20 70 54 79 70 65  ror;.  if( pType
c6b0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 79 70   ){.    if( pTyp
c6c0: 65 2d 3e 6e 3d 3d 37 20 26 26 20 73 71 6c 69 74  e->n==7 && sqlit
c6d0: 65 33 53 74 72 4e 49 43 6d 70 28 22 76 69 72 74  e3StrNICmp("virt
c6e0: 75 61 6c 22 2c 70 54 79 70 65 2d 3e 7a 2c 37 29  ual",pType->z,7)
c6f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
c700: 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c  no-op */.    }el
c710: 73 65 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d  se if( pType->n=
c720: 3d 36 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =6 && sqlite3Str
c730: 4e 49 43 6d 70 28 22 73 74 6f 72 65 64 22 2c 70  NICmp("stored",p
c740: 54 79 70 65 2d 3e 7a 2c 36 29 3d 3d 30 20 29 7b  Type->z,6)==0 ){
c750: 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 43  .      eType = C
c760: 4f 4c 46 4c 41 47 5f 53 54 4f 52 45 44 3b 0a 20  OLFLAG_STORED;. 
c770: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c780: 67 6f 74 6f 20 67 65 6e 65 72 61 74 65 64 5f 65  goto generated_e
c790: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
c7a0: 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
c7b0: 20 7c 3d 20 65 54 79 70 65 3b 0a 20 20 61 73 73   |= eType;.  ass
c7c0: 65 72 74 28 20 54 46 5f 48 61 73 56 69 72 74 75  ert( TF_HasVirtu
c7d0: 61 6c 3d 3d 43 4f 4c 46 4c 41 47 5f 56 49 52 54  al==COLFLAG_VIRT
c7e0: 55 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  UAL );.  assert(
c7f0: 20 54 46 5f 48 61 73 53 74 6f 72 65 64 3d 3d 43   TF_HasStored==C
c800: 4f 4c 46 4c 41 47 5f 53 54 4f 52 45 44 20 29 3b  OLFLAG_STORED );
c810: 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  .  pTab->tabFlag
c820: 73 20 7c 3d 20 65 54 79 70 65 3b 0a 20 20 70 43  s |= eType;.  pC
c830: 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69  ol->pDflt = sqli
c840: 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73  te3ExprDup(pPars
c850: 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29  e->db, pExpr, 0)
c860: 3b 0a 20 20 67 6f 74 6f 20 67 65 6e 65 72 61 74  ;.  goto generat
c870: 65 64 5f 64 6f 6e 65 3b 0a 0a 67 65 6e 65 72 61  ed_done;..genera
c880: 74 65 64 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c  ted_error:.  sql
c890: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
c8a0: 72 73 65 2c 20 22 69 6e 63 6f 72 72 65 63 74 20  rse, "incorrect 
c8b0: 47 45 4e 45 52 41 54 45 44 20 41 4c 57 41 59 53  GENERATED ALWAYS
c8c0: 20 41 53 20 6f 6e 20 63 6f 6c 75 6d 6e 20 5c 22   AS on column \"
c8d0: 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\"",.         
c8e0: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a           pCol->z
c8f0: 4e 61 6d 65 29 3b 0a 67 65 6e 65 72 61 74 65 64  Name);.generated
c900: 5f 64 6f 6e 65 3a 0a 20 20 73 71 6c 69 74 65 33  _done:.  sqlite3
c910: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
c920: 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 23  e->db, pExpr);.#
c930: 65 6c 73 65 0a 20 20 2f 2a 20 54 68 72 6f 77 20  else.  /* Throw 
c940: 61 6e 64 20 65 72 72 6f 72 20 66 6f 72 20 74 68  and error for th
c950: 65 20 47 45 4e 45 52 41 54 45 44 20 41 4c 57 41  e GENERATED ALWA
c960: 59 53 20 41 53 20 63 6c 61 75 73 65 20 69 66 20  YS AS clause if 
c970: 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
c980: 4f 4d 49 54 5f 47 45 4e 45 52 41 54 45 44 5f 43  OMIT_GENERATED_C
c990: 4f 4c 55 4d 4e 53 20 63 6f 6d 70 69 6c 65 2d 74  OLUMNS compile-t
c9a0: 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73  ime option is us
c9b0: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
c9c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
c9d0: 20 22 47 45 4e 45 52 41 54 45 44 20 41 4c 57 41   "GENERATED ALWA
c9e0: 59 53 20 41 53 20 6e 6f 74 20 73 75 70 70 6f 72  YS AS not suppor
c9f0: 74 65 64 22 29 3b 0a 20 20 73 71 6c 69 74 65 33  ted");.  sqlite3
ca00: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
ca10: 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 23  e->db, pExpr);.#
ca20: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
ca30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
ca40: 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  urns the collati
ca50: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
ca60: 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20  database native 
ca70: 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67  text.** encoding
ca80: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
ca90: 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c  he string zName,
caa0: 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a   length nName..*
cab0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
cac0: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ested collation 
cad0: 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20  sequence is not 
cae0: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f  available, or no
caf0: 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69  t available.** i
cb00: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  n the database n
cb10: 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20  ative encoding, 
cb20: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
cb30: 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64  ctory is invoked
cb40: 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69   to.** request i
cb50: 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74  t. If the collat
cb60: 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73  ion factory does
cb70: 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68   not supply such
cb80: 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20   a sequence,.** 
cb90: 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65  and the sequence
cba0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
cbb0: 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e   another text en
cbc0: 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61  coding, then tha
cbd0: 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  t is.** returned
cbe0: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
cbf0: 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f  If no versions o
cc00: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
cc10: 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65  collations seque
cc20: 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c  nce are availabl
cc30: 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72  e, or.** another
cc40: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
cc50: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
cc60: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
cc70: 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74  sage written int
cc80: 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  o.** pParse..**.
cc90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
cca0: 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
ccb0: 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43  und sqlite3FindC
ccc0: 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20  ollSeq().  This 
ccd0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b  routine.** invok
cce0: 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
ccf0: 20 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20   factory if the 
cd00: 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  named collation 
cd10: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a  cannot be found.
cd20: 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73  ** and generates
cd30: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
cd40: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
cd50: 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  o: sqlite3FindCo
cd60: 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33  llSeq(), sqlite3
cd70: 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a  GetCollSeq().*/.
cd80: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
cd90: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61  LocateCollSeq(Pa
cda0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
cdb0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
cdc0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
cdd0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75   pParse->db;.  u
cde0: 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  8 enc = ENC(db);
cdf0: 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d  .  u8 initbusy =
ce00: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a   db->init.busy;.
ce10: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
ce20: 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  ;..  pColl = sql
ce30: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
ce40: 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20  db, enc, zName, 
ce50: 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28  initbusy);.  if(
ce60: 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21   !initbusy && (!
ce70: 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d  pColl || !pColl-
ce80: 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43  >xCmp) ){.    pC
ce90: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
cea0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
ceb0: 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d  enc, pColl, zNam
cec0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  e);.  }..  retur
ced0: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a  n pColl;.}.../*.
cee0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
cef0: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65   that will incre
cf00: 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20  ment the schema 
cf10: 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cookie..**.** Th
cf20: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
cf30: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
cf40: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
cf50: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
cf60: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
cf70: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
cf80: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
cf90: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
cfa0: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
cfb0: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
cfc0: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
cfd0: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
cfe0: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
cff0: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
d000: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
d010: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
d020: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
d030: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
d040: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
d050: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
d060: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
d070: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
d080: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
d090: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
d0a0: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
d0b0: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
d0c0: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
d0d0: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
d0e0: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
d0f0: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
d100: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
d110: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
d120: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
d130: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
d140: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
d150: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
d160: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
d170: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
d180: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
d190: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
d1a0: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a  fe enough..**.**
d1b0: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
d1c0: 4f 46 3a 20 52 2d 33 34 32 33 30 2d 35 36 30 34  OF: R-34230-5604
d1d0: 39 20 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74  9 SQLite automat
d1e0: 69 63 61 6c 6c 79 20 69 6e 63 72 65 6d 65 6e 74  ically increment
d1f0: 73 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d  s.** the schema-
d200: 76 65 72 73 69 6f 6e 20 77 68 65 6e 65 76 65 72  version whenever
d210: 20 74 68 65 20 73 63 68 65 6d 61 20 63 68 61 6e   the schema chan
d220: 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ges..*/.void sql
d230: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
d240: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
d250: 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69  int iDb){.  sqli
d260: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d270: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
d280: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
d290: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d2a0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
d2b0: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
d2c0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
d2d0: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f  dOp3(v, OP_SetCo
d2e0: 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45  okie, iDb, BTREE
d2f0: 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c  _SCHEMA_VERSION,
d300: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
d310: 20 20 20 20 20 28 69 6e 74 29 28 31 2b 28 75 6e       (int)(1+(un
d320: 73 69 67 6e 65 64 29 64 62 2d 3e 61 44 62 5b 69  signed)db->aDb[i
d330: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68  Db].pSchema->sch
d340: 65 6d 61 5f 63 6f 6f 6b 69 65 29 29 3b 0a 7d 0a  ema_cookie));.}.
d350: 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74  ./*.** Measure t
d360: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
d370: 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74  racters needed t
d380: 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76  o output the giv
d390: 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72  en.** identifier
d3a0: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65  .  The number re
d3b0: 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20  turned includes 
d3c0: 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a  any quotes used.
d3d0: 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  ** but does not 
d3e0: 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c  include the null
d3f0: 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a   terminator..**.
d400: 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20  ** The estimate 
d410: 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e  is conservative.
d420: 20 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61    It might be la
d430: 72 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69  rger that what i
d440: 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64  s.** really need
d450: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
d460: 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f  t identLength(co
d470: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
d480: 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30  int n;.  for(n=0
d490: 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b  ; *z; n++, z++){
d4a0: 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27  .    if( *z=='"'
d4b0: 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20   ){ n++; }.  }. 
d4c0: 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d   return n + 2;.}
d4d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
d4e0: 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  t parameter is a
d4f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
d500: 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68  utput buffer. Th
d510: 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72  e second .** par
d520: 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
d530: 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ter to an intege
d540: 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  r that contains 
d550: 74 68 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a  the offset at.**
d560: 20 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20   which to write 
d570: 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  into the output 
d580: 62 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e  buffer. This fun
d590: 63 74 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65  ction copies the
d5a0: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
d5b0: 65 64 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65  ed string pointe
d5c0: 64 20 74 6f 20 62 79 20 74 68 65 20 74 68 69 72  d to by the thir
d5d0: 64 20 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69  d parameter, zSi
d5e0: 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f  gnedIdent,.** to
d5f0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f   the specified o
d600: 66 66 73 65 74 20 69 6e 20 74 68 65 20 62 75 66  ffset in the buf
d610: 66 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20  fer and updates 
d620: 2a 70 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a  *pIdx to refer.*
d630: 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  * to the first b
d640: 79 74 65 20 61 66 74 65 72 20 74 68 65 20 6c 61  yte after the la
d650: 73 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20  st byte written 
d660: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
d670: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
d680: 73 74 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64  string zSignedId
d690: 65 6e 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  ent consists ent
d6a0: 69 72 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e  irely of alpha-n
d6b0: 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63  umeric.** charac
d6c0: 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62  ters, does not b
d6d0: 65 67 69 6e 20 77 69 74 68 20 61 20 64 69 67 69  egin with a digi
d6e0: 74 20 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20  t and is not an 
d6f0: 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20  SQL keyword,.** 
d700: 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65  then it is copie
d710: 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  d to the output 
d720: 62 75 66 66 65 72 20 65 78 61 63 74 6c 79 20 61  buffer exactly a
d730: 73 20 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69  s it is. Otherwi
d740: 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f  se,.** it is quo
d750: 74 65 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65  ted using double
d760: 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  -quotes..*/.stat
d770: 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74  ic void identPut
d780: 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70  (char *z, int *p
d790: 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e  Idx, char *zSign
d7a0: 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69  edIdent){.  unsi
d7b0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e  gned char *zIden
d7c0: 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  t = (unsigned ch
d7d0: 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74  ar*)zSignedIdent
d7e0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65  ;.  int i, j, ne
d7f0: 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a  edQuote;.  i = *
d800: 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30  pIdx;..  for(j=0
d810: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
d820: 29 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  ){.    if( !sqli
d830: 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e  te3Isalnum(zIden
d840: 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b  t[j]) && zIdent[
d850: 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b  j]!='_' ) break;
d860: 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65  .  }.  needQuote
d870: 20 3d 20 73 71 6c 69 74 65 33 49 73 64 69 67 69   = sqlite3Isdigi
d880: 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20  t(zIdent[0]).   
d890: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
d8a0: 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a  te3KeywordCode(z
d8b0: 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44  Ident, j)!=TK_ID
d8c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
d8d0: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20  zIdent[j]!=0.   
d8e0: 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30           || j==0
d8f0: 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f  ;..  if( needQuo
d900: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  te ) z[i++] = '"
d910: 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  ';.  for(j=0; zI
d920: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
d930: 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65     z[i++] = zIde
d940: 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a  nt[j];.    if( z
d950: 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20  Ident[j]=='"' ) 
d960: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
d970: 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  }.  if( needQuot
d980: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
d990: 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20  ;.  z[i] = 0;.  
d9a0: 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a  *pIdx = i;.}../*
d9b0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43  .** Generate a C
d9c0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
d9d0: 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74  ement appropriat
d9e0: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
d9f0: 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72  ** table.  Memor
da00: 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65  y to hold the te
da10: 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  xt of the statem
da20: 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ent is obtained.
da30: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ** from sqliteMa
da40: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
da50: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
da60: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
da70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
da80: 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d   *createTableStm
da90: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  t(sqlite3 *db, T
daa0: 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  able *p){.  int 
dab0: 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20  i, k, n;.  char 
dac0: 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a  *zStmt;.  char *
dad0: 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a  zSep, *zSep2, *z
dae0: 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  End;.  Column *p
daf0: 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  Col;.  n = 0;.  
db00: 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43  for(pCol = p->aC
db10: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
db20: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
db30: 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74  {.    n += ident
db40: 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61  Length(pCol->zNa
db50: 6d 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e  me) + 5;.  }.  n
db60: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
db70: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  p->zName);.  if(
db80: 20 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53   n<50 ){ .    zS
db90: 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65  ep = "";.    zSe
dba0: 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45  p2 = ",";.    zE
dbb0: 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73  nd = ")";.  }els
dbc0: 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c  e{.    zSep = "\
dbd0: 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  n  ";.    zSep2 
dbe0: 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a  = ",\n  ";.    z
dbf0: 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d  End = "\n)";.  }
dc00: 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70  .  n += 35 + 6*p
dc10: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20  ->nCol;.  zStmt 
dc20: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
dc30: 63 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66  cRaw(0, n);.  if
dc40: 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  ( zStmt==0 ){.  
dc50: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
dc60: 74 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72  t(db);.    retur
dc70: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
dc80: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a  e3_snprintf(n, z
dc90: 53 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41  Stmt, "CREATE TA
dca0: 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71  BLE ");.  k = sq
dcb0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53  lite3Strlen30(zS
dcc0: 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74  tmt);.  identPut
dcd0: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a  (zStmt, &k, p->z
dce0: 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b  Name);.  zStmt[k
dcf0: 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72  ++] = '(';.  for
dd00: 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69  (pCol=p->aCol, i
dd10: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
dd20: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
dd30: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
dd40: 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70  ar * const azTyp
dd50: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
dd60: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  /* SQLITE_AFF_BL
dd70: 4f 42 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20  OB    */ "",.   
dd80: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
dd90: 46 46 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20  FF_TEXT    */ " 
dda0: 54 45 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f  TEXT",.        /
ddb0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  * SQLITE_AFF_NUM
ddc0: 45 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a  ERIC */ " NUM",.
ddd0: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
dde0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f  E_AFF_INTEGER */
ddf0: 20 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20   " INT",.       
de00: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52   /* SQLITE_AFF_R
de10: 45 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c  EAL    */ " REAL
de20: 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  ".    };.    int
de30: 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20   len;.    const 
de40: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20  char *zType;..  
de50: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
de60: 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b  tf(n-k, &zStmt[k
de70: 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20  ], zSep);.    k 
de80: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
de90: 33 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20  30(&zStmt[k]);. 
dea0: 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b     zSep = zSep2;
deb0: 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53  .    identPut(zS
dec0: 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a  tmt, &k, pCol->z
ded0: 4e 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Name);.    asser
dee0: 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  t( pCol->affinit
def0: 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  y-SQLITE_AFF_BLO
df00: 42 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73  B >= 0 );.    as
df10: 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69  sert( pCol->affi
df20: 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f  nity-SQLITE_AFF_
df30: 42 4c 4f 42 20 3c 20 41 72 72 61 79 53 69 7a 65  BLOB < ArraySize
df40: 28 61 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20  (azType) );.    
df50: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
df60: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
df70: 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20  _AFF_BLOB );.   
df80: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
df90: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
dfa0: 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20  E_AFF_TEXT );.  
dfb0: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
dfc0: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
dfd0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
dfe0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
dff0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
e000: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
e010: 45 52 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ER );.    testca
e020: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
e030: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ty==SQLITE_AFF_R
e040: 45 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20  EAL );.    .    
e050: 7a 54 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70  zType = azType[p
e060: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20  Col->affinity - 
e070: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d  SQLITE_AFF_BLOB]
e080: 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69  ;.    len = sqli
e090: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70  te3Strlen30(zTyp
e0a0: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
e0b0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
e0c0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
e0d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
e0e0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
e0f0: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
e100: 79 70 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b  ype(zType, 0) );
e110: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74  .    memcpy(&zSt
e120: 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65  mt[k], zType, le
e130: 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e  n);.    k += len
e140: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c  ;.    assert( k<
e150: 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  =n );.  }.  sqli
e160: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b  te3_snprintf(n-k
e170: 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73  , &zStmt[k], "%s
e180: 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75  ", zEnd);.  retu
e190: 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a  rn zStmt;.}../*.
e1a0: 2a 2a 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64  ** Resize an Ind
e1b0: 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c  ex object to hol
e1c0: 64 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61  d N columns tota
e1d0: 6c 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  l.  Return SQLIT
e1e0: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
e1f0: 73 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f  ss and SQLITE_NO
e200: 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72  MEM on an OOM er
e210: 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ror..*/.static i
e220: 6e 74 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62  nt resizeIndexOb
e230: 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  ject(sqlite3 *db
e240: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69  , Index *pIdx, i
e250: 6e 74 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a  nt N){.  char *z
e260: 45 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79  Extra;.  int nBy
e270: 74 65 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e  te;.  if( pIdx->
e280: 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74  nColumn>=N ) ret
e290: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
e2a0: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69   assert( pIdx->i
e2b0: 73 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20  sResized==0 );. 
e2c0: 20 6e 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66   nByte = (sizeof
e2d0: 28 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66  (char*) + sizeof
e2e0: 28 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20  (i16) + 1)*N;.  
e2f0: 7a 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33  zExtra = sqlite3
e300: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
e310: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a   nByte);.  if( z
e320: 45 78 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72  Extra==0 ) retur
e330: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
e340: 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45  KPT;.  memcpy(zE
e350: 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  xtra, pIdx->azCo
e360: 6c 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a  ll, sizeof(char*
e370: 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  )*pIdx->nColumn)
e380: 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  ;.  pIdx->azColl
e390: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a   = (const char**
e3a0: 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72  )zExtra;.  zExtr
e3b0: 61 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61 72  a += sizeof(char
e3c0: 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a  *)*N;.  memcpy(z
e3d0: 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 69 43  Extra, pIdx->aiC
e3e0: 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31  olumn, sizeof(i1
e3f0: 36 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  6)*pIdx->nColumn
e400: 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c  );.  pIdx->aiCol
e410: 75 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78 74  umn = (i16*)zExt
e420: 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20  ra;.  zExtra += 
e430: 73 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20  sizeof(i16)*N;. 
e440: 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20   memcpy(zExtra, 
e450: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
e460: 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  , pIdx->nColumn)
e470: 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ;.  pIdx->aSortO
e480: 72 64 65 72 20 3d 20 28 75 38 2a 29 7a 45 78 74  rder = (u8*)zExt
e490: 72 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c  ra;.  pIdx->nCol
e4a0: 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d  umn = N;.  pIdx-
e4b0: 3e 69 73 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a  >isResized = 1;.
e4c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e4d0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74  OK;.}../*.** Est
e4e0: 69 6d 61 74 65 20 74 68 65 20 74 6f 74 61 6c 20  imate the total 
e4f0: 72 6f 77 20 77 69 64 74 68 20 66 6f 72 20 61 20  row width for a 
e500: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
e510: 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65 54 61   void estimateTa
e520: 62 6c 65 57 69 64 74 68 28 54 61 62 6c 65 20 2a  bleWidth(Table *
e530: 70 54 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pTab){.  unsigne
e540: 64 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  d wTable = 0;.  
e550: 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54  const Column *pT
e560: 61 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  abCol;.  int i;.
e570: 20 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43    for(i=pTab->nC
e580: 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62  ol, pTabCol=pTab
e590: 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d  ->aCol; i>0; i--
e5a0: 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20  , pTabCol++){.  
e5b0: 20 20 77 54 61 62 6c 65 20 2b 3d 20 70 54 61 62    wTable += pTab
e5c0: 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a  Col->szEst;.  }.
e5d0: 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
e5e0: 79 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a  y<0 ) wTable++;.
e5f0: 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77    pTab->szTabRow
e600: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
e610: 28 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f  (wTable*4);.}../
e620: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
e630: 65 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f  e average size o
e640: 66 20 61 20 72 6f 77 20 66 6f 72 20 61 6e 20 69  f a row for an i
e650: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
e660: 76 6f 69 64 20 65 73 74 69 6d 61 74 65 49 6e 64  void estimateInd
e670: 65 78 57 69 64 74 68 28 49 6e 64 65 78 20 2a 70  exWidth(Index *p
e680: 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Idx){.  unsigned
e690: 20 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69   wIndex = 0;.  i
e6a0: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f  nt i;.  const Co
e6b0: 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64  lumn *aCol = pId
e6c0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b  x->pTable->aCol;
e6d0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
e6e0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
e6f0: 29 7b 0a 20 20 20 20 69 31 36 20 78 20 3d 20 70  ){.    i16 x = p
e700: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
e710: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 78 3c  ;.    assert( x<
e720: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43  pIdx->pTable->nC
e730: 6f 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78  ol );.    wIndex
e740: 20 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61 43   += x<0 ? 1 : aC
e750: 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  ol[pIdx->aiColum
e760: 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d  n[i]].szEst;.  }
e770: 0a 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  .  pIdx->szIdxRo
e780: 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
e790: 74 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a  t(wIndex*4);.}..
e7a0: 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  /* Return true i
e7b0: 66 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  f column number 
e7c0: 78 20 69 73 20 61 6e 79 20 6f 66 20 74 68 65 20  x is any of the 
e7d0: 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69  first nCol entri
e7e0: 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d 2e 0a 2a  es of aiCol[]..*
e7f0: 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74  * This is used t
e800: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
e810: 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  he column number
e820: 20 78 20 61 70 70 65 61 72 73 20 69 6e 20 61 6e   x appears in an
e830: 79 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73  y of the.** firs
e840: 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f  t nCol entries o
e850: 66 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  f an index..*/.s
e860: 74 61 74 69 63 20 69 6e 74 20 68 61 73 43 6f 6c  tatic int hasCol
e870: 75 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a 61  umn(const i16 *a
e880: 69 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20  iCol, int nCol, 
e890: 69 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c 65 28  int x){.  while(
e8a0: 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 7b 0a 20   nCol-- > 0 ){. 
e8b0: 20 20 20 61 73 73 65 72 74 28 20 61 69 43 6f 6c     assert( aiCol
e8c0: 5b 30 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  [0]>=0 );.    if
e8d0: 28 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20  ( x==*(aiCol++) 
e8e0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
e8f0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
e900: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
e910: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
e920: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72 73   any of the firs
e930: 74 20 6e 4b 65 79 20 65 6e 74 72 69 65 73 20 6f  t nKey entries o
e940: 66 20 69 6e 64 65 78 20 70 49 64 78 20 65 78 61  f index pIdx exa
e950: 63 74 6c 79 0a 2a 2a 20 6d 61 74 63 68 20 74 68  ctly.** match th
e960: 65 20 69 43 6f 6c 2d 74 68 20 65 6e 74 72 79 20  e iCol-th entry 
e970: 6f 66 20 70 50 6b 2e 20 20 70 50 6b 20 69 73 20  of pPk.  pPk is 
e980: 61 6c 77 61 79 73 20 61 20 57 49 54 48 4f 55 54  always a WITHOUT
e990: 20 52 4f 57 49 44 0a 2a 2a 20 50 52 49 4d 41 52   ROWID.** PRIMAR
e9a0: 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 20 70 49  Y KEY index.  pI
e9b0: 64 78 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f  dx is an index o
e9c0: 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
e9d0: 2e 20 20 70 49 64 78 20 6d 61 79 0a 2a 2a 20 6f  .  pIdx may.** o
e9e0: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65  r may not be the
e9f0: 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 70   same index as p
ea00: 50 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  Pk..**.** The fi
ea10: 72 73 74 20 6e 4b 65 79 20 65 6e 74 72 69 65 73  rst nKey entries
ea20: 20 6f 66 20 70 49 64 78 20 61 72 65 20 67 75 61   of pIdx are gua
ea30: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6f 72  ranteed to be or
ea40: 64 69 6e 61 72 79 20 63 6f 6c 75 6d 6e 73 2c 0a  dinary columns,.
ea50: 2a 2a 20 6e 6f 74 20 61 20 72 6f 77 69 64 20 6f  ** not a rowid o
ea60: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  r expression..**
ea70: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ea80: 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 68 61   differs from ha
ea90: 73 43 6f 6c 75 6d 6e 28 29 20 69 6e 20 74 68 61  sColumn() in tha
eaa0: 74 20 62 6f 74 68 20 74 68 65 20 63 6f 6c 75 6d  t both the colum
eab0: 6e 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6c  n and the.** col
eac0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
ead0: 6d 75 73 74 20 6d 61 74 63 68 20 66 6f 72 20 74  must match for t
eae0: 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 62 75 74  his routine, but
eaf0: 20 66 6f 72 20 68 61 73 43 6f 6c 75 6d 6e 28 29   for hasColumn()
eb00: 20 6f 6e 6c 79 0a 2a 2a 20 74 68 65 20 63 6f 6c   only.** the col
eb10: 75 6d 6e 20 6e 61 6d 65 20 6d 75 73 74 20 6d 61  umn name must ma
eb20: 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tch..*/.static i
eb30: 6e 74 20 69 73 44 75 70 43 6f 6c 75 6d 6e 28 49  nt isDupColumn(I
eb40: 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20  ndex *pIdx, int 
eb50: 6e 4b 65 79 2c 20 49 6e 64 65 78 20 2a 70 50 6b  nKey, Index *pPk
eb60: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69  , int iCol){.  i
eb70: 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 73 73 65 72  nt i, j;.  asser
eb80: 74 28 20 6e 4b 65 79 3c 3d 70 49 64 78 2d 3e 6e  t( nKey<=pIdx->n
eb90: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65  Column );.  asse
eba0: 72 74 28 20 69 43 6f 6c 3c 4d 41 58 28 70 50 6b  rt( iCol<MAX(pPk
ebb0: 2d 3e 6e 43 6f 6c 75 6d 6e 2c 70 50 6b 2d 3e 6e  ->nColumn,pPk->n
ebc0: 4b 65 79 43 6f 6c 29 20 29 3b 0a 20 20 61 73 73  KeyCol) );.  ass
ebd0: 65 72 74 28 20 70 50 6b 2d 3e 69 64 78 54 79 70  ert( pPk->idxTyp
ebe0: 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e==SQLITE_IDXTYP
ebf0: 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 3b 0a  E_PRIMARYKEY );.
ec00: 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 70    assert( pPk->p
ec10: 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20  Table->tabFlags 
ec20: 26 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69  & TF_WithoutRowi
ec30: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  d );.  assert( p
ec40: 50 6b 2d 3e 70 54 61 62 6c 65 3d 3d 70 49 64 78  Pk->pTable==pIdx
ec50: 2d 3e 70 54 61 62 6c 65 20 29 3b 0a 20 20 74 65  ->pTable );.  te
ec60: 73 74 63 61 73 65 28 20 70 50 6b 3d 3d 70 49 64  stcase( pPk==pId
ec70: 78 20 29 3b 0a 20 20 6a 20 3d 20 70 50 6b 2d 3e  x );.  j = pPk->
ec80: 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 3b 0a  aiColumn[iCol];.
ec90: 20 20 61 73 73 65 72 74 28 20 6a 21 3d 58 4e 5f    assert( j!=XN_
eca0: 52 4f 57 49 44 20 26 26 20 6a 21 3d 58 4e 5f 45  ROWID && j!=XN_E
ecb0: 58 50 52 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  XPR );.  for(i=0
ecc0: 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a  ; i<nKey; i++){.
ecd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
ece0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30  ->aiColumn[i]>=0
ecf0: 20 7c 7c 20 6a 3e 3d 30 20 29 3b 0a 20 20 20 20   || j>=0 );.    
ed00: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
ed10: 6d 6e 5b 69 5d 3d 3d 6a 20 0a 20 20 20 20 20 26  mn[i]==j .     &
ed20: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
ed30: 28 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  (pIdx->azColl[i]
ed40: 2c 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 43  , pPk->azColl[iC
ed50: 6f 6c 5d 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  ol])==0.    ){. 
ed60: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
ed70: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
ed80: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 63 6f 6d  n 0;.}../* Recom
ed90: 70 75 74 65 20 74 68 65 20 63 6f 6c 4e 6f 74 49  pute the colNotI
eda0: 64 78 65 64 20 66 69 65 6c 64 20 6f 66 20 74 68  dxed field of th
edb0: 65 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 63  e Index..**.** c
edc0: 6f 6c 4e 6f 74 49 64 78 65 64 20 69 73 20 61 20  olNotIdxed is a 
edd0: 62 69 74 6d 61 73 6b 20 74 68 61 74 20 68 61 73  bitmask that has
ede0: 20 61 20 30 20 62 69 74 20 72 65 70 72 65 73 65   a 0 bit represe
edf0: 6e 74 69 6e 67 20 65 61 63 68 20 69 6e 64 65 78  nting each index
ee00: 65 64 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68  ed.** columns th
ee10: 61 74 20 61 72 65 20 77 69 74 68 69 6e 20 74 68  at are within th
ee20: 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d  e first 63 colum
ee30: 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ns of the table.
ee40: 20 20 54 68 65 0a 2a 2a 20 68 69 67 68 2d 6f 72    The.** high-or
ee50: 64 65 72 20 62 69 74 20 6f 66 20 63 6f 6c 4e 6f  der bit of colNo
ee60: 74 49 64 78 65 64 20 69 73 20 61 6c 77 61 79 73  tIdxed is always
ee70: 20 31 2e 20 20 41 6c 6c 20 75 6e 69 6e 64 65 78   1.  All unindex
ee80: 65 64 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66  ed columns.** of
ee90: 20 74 68 65 20 74 61 62 6c 65 20 68 61 76 65 20   the table have 
eea0: 61 20 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  a 1..**.** The c
eeb0: 6f 6c 4e 6f 74 49 64 78 65 64 20 6d 61 73 6b 20  olNotIdxed mask 
eec0: 69 73 20 41 4e 44 2d 65 64 20 77 69 74 68 20 74  is AND-ed with t
eed0: 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63  he SrcList.a[].c
eee0: 6f 6c 55 73 65 64 20 6d 61 73 6b 0a 2a 2a 20 74  olUsed mask.** t
eef0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
ef00: 68 65 20 69 6e 64 65 78 20 69 73 20 63 6f 76 65  he index is cove
ef10: 72 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  ring index..*/.s
ef20: 74 61 74 69 63 20 76 6f 69 64 20 72 65 63 6f 6d  tatic void recom
ef30: 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e  puteColumnsNotIn
ef40: 64 65 78 65 64 28 49 6e 64 65 78 20 2a 70 49 64  dexed(Index *pId
ef50: 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20  x){.  Bitmask m 
ef60: 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
ef70: 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c  for(j=pIdx->nCol
ef80: 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  umn-1; j>=0; j--
ef90: 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70  ){.    int x = p
efa0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
efb0: 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29  ;.    if( x>=0 )
efc0: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
efd0: 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  ( x==BMS-1 );.  
efe0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
eff0: 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20  =BMS-2 );.      
f000: 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20  if( x<BMS-1 ) m 
f010: 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20  |= MASKBIT(x);. 
f020: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 64 78 2d     }.  }.  pIdx-
f030: 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 20 3d 20 7e  >colNotIdxed = ~
f040: 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49  m;.  assert( (pI
f050: 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 3e  dx->colNotIdxed>
f060: 3e 36 33 29 3d 3d 31 20 29 3b 0a 7d 0a 0a 2f 2a  >63)==1 );.}../*
f070: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f080: 20 72 75 6e 73 20 61 74 20 74 68 65 20 65 6e 64   runs at the end
f090: 20 6f 66 20 70 61 72 73 69 6e 67 20 61 20 43 52   of parsing a CR
f0a0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
f0b0: 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 68 61 73  ment that.** has
f0c0: 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
f0d0: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6a 6f   clause.  The jo
f0e0: 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
f0f0: 65 20 69 73 20 74 6f 20 63 6f 6e 76 65 72 74 20  e is to convert 
f100: 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c  both.** internal
f110: 20 73 63 68 65 6d 61 20 64 61 74 61 20 73 74 72   schema data str
f120: 75 63 74 75 72 65 73 20 61 6e 64 20 74 68 65 20  uctures and the 
f130: 67 65 6e 65 72 61 74 65 64 20 56 44 42 45 20 63  generated VDBE c
f140: 6f 64 65 20 73 6f 20 74 68 61 74 20 74 68 65 79  ode so that they
f150: 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f 70 72 69  .** are appropri
f160: 61 74 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55  ate for a WITHOU
f170: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20 69 6e  T ROWID table in
f180: 73 74 65 61 64 20 6f 66 20 61 20 72 6f 77 69 64  stead of a rowid
f190: 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67   table..** Chang
f1a0: 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a  es include:.**.*
f1b0: 2a 20 20 20 20 20 28 31 29 20 20 53 65 74 20 61  *     (1)  Set a
f1c0: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  ll columns of th
f1d0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 73 63  e PRIMARY KEY sc
f1e0: 68 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f 20 62  hema object to b
f1f0: 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20  e NOT NULL..**  
f200: 20 20 20 28 32 29 20 20 43 6f 6e 76 65 72 74 20     (2)  Convert 
f210: 50 33 20 70 61 72 61 6d 65 74 65 72 20 6f 66 20  P3 parameter of 
f220: 74 68 65 20 4f 50 5f 43 72 65 61 74 65 42 74 72  the OP_CreateBtr
f230: 65 65 20 66 72 6f 6d 20 42 54 52 45 45 5f 49 4e  ee from BTREE_IN
f240: 54 4b 45 59 20 0a 2a 2a 20 20 20 20 20 20 20 20  TKEY .**        
f250: 20 20 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f    into BTREE_BLO
f260: 42 4b 45 59 2e 0a 2a 2a 20 20 20 20 20 28 33 29  BKEY..**     (3)
f270: 20 20 42 79 70 61 73 73 20 74 68 65 20 63 72 65    Bypass the cre
f280: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c  ation of the sql
f290: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
f2a0: 20 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20 20   entry.**       
f2b0: 20 20 20 66 6f 72 20 74 68 65 20 50 52 49 4d 41     for the PRIMA
f2c0: 52 59 20 4b 45 59 20 61 73 20 74 68 65 20 70 72  RY KEY as the pr
f2d0: 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20  imary key index 
f2e0: 69 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20  is now.**       
f2f0: 20 20 20 69 64 65 6e 74 69 66 69 65 64 20 62 79     identified by
f300: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
f310: 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6f  er table entry o
f320: 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65  f the table itse
f330: 6c 66 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 20  lf..**     (4)  
f340: 53 65 74 20 74 68 65 20 49 6e 64 65 78 2e 74 6e  Set the Index.tn
f350: 75 6d 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  um of the PRIMAR
f360: 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65  Y KEY Index obje
f370: 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20  ct in the.**    
f380: 20 20 20 20 20 20 73 63 68 65 6d 61 20 74 6f 20        schema to 
f390: 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 72 6f  the rootpage fro
f3a0: 6d 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  m the main table
f3b0: 2e 0a 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64  ..**     (5)  Ad
f3c0: 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75  d all table colu
f3d0: 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41  mns to the PRIMA
f3e0: 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a  RY KEY Index obj
f3f0: 65 63 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ect.**          
f400: 73 6f 20 74 68 61 74 20 74 68 65 20 50 52 49 4d  so that the PRIM
f410: 41 52 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76  ARY KEY is a cov
f420: 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68  ering index.  Th
f430: 65 20 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20  e surplus.**    
f440: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72        columns ar
f450: 65 20 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66  e part of KeyInf
f460: 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20 61 6e 64 20  o.nAllField and 
f470: 61 72 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72  are not used for
f480: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 72  .**          sor
f490: 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f  ting or lookup o
f4a0: 72 20 75 6e 69 71 75 65 6e 65 73 73 20 63 68 65  r uniqueness che
f4b0: 63 6b 73 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20  cks..**     (6) 
f4c0: 20 52 65 70 6c 61 63 65 20 74 68 65 20 72 6f 77   Replace the row
f4d0: 69 64 20 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61  id tail on all a
f4e0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e  utomatically gen
f4f0: 65 72 61 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a  erated UNIQUE.**
f500: 20 20 20 20 20 20 20 20 20 20 69 6e 64 69 63 65            indice
f510: 73 20 77 69 74 68 20 74 68 65 20 50 52 49 4d 41  s with the PRIMA
f520: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a  RY KEY columns..
f530: 2a 2a 0a 2a 2a 20 46 6f 72 20 76 69 72 74 75 61  **.** For virtua
f540: 6c 20 74 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 28  l tables, only (
f550: 31 29 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  1) is performed.
f560: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f570: 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74  convertToWithout
f580: 52 6f 77 69 64 54 61 62 6c 65 28 50 61 72 73 65  RowidTable(Parse
f590: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
f5a0: 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20  *pTab){.  Index 
f5b0: 2a 70 49 64 78 3b 0a 20 20 49 6e 64 65 78 20 2a  *pIdx;.  Index *
f5c0: 70 50 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a  pPk;.  int nPk;.
f5d0: 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20 20    int nExtra;.  
f5e0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
f5f0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
f600: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
f610: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
f620: 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 65 76 65 72  ..  /* Mark ever
f630: 79 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  y PRIMARY KEY co
f640: 6c 75 6d 6e 20 61 73 20 4e 4f 54 20 4e 55 4c 4c  lumn as NOT NULL
f650: 20 28 65 78 63 65 70 74 20 66 6f 72 20 69 6d 70   (except for imp
f660: 6f 73 74 65 72 20 74 61 62 6c 65 73 29 0a 20 20  oster tables).  
f670: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
f680: 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65  it.imposterTable
f690: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
f6a0: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
f6b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
f6c0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f  pTab->aCol[i].co
f6d0: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
f6e0: 5f 50 52 49 4d 4b 45 59 29 21 3d 30 20 29 7b 0a  _PRIMKEY)!=0 ){.
f6f0: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
f700: 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20  ol[i].notNull = 
f710: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  OE_Abort;.      
f720: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
f730: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 50 33  * Convert the P3
f740: 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20   operand of the 
f750: 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 20 6f  OP_CreateBtree o
f760: 70 63 6f 64 65 20 66 72 6f 6d 20 42 54 52 45 45  pcode from BTREE
f770: 5f 49 4e 54 4b 45 59 0a 20 20 2a 2a 20 69 6e 74  _INTKEY.  ** int
f780: 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 2e  o BTREE_BLOBKEY.
f790: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
f7a0: 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 29 7b  se->addrCrTab ){
f7b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 20 29  .    assert( v )
f7c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f7d0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 70 50 61  eChangeP3(v, pPa
f7e0: 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 2c 20  rse->addrCrTab, 
f7f0: 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a  BTREE_BLOBKEY);.
f800: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
f810: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
f820: 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69 66 20   index.  Or, if 
f830: 74 68 69 73 20 74 61 62 6c 65 20 77 61 73 20 6f  this table was o
f840: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61  riginally.  ** a
f850: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
f860: 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63 72 65  Y KEY table, cre
f870: 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d 41 52  ate a new PRIMAR
f880: 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a 20 20  Y KEY index. .  
f890: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69  */.  if( pTab->i
f8a0: 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 45  PKey>=0 ){.    E
f8b0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
f8c0: 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b 54 6f 6b      Token ipkTok
f8d0: 65 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  en;.    sqlite3T
f8e0: 6f 6b 65 6e 49 6e 69 74 28 26 69 70 6b 54 6f 6b  okenInit(&ipkTok
f8f0: 65 6e 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  en, pTab->aCol[p
f900: 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d  Tab->iPKey].zNam
f910: 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  e);.    pList = 
f920: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
f930: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
f940: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
f950: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
f960: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20  lloc(db, TK_ID, 
f970: 26 69 70 6b 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a  &ipkToken, 0));.
f980: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
f990: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
f9a0: 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
f9b0: 45 43 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ECT ){.      sql
f9c0: 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52  ite3RenameTokenR
f9d0: 65 6d 61 70 28 70 50 61 72 73 65 2c 20 70 4c 69  emap(pParse, pLi
f9e0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
f9f0: 26 70 54 61 62 2d 3e 69 50 4b 65 79 29 3b 0a 20  &pTab->iPKey);. 
fa00: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
fa10: 61 5b 30 5d 2e 73 6f 72 74 46 6c 61 67 73 20 3d  a[0].sortFlags =
fa20: 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74   pParse->iPkSort
fa30: 4f 72 64 65 72 3b 0a 20 20 20 20 61 73 73 65 72  Order;.    asser
fa40: 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  t( pParse->pNewT
fa50: 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20  able==pTab );.  
fa60: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
fa70: 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  -1;.    sqlite3C
fa80: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
fa90: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73  e, 0, 0, 0, pLis
faa0: 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66  t, pTab->keyConf
fab0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
fac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fad0: 20 20 20 20 20 53 51 4c 49 54 45 5f 49 44 58 54       SQLITE_IDXT
fae0: 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b  YPE_PRIMARYKEY);
faf0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
fb00: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
fb10: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
fb20: 72 6e 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71  rn;.    pPk = sq
fb30: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
fb40: 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
fb50: 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e 4b 65  assert( pPk->nKe
fb60: 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 7d 65 6c  yCol==1 );.  }el
fb70: 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71  se{.    pPk = sq
fb80: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
fb90: 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
fba0: 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29  assert( pPk!=0 )
fbb0: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ;..    /*.    **
fbc0: 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 64 75   Remove all redu
fbd0: 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 20 66 72  ndant columns fr
fbe0: 6f 6d 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  om the PRIMARY K
fbf0: 45 59 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  EY.  For example
fc00: 2c 20 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20  , change.    ** 
fc10: 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62  "PRIMARY KEY(a,b
fc20: 2c 61 2c 62 2c 63 2c 62 2c 63 2c 64 29 22 20 69  ,a,b,c,b,c,d)" i
fc30: 6e 74 6f 20 6a 75 73 74 20 22 50 52 49 4d 41 52  nto just "PRIMAR
fc40: 59 20 4b 45 59 28 61 2c 62 2c 63 2c 64 29 22 2e  Y KEY(a,b,c,d)".
fc50: 20 20 4c 61 74 65 72 0a 20 20 20 20 2a 2a 20 63    Later.    ** c
fc60: 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 65 20  ode assumes the 
fc70: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 74  PRIMARY KEY cont
fc80: 61 69 6e 73 20 6e 6f 20 72 65 70 65 61 74 65 64  ains no repeated
fc90: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f   columns..    */
fca0: 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20  .    for(i=j=1; 
fcb0: 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  i<pPk->nKeyCol; 
fcc0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
fcd0: 69 73 44 75 70 43 6f 6c 75 6d 6e 28 70 50 6b 2c  isDupColumn(pPk,
fce0: 20 6a 2c 20 70 50 6b 2c 20 69 29 20 29 7b 0a 20   j, pPk, i) ){. 
fcf0: 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c         pPk->nCol
fd00: 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c  umn--;.      }el
fd10: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
fd20: 63 61 73 65 28 20 68 61 73 43 6f 6c 75 6d 6e 28  case( hasColumn(
fd30: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a  pPk->aiColumn, j
fd40: 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
fd50: 69 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  i]) );.        p
fd60: 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20  Pk->azColl[j] = 
fd70: 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  pPk->azColl[i];.
fd80: 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 53 6f          pPk->aSo
fd90: 72 74 4f 72 64 65 72 5b 6a 5d 20 3d 20 70 50 6b  rtOrder[j] = pPk
fda0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b  ->aSortOrder[i];
fdb0: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69  .        pPk->ai
fdc0: 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50  Column[j++] = pP
fdd0: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  k->aiColumn[i];.
fde0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
fdf0: 20 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d    pPk->nKeyCol =
fe00: 20 6a 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   j;.  }.  assert
fe10: 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20 70 50  ( pPk!=0 );.  pP
fe20: 6b 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20  k->isCovering = 
fe30: 31 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  1;.  if( !db->in
fe40: 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65  it.imposterTable
fe50: 20 29 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e   ) pPk->uniqNotN
fe60: 75 6c 6c 20 3d 20 31 3b 0a 20 20 6e 50 6b 20 3d  ull = 1;.  nPk =
fe70: 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20   pPk->nColumn = 
fe80: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20  pPk->nKeyCol;.. 
fe90: 20 2f 2a 20 42 79 70 61 73 73 20 74 68 65 20 63   /* Bypass the c
fea0: 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50  reation of the P
feb0: 52 49 4d 41 52 59 20 4b 45 59 20 62 74 72 65 65  RIMARY KEY btree
fec0: 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f   and the sqlite_
fed0: 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c  master.  ** tabl
fee0: 65 20 65 6e 74 72 79 2e 20 54 68 69 73 20 69 73  e entry. This is
fef0: 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69   only required i
ff00: 66 20 63 75 72 72 65 6e 74 6c 79 20 67 65 6e 65  f currently gene
ff10: 72 61 74 69 6e 67 20 56 44 42 45 0a 20 20 2a 2a  rating VDBE.  **
ff20: 20 63 6f 64 65 20 66 6f 72 20 61 20 43 52 45 41   code for a CREA
ff30: 54 45 20 54 41 42 4c 45 20 28 6e 6f 74 20 77 68  TE TABLE (not wh
ff40: 65 6e 20 70 61 72 73 69 6e 67 20 6f 6e 65 20 61  en parsing one a
ff50: 73 20 70 61 72 74 20 6f 66 20 72 65 61 64 69 6e  s part of readin
ff60: 67 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73  g.  ** a databas
ff70: 65 20 73 63 68 65 6d 61 29 2e 20 20 2a 2f 0a 20  e schema).  */. 
ff80: 20 69 66 28 20 76 20 26 26 20 70 50 6b 2d 3e 74   if( v && pPk->t
ff90: 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 61 73 73  num>0 ){.    ass
ffa0: 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75  ert( db->init.bu
ffb0: 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  sy==0 );.    sql
ffc0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70  ite3VdbeChangeOp
ffd0: 63 6f 64 65 28 76 2c 20 70 50 6b 2d 3e 74 6e 75  code(v, pPk->tnu
ffe0: 6d 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d  m, OP_Goto);.  }
fff0: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20  ..  /* The root 
10000 70 61 67 65 20 6f 66 20 74 68 65 20 50 52 49 4d  page of the PRIM
10010 41 52 59 20 4b 45 59 20 69 73 20 74 68 65 20 74  ARY KEY is the t
10020 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 20 2a  able root page *
10030 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20  /.  pPk->tnum = 
10040 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f  pTab->tnum;..  /
10050 2a 20 55 70 64 61 74 65 20 74 68 65 20 69 6e 2d  * Update the in-
10060 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
10070 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e 49  ation of all UNI
10080 51 55 45 20 69 6e 64 69 63 65 73 20 62 79 20 63  QUE indices by c
10090 6f 6e 76 65 72 74 69 6e 67 0a 20 20 2a 2a 20 74  onverting.  ** t
100a0 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 20 63  he final rowid c
100b0 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f  olumn into one o
100c0 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f  r more columns o
100d0 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
100e0 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49  Y..  */.  for(pI
100f0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
10100 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
10110 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
10120 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 49 73 50  t n;.    if( IsP
10130 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
10140 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Idx) ) continue;
10150 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20  .    for(i=n=0; 
10160 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nPk; i++){.   
10170 20 20 20 69 66 28 20 21 69 73 44 75 70 43 6f 6c     if( !isDupCol
10180 75 6d 6e 28 70 49 64 78 2c 20 70 49 64 78 2d 3e  umn(pIdx, pIdx->
10190 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2c 20 69 29  nKeyCol, pPk, i)
101a0 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
101b0 63 61 73 65 28 20 68 61 73 43 6f 6c 75 6d 6e 28  case( hasColumn(
101c0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  pIdx->aiColumn, 
101d0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70  pIdx->nKeyCol, p
101e0 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29  Pk->aiColumn[i])
101f0 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b   );.        n++;
10200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10210 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
10220 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64       /* This ind
10230 65 78 20 69 73 20 61 20 73 75 70 65 72 73 65 74  ex is a superset
10240 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   of the primary 
10250 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 70 49 64  key */.      pId
10260 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 64  x->nColumn = pId
10270 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20  x->nKeyCol;.    
10280 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
10290 7d 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65  }.    if( resize
102a0 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20  IndexObject(db, 
102b0 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  pIdx, pIdx->nKey
102c0 43 6f 6c 2b 6e 29 20 29 20 72 65 74 75 72 6e 3b  Col+n) ) return;
102d0 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d  .    for(i=0, j=
102e0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  pIdx->nKeyCol; i
102f0 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nPk; i++){.    
10300 20 20 69 66 28 20 21 69 73 44 75 70 43 6f 6c 75    if( !isDupColu
10310 6d 6e 28 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e  mn(pIdx, pIdx->n
10320 4b 65 79 43 6f 6c 2c 20 70 50 6b 2c 20 69 29 20  KeyCol, pPk, i) 
10330 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
10340 61 73 65 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70  ase( hasColumn(p
10350 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70  Idx->aiColumn, p
10360 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50  Idx->nKeyCol, pP
10370 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20  k->aiColumn[i]) 
10380 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  );.        pIdx-
10390 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70  >aiColumn[j] = p
103a0 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  Pk->aiColumn[i];
103b0 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
103c0 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e  zColl[j] = pPk->
103d0 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  azColl[i];.     
103e0 20 20 20 69 66 28 20 70 50 6b 2d 3e 61 53 6f 72     if( pPk->aSor
103f0 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20  tOrder[i] ){.   
10400 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 74 69         /* See ti
10410 63 6b 65 74 20 68 74 74 70 73 3a 2f 2f 77 77 77  cket https://www
10420 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f  .sqlite.org/src/
10430 69 6e 66 6f 2f 62 62 61 37 62 36 39 66 39 38 34  info/bba7b69f984
10440 39 62 35 62 66 20 2a 2f 0a 20 20 20 20 20 20 20  9b5bf */.       
10450 20 20 20 70 49 64 78 2d 3e 62 41 73 63 4b 65 79     pIdx->bAscKey
10460 42 75 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Bug = 1;.       
10470 20 7d 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a   }.        j++;.
10480 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10490 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
104a0 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e  nColumn>=pIdx->n
104b0 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20  KeyCol+n );.    
104c0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
104d0 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a  olumn>=j );.  }.
104e0 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61  .  /* Add all ta
104f0 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  ble columns to t
10500 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
10510 6e 64 65 78 0a 20 20 2a 2f 0a 20 20 6e 45 78 74  ndex.  */.  nExt
10520 72 61 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ra = 0;.  for(i=
10530 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
10540 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   i++){.    if( !
10550 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61  hasColumn(pPk->a
10560 69 43 6f 6c 75 6d 6e 2c 20 6e 50 6b 2c 20 69 29  iColumn, nPk, i)
10570 20 29 20 6e 45 78 74 72 61 2b 2b 3b 0a 20 20 7d   ) nExtra++;.  }
10580 0a 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64  .  if( resizeInd
10590 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 50 6b  exObject(db, pPk
105a0 2c 20 6e 50 6b 2b 6e 45 78 74 72 61 29 20 29 20  , nPk+nExtra) ) 
105b0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
105c0 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54 61 62  0, j=nPk; i<pTab
105d0 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
105e0 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e    if( !hasColumn
105f0 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  (pPk->aiColumn, 
10600 6a 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20 61  j, i) ){.      a
10610 73 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43  ssert( j<pPk->nC
10620 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 70  olumn );.      p
10630 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20  Pk->aiColumn[j] 
10640 3d 20 69 3b 0a 20 20 20 20 20 20 70 50 6b 2d 3e  = i;.      pPk->
10650 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 73 71 6c 69  azColl[j] = sqli
10660 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20  te3StrBINARY;.  
10670 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20      j++;.    }. 
10680 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 6b   }.  assert( pPk
10690 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a  ->nColumn==j );.
106a0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
106b0 6e 43 6f 6c 3c 3d 6a 20 29 3b 0a 20 20 72 65 63  nCol<=j );.  rec
106c0 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74  omputeColumnsNot
106d0 49 6e 64 65 78 65 64 28 70 50 6b 29 3b 0a 7d 0a  Indexed(pPk);.}.
106e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
106f0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
10700 45 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  E./*.** Return t
10710 72 75 65 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  rue if zName is 
10720 61 20 73 68 61 64 6f 77 20 74 61 62 6c 65 20 6e  a shadow table n
10730 61 6d 65 20 69 6e 20 74 68 65 20 63 75 72 72 65  ame in the curre
10740 6e 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  nt database.** c
10750 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
10760 20 7a 4e 61 6d 65 20 69 73 20 74 65 6d 70 6f 72   zName is tempor
10770 61 72 69 6c 79 20 6d 6f 64 69 66 69 65 64 20 77  arily modified w
10780 68 69 6c 65 20 74 68 69 73 20 72 6f 75 74 69 6e  hile this routin
10790 65 20 69 73 20 72 75 6e 6e 69 6e 67 2c 20 62 75  e is running, bu
107a0 74 20 69 73 0a 2a 2a 20 72 65 73 74 6f 72 65 64  t is.** restored
107b0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
107c0 20 76 61 6c 75 65 20 70 72 69 6f 72 20 74 6f 20   value prior to 
107d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
107e0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
107f0 63 20 69 6e 74 20 69 73 53 68 61 64 6f 77 54 61  c int isShadowTa
10800 62 6c 65 4e 61 6d 65 28 73 71 6c 69 74 65 33 20  bleName(sqlite3 
10810 2a 64 62 2c 20 63 68 61 72 20 2a 7a 4e 61 6d 65  *db, char *zName
10820 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 61 69 6c  ){.  char *zTail
10830 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10840 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
10850 20 74 68 65 20 6c 61 73 74 20 22 5f 22 20 69 6e   the last "_" in
10860 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c   zName */.  Tabl
10870 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
10880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
10890 6c 65 20 74 68 61 74 20 7a 4e 61 6d 65 20 69 73  le that zName is
108a0 20 61 20 73 68 61 64 6f 77 20 6f 66 20 2a 2f 0a   a shadow of */.
108b0 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 3b 20    Module *pMod; 
108c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108d0 2f 2a 20 4d 6f 64 75 6c 65 20 66 6f 72 20 74 68  /* Module for th
108e0 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
108f0 2a 2f 0a 0a 20 20 7a 54 61 69 6c 20 3d 20 73 74  */..  zTail = st
10900 72 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27 5f 27  rrchr(zName, '_'
10910 29 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 3d 3d  );.  if( zTail==
10920 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
10930 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 70 54  *zTail = 0;.  pT
10940 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
10950 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
10960 20 30 29 3b 0a 20 20 2a 7a 54 61 69 6c 20 3d 20   0);.  *zTail = 
10970 27 5f 27 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  '_';.  if( pTab=
10980 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
10990 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28   if( !IsVirtual(
109a0 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
109b0 3b 0a 20 20 70 4d 6f 64 20 3d 20 28 4d 6f 64 75  ;.  pMod = (Modu
109c0 6c 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46  le*)sqlite3HashF
109d0 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  ind(&db->aModule
109e0 2c 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65  , pTab->azModule
109f0 41 72 67 5b 30 5d 29 3b 0a 20 20 69 66 28 20 70  Arg[0]);.  if( p
10a00 4d 6f 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Mod==0 ) return 
10a10 30 3b 0a 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70  0;.  if( pMod->p
10a20 4d 6f 64 75 6c 65 2d 3e 69 56 65 72 73 69 6f 6e  Module->iVersion
10a30 3c 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  <3 ) return 0;. 
10a40 20 69 66 28 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75   if( pMod->pModu
10a50 6c 65 2d 3e 78 53 68 61 64 6f 77 4e 61 6d 65 3d  le->xShadowName=
10a60 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
10a70 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e 70 4d   return pMod->pM
10a80 6f 64 75 6c 65 2d 3e 78 53 68 61 64 6f 77 4e 61  odule->xShadowNa
10a90 6d 65 28 7a 54 61 69 6c 2b 31 29 3b 0a 7d 0a 23  me(zTail+1);.}.#
10aa0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 69 73  else.# define is
10ab0 53 68 61 64 6f 77 54 61 62 6c 65 4e 61 6d 65 28  ShadowTableName(
10ac0 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 20 2f 2a  x,y) 0.#endif /*
10ad0 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
10ae0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
10af0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
10b00 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
10b10 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20  d to report the 
10b20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74  final ")" that t
10b30 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43  erminates.** a C
10b40 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
10b50 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
10b60 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
10b70 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69   that other acti
10b80 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65  on routines have
10b90 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a   been building.*
10ba0 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
10bb0 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  e internal hash 
10bc0 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67  tables, assuming
10bd0 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a   no errors have.
10be0 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a  ** occurred..**.
10bf0 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20  ** An entry for 
10c00 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64  the table is mad
10c10 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  e in the master 
10c20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75  table on disk, u
10c30 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73  nless.** this is
10c40 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
10c50 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62  le or db->init.b
10c60 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62  usy==1.  When db
10c70 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a  ->init.busy==1.*
10c80 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  * it means we ar
10c90 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e reading the sq
10ca0 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
10cb0 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  e because we jus
10cc0 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74  t.** connected t
10cd0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
10ce0 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71  r because the sq
10cf0 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
10d00 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c  e has.** recentl
10d10 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68  y changed, so th
10d20 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  e entry for this
10d30 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
10d40 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20  xists in.** the 
10d50 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
10d60 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ble.  We do not 
10d70 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69  want to create i
10d80 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49  t again..**.** I
10d90 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72  f the pSelect ar
10da0 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
10db0 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
10dc0 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
10dd0 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  * was called to 
10de0 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67  create a table g
10df0 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20  enerated from a 
10e00 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c  .** "CREATE TABL
10e10 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20  E ... AS SELECT 
10e20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20  ..." statement. 
10e30 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
10e40 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  s of.** the new 
10e50 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68  table will match
10e60 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
10e70 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  of the SELECT..*
10e80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e  /.void sqlite3En
10e90 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  dTable(.  Parse 
10ea0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
10eb0 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
10ec0 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
10ed0 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20  Cons,           
10ee0 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e  /* The ',' token
10ef0 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
10f00 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a  column defn. */.
10f10 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20    Token *pEnd,  
10f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10f30 20 27 29 27 20 62 65 66 6f 72 65 20 6f 70 74 69   ')' before opti
10f40 6f 6e 73 20 69 6e 20 74 68 65 20 43 52 45 41 54  ons in the CREAT
10f50 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38 20  E TABLE */.  u8 
10f60 74 61 62 4f 70 74 73 2c 20 20 20 20 20 20 20 20  tabOpts,        
10f70 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 74 61       /* Extra ta
10f80 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55 73 75  ble options. Usu
10f90 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53 65 6c  ally 0. */.  Sel
10fa0 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20  ect *pSelect    
10fb0 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66       /* Select f
10fc0 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e  rom a "CREATE ..
10fd0 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a  . AS SELECT" */.
10fe0 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20 20  ){.  Table *p;  
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11000 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
11010 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
11020 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f   = pParse->db; /
11030 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
11040 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
11050 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
11060 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
11070 62 61 73 65 20 69 6e 20 77 68 69 63 68 20 74 68  base in which th
11080 65 20 74 61 62 6c 65 20 6c 69 76 65 73 20 2a 2f  e table lives */
11090 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
110b0 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78  An implied index
110c0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   of the table */
110d0 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d 30 20  ..  if( pEnd==0 
110e0 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  && pSelect==0 ){
110f0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
11100 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
11110 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
11120 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
11130 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
11140 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
11150 70 2d 3e 6e 4e 56 43 6f 6c 20 3d 20 70 2d 3e 6e  p->nNVCol = p->n
11160 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c  Col;..  if( pSel
11170 65 63 74 3d 3d 30 20 26 26 20 69 73 53 68 61 64  ect==0 && isShad
11180 6f 77 54 61 62 6c 65 4e 61 6d 65 28 64 62 2c 20  owTableName(db, 
11190 70 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  p->zName) ){.   
111a0 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20   p->tabFlags |= 
111b0 54 46 5f 53 68 61 64 6f 77 3b 0a 20 20 7d 0a 0a  TF_Shadow;.  }..
111c0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
111d0 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
111e0 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
111f0 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
11200 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
11210 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
11220 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
11230 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
11240 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
11250 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
11260 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
11270 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
11280 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
11290 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
112a0 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
112b0 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
112c0 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
112d0 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
112e0 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
112f0 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
11300 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
11310 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
11320 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
11330 65 72 20 69 73 20 31 2c 20 74 68 61 74 20 6d 65  er is 1, that me
11340 61 6e 73 20 74 68 69 73 20 69 73 20 74 68 65 20  ans this is the 
11350 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20  sqlite_master.  
11360 2a 2a 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e  ** table itself.
11370 20 20 53 6f 20 6d 61 72 6b 20 69 74 20 72 65 61    So mark it rea
11380 64 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  d-only..  */.  i
11390 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
113a0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 65 6c   ){.    if( pSel
113b0 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
113c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
113d0 72 73 65 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  rse, "");.      
113e0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
113f0 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e    p->tnum = db->
11400 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20  init.newTnum;.  
11410 20 20 69 66 28 20 70 2d 3e 74 6e 75 6d 3d 3d 31    if( p->tnum==1
11420 20 29 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c   ) p->tabFlags |
11430 3d 20 54 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a 20  = TF_Readonly;. 
11440 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70   }..  assert( (p
11450 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
11460 48 61 73 50 72 69 6d 61 72 79 4b 65 79 29 3d 3d  HasPrimaryKey)==
11470 30 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 69  0.       || p->i
11480 50 4b 65 79 3e 3d 30 20 7c 7c 20 73 71 6c 69 74  PKey>=0 || sqlit
11490 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
114a0 78 28 70 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  x(p)!=0 );.  ass
114b0 65 72 74 28 20 28 70 2d 3e 74 61 62 46 6c 61 67  ert( (p->tabFlag
114c0 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72  s & TF_HasPrimar
114d0 79 4b 65 79 29 21 3d 30 0a 20 20 20 20 20 20 20  yKey)!=0.       
114e0 7c 7c 20 28 70 2d 3e 69 50 4b 65 79 3c 30 20 26  || (p->iPKey<0 &
114f0 26 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  & sqlite3Primary
11500 4b 65 79 49 6e 64 65 78 28 70 29 3d 3d 30 29 20  KeyIndex(p)==0) 
11510 29 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c  );..  /* Special
11520 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
11530 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 54 61  WITHOUT ROWID Ta
11540 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 74 61  bles */.  if( ta
11550 62 4f 70 74 73 20 26 20 54 46 5f 57 69 74 68 6f  bOpts & TF_Witho
11560 75 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69  utRowid ){.    i
11570 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20  f( (p->tabFlags 
11580 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
11590 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  nt) ){.      sql
115a0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
115b0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  rse,.          "
115c0 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6e 6f  AUTOINCREMENT no
115d0 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 57 49 54  t allowed on WIT
115e0 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
115f0 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  s");.      retur
11600 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
11610 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20   (p->tabFlags & 
11620 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79  TF_HasPrimaryKey
11630 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
11640 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11650 61 72 73 65 2c 20 22 50 52 49 4d 41 52 59 20 4b  arse, "PRIMARY K
11660 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e 20 74 61  EY missing on ta
11670 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d  ble %s", p->zNam
11680 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
11690 20 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67 73       p->tabFlags
116a0 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75 74 52 6f   |= TF_WithoutRo
116b0 77 69 64 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62  wid | TF_NoVisib
116c0 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 63  leRowid;.      c
116d0 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52  onvertToWithoutR
116e0 6f 77 69 64 54 61 62 6c 65 28 70 50 61 72 73 65  owidTable(pParse
116f0 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , p);.    }.  }.
11700 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
11710 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
11720 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  , p->pSchema);..
11730 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11740 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52  MIT_CHECK.  /* R
11750 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
11760 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  all CHECK constr
11770 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  aint expressions
11780 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
11790 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 73 71  pCheck ){.    sq
117a0 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66  lite3ResolveSelf
117b0 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65  Reference(pParse
117c0 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c  , p, NC_IsCheck,
117d0 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a   0, p->pCheck);.
117e0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
117f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
11800 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 23 69 66  IT_CHECK) */.#if
11810 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11820 5f 47 45 4e 45 52 41 54 45 44 5f 43 4f 4c 55 4d  _GENERATED_COLUM
11830 4e 53 0a 20 20 69 66 28 20 70 2d 3e 74 61 62 46  NS.  if( p->tabF
11840 6c 61 67 73 20 26 20 28 54 46 5f 48 61 73 56 69  lags & (TF_HasVi
11850 72 74 75 61 6c 7c 54 46 5f 48 61 73 53 74 6f 72  rtual|TF_HasStor
11860 65 64 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ed) ){.    int i
11870 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  i;.    for(ii=0;
11880 20 69 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 69 2b   ii<p->nCol; ii+
11890 2b 29 7b 0a 20 20 20 20 20 20 75 33 32 20 63 6f  +){.      u32 co
118a0 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 61 43 6f 6c  lFlags = p->aCol
118b0 5b 69 69 5d 2e 63 6f 6c 46 6c 61 67 73 3b 0a 20  [ii].colFlags;. 
118c0 20 20 20 20 20 69 66 28 20 28 63 6f 6c 46 6c 61       if( (colFla
118d0 67 73 20 26 20 28 43 4f 4c 46 4c 41 47 5f 53 54  gs & (COLFLAG_ST
118e0 4f 52 45 44 7c 43 4f 4c 46 4c 41 47 5f 56 49 52  ORED|COLFLAG_VIR
118f0 54 55 41 4c 29 29 21 3d 30 20 29 7b 0a 20 20 20  TUAL))!=0 ){.   
11900 20 20 20 20 20 69 66 28 20 63 6f 6c 46 6c 61 67       if( colFlag
11910 73 20 26 20 43 4f 4c 46 4c 41 47 5f 56 49 52 54  s & COLFLAG_VIRT
11920 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UAL ){.         
11930 20 70 2d 3e 6e 4e 56 43 6f 6c 2d 2d 3b 0a 20 20   p->nNVCol--;.  
11940 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11950 70 2d 3e 6e 4e 56 43 6f 6c 3e 3d 30 20 29 3b 0a  p->nNVCol>=0 );.
11960 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11970 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
11980 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50  SelfReference(pP
11990 61 72 73 65 2c 20 70 2c 20 4e 43 5f 47 65 6e 43  arse, p, NC_GenC
119a0 6f 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ol, .           
119b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119c0 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c           p->aCol
119d0 5b 69 69 5d 2e 70 44 66 6c 74 2c 20 30 29 3b 0a  [ii].pDflt, 0);.
119e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
119f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45  }.#endif..  /* E
11a00 73 74 69 6d 61 74 65 20 74 68 65 20 61 76 65 72  stimate the aver
11a10 61 67 65 20 72 6f 77 20 73 69 7a 65 20 66 6f 72  age row size for
11a20 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 66   the table and f
11a30 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64 20 69  or all implied i
11a40 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65 73 74 69  ndices */.  esti
11a50 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28 70  mateTableWidth(p
11a60 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 2d  );.  for(pIdx=p-
11a70 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
11a80 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
11a90 7b 0a 20 20 20 20 65 73 74 69 6d 61 74 65 49 6e  {.    estimateIn
11aa0 64 65 78 57 69 64 74 68 28 70 49 64 78 29 3b 0a  dexWidth(pIdx);.
11ab0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74    }..  /* If not
11ac0 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74   initializing, t
11ad0 68 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63  hen create a rec
11ae0 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ord for the new 
11af0 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68  table.  ** in th
11b00 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
11b10 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74  table of the dat
11b20 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  abase..  **.  **
11b30 20 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45   If this is a TE
11b40 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77  MPORARY table, w
11b50 72 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69  rite the entry i
11b60 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72  nto the auxiliar
11b70 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74  y.  ** file inst
11b80 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20  ead of into the 
11b90 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
11ba0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  le..  */.  if( !
11bb0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
11bc0 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
11bd0 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61  Vdbe *v;.    cha
11be0 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20  r *zType;    /* 
11bf0 22 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65  "view" or "table
11c00 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  " */.    char *z
11c10 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45  Type2;   /* "VIE
11c20 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f  W" or "TABLE" */
11c30 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  .    char *zStmt
11c40 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20  ;    /* Text of 
11c50 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
11c60 20 6f 72 20 43 52 45 41 54 45 20 56 49 45 57 20   or CREATE VIEW 
11c70 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20  statement */..  
11c80 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
11c90 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
11ca0 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
11cb0 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20  ) ) return;..   
11cc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11cd0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
11ce0 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20  0);..    /* .   
11cf0 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a   ** Initialize z
11d00 54 79 70 65 20 66 6f 72 20 74 68 65 20 6e 65 77  Type for the new
11d10 20 76 69 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a   view or table..
11d20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
11d30 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
11d40 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c        /* A regul
11d50 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ar table */.    
11d60 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65    zType = "table
11d70 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20  ";.      zType2 
11d80 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64  = "TABLE";.#ifnd
11d90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
11da0 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  IEW.    }else{. 
11db0 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a       /* A view *
11dc0 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  /.      zType = 
11dd0 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54  "view";.      zT
11de0 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23  ype2 = "VIEW";.#
11df0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
11e00 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
11e10 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
11e20 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20   AS SELECT ..., 
11e30 65 78 65 63 75 74 65 20 74 68 65 20 53 45 4c 45  execute the SELE
11e40 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  CT.    ** statem
11e50 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ent to populate 
11e60 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54  the new table. T
11e70 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  he root-page num
11e80 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20  ber for the.    
11e90 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20  ** new table is 
11ea0 69 6e 20 72 65 67 69 73 74 65 72 20 70 50 61 72  in register pPar
11eb0 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20  se->regRoot..   
11ec0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20   **.    ** Once 
11ed0 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62  the SELECT has b
11ee0 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c  een coded by sql
11ef0 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74  ite3Select(), it
11f00 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20   is in a.    ** 
11f10 73 75 69 74 61 62 6c 65 20 73 74 61 74 65 20 74  suitable state t
11f20 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20  o query for the 
11f30 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64  column names and
11f40 20 74 79 70 65 73 20 74 6f 20 62 65 20 75 73 65   types to be use
11f50 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  d.    ** by the 
11f60 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  new table..    *
11f70 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61 72 65  *.    ** A share
11f80 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d 6c 6f  d-cache write-lo
11f90 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ck is not requir
11fa0 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
11fb0 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20  he new table,.  
11fc0 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65 6d 61    ** as a schema
11fd0 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76 65 20  -lock must have 
11fe0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 62 74  already been obt
11ff0 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74 65 20  ained to create 
12000 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a  it. Since.    **
12010 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65   a schema-lock e
12020 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68 65  xcludes all othe
12030 72 20 64 61 74 61 62 61 73 65 20 75 73 65 72 73  r database users
12040 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  , the write-lock
12050 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65   would.    ** be
12060 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20   redundant..    
12070 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  */.    if( pSele
12080 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  ct ){.      Sele
12090 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
120a0 2f 2a 20 57 68 65 72 65 20 74 68 65 20 53 45 4c  /* Where the SEL
120b0 45 43 54 20 73 68 6f 75 6c 64 20 73 74 6f 72 65  ECT should store
120c0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20   results */.    
120d0 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64 3b 20    int regYield; 
120e0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
120f0 72 20 68 6f 6c 64 69 6e 67 20 63 6f 2d 72 6f 75  r holding co-rou
12100 74 69 6e 65 20 65 6e 74 72 79 2d 70 6f 69 6e 74  tine entry-point
12110 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
12120 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a  drTop;        /*
12130 20 54 6f 70 20 6f 66 20 74 68 65 20 63 6f 2d 72   Top of the co-r
12140 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20  outine */.      
12150 69 6e 74 20 72 65 67 52 65 63 3b 20 20 20 20 20  int regRec;     
12160 20 20 20 20 2f 2a 20 41 20 72 65 63 6f 72 64 20      /* A record 
12170 74 6f 20 62 65 20 69 6e 73 65 72 74 20 69 6e 74  to be insert int
12180 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  o the new table 
12190 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
121a0 52 6f 77 69 64 3b 20 20 20 20 20 20 20 2f 2a 20  Rowid;       /* 
121b0 52 6f 77 69 64 20 6f 66 20 74 68 65 20 6e 65 78  Rowid of the nex
121c0 74 20 72 6f 77 20 74 6f 20 69 6e 73 65 72 74 20  t row to insert 
121d0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
121e0 72 49 6e 73 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20  rInsLoop;    /* 
121f0 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  Top of the loop 
12200 66 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 72 6f  for inserting ro
12210 77 73 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c  ws */.      Tabl
12220 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 20 20  e *pSelTab;     
12230 2f 2a 20 41 20 74 61 62 6c 65 20 74 68 61 74 20  /* A table that 
12240 64 65 73 63 72 69 62 65 73 20 74 68 65 20 53 45  describes the SE
12250 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a  LECT results */.
12260 0a 20 20 20 20 20 20 72 65 67 59 69 65 6c 64 20  .      regYield 
12270 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
12280 3b 0a 20 20 20 20 20 20 72 65 67 52 65 63 20 3d  ;.      regRec =
12290 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
122a0 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20  .      regRowid 
122b0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
122c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
122d0 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b  Parse->nTab==1);
122e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61  .      sqlite3Ma
122f0 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
12300 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12310 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
12320 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72  enWrite, 1, pPar
12330 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62  se->regRoot, iDb
12340 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12350 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
12360 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 29 3b  OPFLAG_P2ISREG);
12370 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
12380 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 61  Tab = 2;.      a
12390 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
123a0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
123b0 76 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71  v) + 1;.      sq
123c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
123d0 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
123e0 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30  ine, regYield, 0
123f0 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20  , addrTop);.    
12400 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
12410 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  rr ) return;.   
12420 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
12430 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
12440 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
12450 65 6c 65 63 74 2c 20 53 51 4c 49 54 45 5f 41 46  elect, SQLITE_AF
12460 46 5f 42 4c 4f 42 29 3b 0a 20 20 20 20 20 20 69  F_BLOB);.      i
12470 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20  f( pSelTab==0 ) 
12480 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 73  return;.      as
12490 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30  sert( p->aCol==0
124a0 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 6f   );.      p->nCo
124b0 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
124c0 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c  l;.      p->aCol
124d0 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
124e0 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
124f0 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
12500 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
12510 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
12520 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
12530 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20   pSelTab);.     
12540 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
12550 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
12560 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  T_Coroutine, reg
12570 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71  Yield);.      sq
12580 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
12590 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65  se, pSelect, &de
125a0 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  st);.      if( p
125b0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
125c0 74 75 72 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69  turn;.      sqli
125d0 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
125e0 69 6e 65 28 76 2c 20 72 65 67 59 69 65 6c 64 29  ine(v, regYield)
125f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12600 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
12610 64 64 72 54 6f 70 20 2d 20 31 29 3b 0a 20 20 20  ddrTop - 1);.   
12620 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f 70 20 3d     addrInsLoop =
12630 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12640 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
12650 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20  dest.iSDParm);. 
12660 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
12670 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
12680 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
12690 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
126a0 64 65 73 74 2e 69 53 64 73 74 2c 20 64 65 73 74  dest.iSdst, dest
126b0 2e 6e 53 64 73 74 2c 20 72 65 67 52 65 63 29 3b  .nSdst, regRec);
126c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
126d0 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20 70  bleAffinity(v, p
126e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
126f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12700 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 31 2c   OP_NewRowid, 1,
12710 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
12720 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12730 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
12740 2c 20 31 2c 20 72 65 67 52 65 63 2c 20 72 65 67  , 1, regRec, reg
12750 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
12760 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
12770 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20   addrInsLoop);. 
12780 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12790 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
127a0 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  InsLoop);.      
127b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
127c0 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31  1(v, OP_Close, 1
127d0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
127e0 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
127f0 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
12800 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
12810 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  nt */.    if( pS
12820 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a  elect ){.      z
12830 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62  Stmt = createTab
12840 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20  leStmt(db, p);. 
12850 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12860 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20 3d 20 74  Token *pEnd2 = t
12870 61 62 4f 70 74 73 20 3f 20 26 70 50 61 72 73 65  abOpts ? &pParse
12880 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20 3a 20 70  ->sLastToken : p
12890 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28  End;.      n = (
128a0 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a 20 2d 20  int)(pEnd2->z - 
128b0 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
128c0 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  en.z);.      if(
128d0 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27 3b   pEnd2->z[0]!=';
128e0 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64 32 2d 3e  ' ) n += pEnd2->
128f0 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  n;.      zStmt =
12900 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
12910 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  db, .          "
12920 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c  CREATE %s %.*s",
12930 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72   zType2, n, pPar
12940 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
12950 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
12960 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66  .    /* A slot f
12970 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61  or the record ha
12980 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
12990 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20  llocated in the 
129a0 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d  .    ** SQLITE_M
129b0 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65  ASTER table.  We
129c0 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70   just need to up
129d0 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77  date that slot w
129e0 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  ith all.    ** t
129f0 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  he information w
12a00 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a  e've collected..
12a10 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
12a20 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
12a30 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44  arse,.      "UPD
12a40 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20  ATE %Q.%s ".    
12a50 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d 27       "SET type='
12a60 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62  %s', name=%Q, tb
12a70 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70  l_name=%Q, rootp
12a80 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20  age=#%d, sql=%Q 
12a90 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20  ".       "WHERE 
12aa0 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20 20  rowid=#%d",.    
12ab0 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
12ac0 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f  DbSName, MASTER_
12ad0 4e 41 4d 45 2c 0a 20 20 20 20 20 20 7a 54 79 70  NAME,.      zTyp
12ae0 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
12af0 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
12b00 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  e,.      pParse-
12b10 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20  >regRoot,.      
12b20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61  zStmt,.      pPa
12b30 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20  rse->regRowid.  
12b40 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
12b50 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74  DbFree(db, zStmt
12b60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
12b70 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
12b80 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  e, iDb);..#ifnde
12b90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12ba0 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
12bb0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
12bc0 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  if we need to cr
12bd0 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73  eate an sqlite_s
12be0 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f  equence table fo
12bf0 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67  r.    ** keeping
12c00 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e   track of autoin
12c10 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20  crement keys..  
12c20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d    */.    if( (p-
12c30 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
12c40 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30  utoincrement)!=0
12c50 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44   ){.      Db *pD
12c60 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
12c70 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
12c80 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
12c90 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
12ca0 20 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28   0) );.      if(
12cb0 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70   pDb->pSchema->p
12cc0 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  SeqTab==0 ){.   
12cd0 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
12ce0 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
12cf0 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
12d00 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74  E TABLE %Q.sqlit
12d10 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c  e_sequence(name,
12d20 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20  seq)",.         
12d30 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 0a 20   pDb->zDbSName. 
12d40 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
12d50 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
12d60 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65      /* Reparse e
12d70 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64  verything to upd
12d80 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
12d90 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
12da0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
12db0 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
12dc0 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20  aOp(v, iDb,.    
12dd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
12de0 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e  rintf(db, "tbl_n
12df0 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70  ame='%q' AND typ
12e00 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20 70  e!='trigger'", p
12e10 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a  ->zName));.  }..
12e20 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61  .  /* Add the ta
12e30 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65  ble to the in-me
12e40 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
12e50 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
12e60 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
12e70 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
12e80 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64  .    Table *pOld
12e90 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  ;.    Schema *pS
12ea0 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65  chema = p->pSche
12eb0 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ma;.    assert( 
12ec0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
12ed0 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
12ee0 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  0) );.    pOld =
12ef0 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
12f00 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  rt(&pSchema->tbl
12f10 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  Hash, p->zName, 
12f20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  p);.    if( pOld
12f30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
12f40 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  ( p==pOld );  /*
12f50 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
12f60 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
12f70 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
12f80 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
12f90 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20  Fault(db);.     
12fa0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
12fb0 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
12fc0 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
12fd0 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42  ->mDbFlags |= DB
12fe0 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67  FLAG_SchemaChang
12ff0 65 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e;..#ifndef SQLI
13000 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42  TE_OMIT_ALTERTAB
13010 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70  LE.    if( !p->p
13020 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
13030 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
13040 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
13050 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  *)pParse->sNameT
13060 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e  oken.z;.      in
13070 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61  t nName;.      a
13080 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20  ssert( !pSelect 
13090 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64  && pCons && pEnd
130a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43   );.      if( pC
130b0 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  ons->z==0 ){.   
130c0 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e       pCons = pEn
130d0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
130e0 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28 28   nName = (int)((
130f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f  const char *)pCo
13100 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a  ns->z - zName);.
13110 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f        p->addColO
13120 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c  ffset = 13 + sql
13130 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28  ite3Utf8CharLen(
13140 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
13150 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
13160 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
13170 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
13180 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
13190 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
131a0 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
131b0 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f  te a new VIEW.*/
131c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
131d0 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65  ateView(.  Parse
131e0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
131f0 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
13200 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
13210 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20  *pBegin,     /* 
13220 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
13230 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65   that begins the
13240 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
13250 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
13260 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
13270 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
13280 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
13290 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
132a0 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e2,     /* The t
132b0 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
132c0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
132d0 76 69 65 77 20 2a 2f 0a 20 20 45 78 70 72 4c 69  view */.  ExprLi
132e0 73 74 20 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a 20  st *pCNames, /* 
132f0 4f 70 74 69 6f 6e 61 6c 20 6c 69 73 74 20 6f 66  Optional list of
13300 20 76 69 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d   view column nam
13310 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  es */.  Select *
13320 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20  pSelect,   /* A 
13330 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13340 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
13350 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a  e the new view *
13360 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
13370 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66         /* TRUE f
13380 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76  or a TEMPORARY v
13390 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  iew */.  int noE
133a0 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  rr          /* S
133b0 75 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65  uppress error me
133c0 73 73 61 67 65 73 20 69 66 20 56 49 45 57 20 61  ssages if VIEW a
133d0 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
133e0 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
133f0 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74    int n;.  const
13400 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65   char *z;.  Toke
13410 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65  n sEnd;.  DbFixe
13420 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20  r sFix;.  Token 
13430 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  *pName = 0;.  in
13440 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33  t iDb;.  sqlite3
13450 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
13460 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
13470 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20  ->nVar>0 ){.    
13480 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13490 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74  pParse, "paramet
134a0 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ers are not allo
134b0 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a  wed in views");.
134c0 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f      goto create_
134d0 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20  view_fail;.  }. 
134e0 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
134f0 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
13500 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d  1, pName2, isTem
13510 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b  p, 1, 0, noErr);
13520 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
13530 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
13540 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
13550 6e 45 72 72 20 29 20 67 6f 74 6f 20 63 72 65 61  nErr ) goto crea
13560 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20  te_view_fail;.  
13570 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
13580 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
13590 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
135a0 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  e);.  iDb = sqli
135b0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
135c0 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  (db, p->pSchema)
135d0 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e  ;.  sqlite3FixIn
135e0 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
135f0 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70  , iDb, "view", p
13600 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c  Name);.  if( sql
13610 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73  ite3FixSelect(&s
13620 46 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29 20  Fix, pSelect) ) 
13630 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77  goto create_view
13640 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  _fail;..  /* Mak
13650 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
13660 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74  entire SELECT st
13670 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
13680 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
13690 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f   ** This will fo
136a0 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72  rce all the Expr
136b0 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
136c0 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
136d0 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
136e0 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69   rather than poi
136f0 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20  nt to the input 
13700 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d  string - which m
13710 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  eans that.  ** t
13720 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74  hey will persist
13730 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
13740 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
13750 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a  ) call returns..
13760 20 20 2a 2f 0a 20 20 69 66 28 20 49 4e 5f 52 45    */.  if( IN_RE
13770 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  NAME_OBJECT ){. 
13780 20 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20     p->pSelect = 
13790 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 70 53 65  pSelect;.    pSe
137a0 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  lect = 0;.  }els
137b0 65 7b 0a 20 20 20 20 70 2d 3e 70 53 65 6c 65 63  e{.    p->pSelec
137c0 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
137d0 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74  tDup(db, pSelect
137e0 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
137f0 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 43 68 65  );.  }.  p->pChe
13800 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
13810 4c 69 73 74 44 75 70 28 64 62 2c 20 70 43 4e 61  ListDup(db, pCNa
13820 6d 65 73 2c 20 45 58 50 52 44 55 50 5f 52 45 44  mes, EXPRDUP_RED
13830 55 43 45 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  UCE);.  if( db->
13840 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
13850 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
13860 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61  fail;..  /* Loca
13870 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
13880 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
13890 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
138a0 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
138b0 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
138c0 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
138d0 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 61  >sLastToken;.  a
138e0 73 73 65 72 74 28 20 73 45 6e 64 2e 7a 5b 30 5d  ssert( sEnd.z[0]
138f0 21 3d 30 20 7c 7c 20 73 45 6e 64 2e 6e 3d 3d 30  !=0 || sEnd.n==0
13900 20 29 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a   );.  if( sEnd.z
13910 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20  [0]!=';' ){.    
13920 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e  sEnd.z += sEnd.n
13930 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d  ;.  }.  sEnd.n =
13940 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28   0;.  n = (int)(
13950 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d  sEnd.z - pBegin-
13960 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  >z);.  assert( n
13970 3e 30 20 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67  >0 );.  z = pBeg
13980 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
13990 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
139a0 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d  [n-1]) ){ n--; }
139b0 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
139c0 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
139d0 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c  1;..  /* Use sql
139e0 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74  ite3EndTable() t
139f0 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
13a00 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
13a10 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
13a20 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70  qlite3EndTable(p
13a30 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c  Parse, 0, &sEnd,
13a40 20 30 2c 20 30 29 3b 0a 0a 63 72 65 61 74 65 5f   0, 0);..create_
13a50 76 69 65 77 5f 66 61 69 6c 3a 0a 20 20 73 71 6c  view_fail:.  sql
13a60 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
13a70 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
13a80 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
13a90 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c  BJECT ){.    sql
13aa0 69 74 65 33 52 65 6e 61 6d 65 45 78 70 72 6c 69  ite3RenameExprli
13ab0 73 74 55 6e 6d 61 70 28 70 50 61 72 73 65 2c 20  stUnmap(pParse, 
13ac0 70 43 4e 61 6d 65 73 29 3b 0a 20 20 7d 0a 20 20  pCNames);.  }.  
13ad0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
13ae0 65 6c 65 74 65 28 64 62 2c 20 70 43 4e 61 6d 65  elete(db, pCName
13af0 73 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  s);.  return;.}.
13b00 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13b10 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23  _OMIT_VIEW */..#
13b20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
13b30 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
13b40 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13b50 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
13b60 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61  LE)./*.** The Ta
13b70 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54  ble structure pT
13b80 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  able is really a
13b90 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20   VIEW.  Fill in 
13ba0 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  the names of.** 
13bb0 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
13bc0 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70  he view in the p
13bd0 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e  Table structure.
13be0 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
13bf0 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
13c00 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
13c10 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20  s seen leave an 
13c20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
13c30 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
13c40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13c50 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
13c60 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
13c70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
13c80 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54  {.  Table *pSelT
13c90 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20  ab;   /* A fake 
13ca0 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
13cb0 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75   we get the resu
13cc0 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65  lt set */.  Sele
13cd0 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a  ct *pSel;     /*
13ce0 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   Copy of the SEL
13cf0 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ECT that impleme
13d00 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a  nts the view */.
13d10 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20    int nErr = 0; 
13d20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13d30 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
13d40 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  red */.  int n; 
13d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
13d60 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20  mporarily holds 
13d70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  the number of cu
13d80 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a  rsors assigned *
13d90 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
13da0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
13db0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
13dc0 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63  ction for malloc
13dd0 20 65 72 72 6f 72 73 20 2a 2f 0a 23 69 66 6e 64   errors */.#ifnd
13de0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
13df0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e  IRTUALTABLE.  in
13e00 74 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66  t rc;.#endif.#if
13e10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13e20 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
13e30 20 73 71 6c 69 74 65 33 5f 78 61 75 74 68 20 78   sqlite3_xauth x
13e40 41 75 74 68 3b 20 20 20 20 20 20 20 2f 2a 20 53  Auth;       /* S
13e50 61 76 65 64 20 78 41 75 74 68 20 70 6f 69 6e 74  aved xAuth point
13e60 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  er */.#endif..  
13e70 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29  assert( pTable )
13e80 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
13e90 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
13ea0 42 4c 45 0a 20 20 64 62 2d 3e 6e 53 63 68 65 6d  BLE.  db->nSchem
13eb0 61 4c 6f 63 6b 2b 2b 3b 0a 20 20 72 63 20 3d 20  aLock++;.  rc = 
13ec0 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43  sqlite3VtabCallC
13ed0 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70  onnect(pParse, p
13ee0 54 61 62 6c 65 29 3b 0a 20 20 64 62 2d 3e 6e 53  Table);.  db->nS
13ef0 63 68 65 6d 61 4c 6f 63 6b 2d 2d 3b 0a 20 20 69  chemaLock--;.  i
13f00 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
13f10 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
13f20 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c   IsVirtual(pTabl
13f30 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  e) ) return 0;.#
13f40 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
13f50 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
13f60 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20    /* A positive 
13f70 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63  nCol means the c
13f80 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72  olumns names for
13f90 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20   this view are. 
13fa0 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   ** already know
13fb0 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  n..  */.  if( pT
13fc0 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72  able->nCol>0 ) r
13fd0 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41  eturn 0;..  /* A
13fe0 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69   negative nCol i
13ff0 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b  s a special mark
14000 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  er meaning that 
14010 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
14020 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20  .  ** trying to 
14030 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75  compute the colu
14040 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65  mn names.  If we
14050 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74   enter this rout
14060 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20  ine with.  ** a 
14070 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69  negative nCol, i
14080 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d  t means two or m
14090 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61  ore views form a
140a0 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73   loop, like this
140b0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
140c0 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20  CREATE VIEW one 
140d0 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
140e0 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43   two;.  **     C
140f0 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41  REATE VIEW two A
14100 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
14110 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  one;.  **.  ** A
14120 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72 72  ctually, the err
14130 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77 20  or above is now 
14140 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20  caught prior to 
14150 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 70 6f  reaching this po
14160 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68  int..  ** But th
14170 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
14180 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74   is still import
14190 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20 63  ant as it does c
141a0 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74  ome up.  ** in t
141b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
141c0 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  ** .  **     CRE
141d0 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65  ATE TABLE main.e
141e0 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20  x1(a);.  **     
141f0 43 52 45 41 54 45 20 54 45 4d 50 20 56 49 45 57  CREATE TEMP VIEW
14200 20 65 78 31 20 41 53 20 53 45 4c 45 43 54 20 61   ex1 AS SELECT a
14210 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20   FROM ex1;.  ** 
14220 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
14230 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f  M temp.ex1;.  */
14240 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
14250 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  Col<0 ){.    sql
14260 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14270 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73  rse, "view %s is
14280 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69   circularly defi
14290 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  ned", pTable->zN
142a0 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
142b0 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   1;.  }.  assert
142c0 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d  ( pTable->nCol>=
142d0 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  0 );..  /* If we
142e0 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
142f0 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20  t means we need 
14300 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74  to compute the t
14310 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a  able names..  **
14320 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63   Note that the c
14330 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65  all to sqlite3Re
14340 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
14350 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e  ) will expand an
14360 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65  y.  ** "*" eleme
14370 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  nts in the resul
14380 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76 69  ts set of the vi
14390 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69  ew and will assi
143a0 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20  gn cursors.  ** 
143b0 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20  to the elements 
143c0 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
143d0 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e  se.  But we do n
143e0 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63 68  ot want these ch
143f0 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65  anges.  ** to be
14400 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20   permanent.  So 
14410 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
14420 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70  is done on a cop
14430 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  y of the SELECT.
14440 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
14450 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
14460 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  view..  */.  ass
14470 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65  ert( pTable->pSe
14480 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d  lect );.  pSel =
14490 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
144a0 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53  p(db, pTable->pS
144b0 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28  elect, 0);.  if(
144c0 20 70 53 65 6c 20 29 7b 0a 23 69 66 6e 64 65 66   pSel ){.#ifndef
144d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
144e0 45 52 54 41 42 4c 45 0a 20 20 20 20 75 38 20 65  ERTABLE.    u8 e
144f0 50 61 72 73 65 4d 6f 64 65 20 3d 20 70 50 61 72  ParseMode = pPar
14500 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 3b 0a  se->eParseMode;.
14510 20 20 20 20 70 50 61 72 73 65 2d 3e 65 50 61 72      pParse->ePar
14520 73 65 4d 6f 64 65 20 3d 20 50 41 52 53 45 5f 4d  seMode = PARSE_M
14530 4f 44 45 5f 4e 4f 52 4d 41 4c 3b 0a 23 65 6e 64  ODE_NORMAL;.#end
14540 69 66 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73  if.    n = pPars
14550 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c  e->nTab;.    sql
14560 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
14570 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
14580 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20   pSel->pSrc);.  
14590 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
145a0 20 2d 31 3b 0a 20 20 20 20 44 69 73 61 62 6c 65   -1;.    Disable
145b0 4c 6f 6f 6b 61 73 69 64 65 3b 0a 23 69 66 6e 64  Lookaside;.#ifnd
145c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
145d0 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
145e0 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75   xAuth = db->xAu
145f0 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74  th;.    db->xAut
14600 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54  h = 0;.    pSelT
14610 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
14620 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
14630 61 72 73 65 2c 20 70 53 65 6c 2c 20 53 51 4c 49  arse, pSel, SQLI
14640 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20  TE_AFF_NONE);.  
14650 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41    db->xAuth = xA
14660 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70  uth;.#else.    p
14670 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
14680 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
14690 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20  t(pParse, pSel, 
146a0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29  SQLITE_AFF_NONE)
146b0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61  ;.#endif.    pPa
146c0 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20  rse->nTab = n;. 
146d0 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 70     if( pTable->p
146e0 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  Check ){.      /
146f0 2a 20 43 52 45 41 54 45 20 56 49 45 57 20 6e 61  * CREATE VIEW na
14700 6d 65 28 61 72 67 6c 69 73 74 29 20 41 53 20 2e  me(arglist) AS .
14710 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  ...      ** The 
14720 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
14730 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
14740 65 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d  e are taken from
14750 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 6c 69 73  .      ** arglis
14760 74 20 77 68 69 63 68 20 69 73 20 73 74 6f 72 65  t which is store
14770 64 20 69 6e 20 70 54 61 62 6c 65 2d 3e 70 43 68  d in pTable->pCh
14780 65 63 6b 2e 20 20 54 68 65 20 70 43 68 65 63 6b  eck.  The pCheck
14790 20 66 69 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20   field.      ** 
147a0 6e 6f 72 6d 61 6c 6c 79 20 68 6f 6c 64 73 20 43  normally holds C
147b0 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
147c0 20 6f 6e 20 61 6e 20 6f 72 64 69 6e 61 72 79 20   on an ordinary 
147d0 74 61 62 6c 65 2c 20 62 75 74 20 66 6f 72 0a 20  table, but for. 
147e0 20 20 20 20 20 2a 2a 20 61 20 56 49 45 57 20 69       ** a VIEW i
147f0 74 20 68 6f 6c 64 73 20 74 68 65 20 6c 69 73 74  t holds the list
14800 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
14810 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14820 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
14830 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
14840 73 65 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65  se, pTable->pChe
14850 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ck, .           
14860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14870 20 20 20 20 20 20 26 70 54 61 62 6c 65 2d 3e 6e        &pTable->n
14880 43 6f 6c 2c 20 26 70 54 61 62 6c 65 2d 3e 61 43  Col, &pTable->aC
14890 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  ol);.      if( d
148a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
148b0 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 50  =0 .       && pP
148c0 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 0a 20 20  arse->nErr==0.  
148d0 20 20 20 20 20 26 26 20 70 54 61 62 6c 65 2d 3e       && pTable->
148e0 6e 43 6f 6c 3d 3d 70 53 65 6c 2d 3e 70 45 4c 69  nCol==pSel->pELi
148f0 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20  st->nExpr.      
14900 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
14910 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d  e3SelectAddColum
14920 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
14930 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  n(pParse, pTable
14940 2c 20 70 53 65 6c 2c 0a 20 20 20 20 20 20 20 20  , pSel,.        
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14970 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 41 46         SQLITE_AF
14980 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 20 20 7d  F_NONE);.      }
14990 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
149a0 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20  SelTab ){.      
149b0 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57 20 6e  /* CREATE VIEW n
149c0 61 6d 65 20 41 53 2e 2e 2e 20 20 77 69 74 68 6f  ame AS...  witho
149d0 75 74 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 6c  ut an argument l
149e0 69 73 74 2e 20 20 43 6f 6e 73 74 72 75 63 74 0a  ist.  Construct.
149f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6c        ** the col
14a00 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74  umn names from t
14a10 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
14a20 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
14a30 20 74 68 65 20 76 69 65 77 2e 0a 20 20 20 20 20   the view..     
14a40 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
14a50 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d  ( pTable->aCol==
14a60 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c  0 );.      pTabl
14a70 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->nCol = pSelTa
14a80 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->nCol;.      p
14a90 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53  Table->aCol = pS
14aa0 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
14ab0 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
14ac0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c   = 0;.      pSel
14ad0 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
14ae0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
14af0 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
14b00 65 6c 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c  eld(db, 0, pTabl
14b10 65 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  e->pSchema) );. 
14b20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14b30 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
14b40 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  ;.      nErr++;.
14b50 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
14b60 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
14b70 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 73   pSelTab);.    s
14b80 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
14b90 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20  te(db, pSel);.  
14ba0 20 20 45 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64    EnableLookasid
14bb0 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
14bc0 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c  E_OMIT_ALTERTABL
14bd0 45 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 65 50  E.    pParse->eP
14be0 61 72 73 65 4d 6f 64 65 20 3d 20 65 50 61 72 73  arseMode = ePars
14bf0 65 4d 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 20 20  eMode;.#endif.  
14c00 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72  } else {.    nEr
14c10 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  r++;.  }.  pTabl
14c20 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  e->pSchema->sche
14c30 6d 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e  maFlags |= DB_Un
14c40 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 69 66  resetViews;.  if
14c50 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
14c60 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
14c70 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d  3DeleteColumnNam
14c80 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  es(db, pTable);.
14c90 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
14ca0 20 3d 20 30 3b 0a 20 20 20 20 70 54 61 62 6c 65   = 0;.    pTable
14cb0 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a  ->nCol = 0;.  }.
14cc0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
14cd0 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20  _OMIT_VIEW */.  
14ce0 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
14cf0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
14d00 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
14d10 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
14d20 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
14d30 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
14d40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14d50 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43  MIT_VIEW./*.** C
14d60 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
14d70 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79  names from every
14d80 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73   VIEW in databas
14d90 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  e idx..*/.static
14da0 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
14db0 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33  ResetAll(sqlite3
14dc0 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a   *db, int idx){.
14dd0 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
14de0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14df0 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
14e00 64 62 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a 20  db, idx, 0) );. 
14e10 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65   if( !DbHasPrope
14e20 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
14e30 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20  UnresetViews) ) 
14e40 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
14e50 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
14e60 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53  &db->aDb[idx].pS
14e70 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
14e80 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e   i;i=sqliteHashN
14e90 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62  ext(i)){.    Tab
14ea0 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
14eb0 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
14ec0 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
14ed0 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
14ee0 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  ite3DeleteColumn
14ef0 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29 3b  Names(db, pTab);
14f00 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  .      pTab->aCo
14f10 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61  l = 0;.      pTa
14f20 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
14f30 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
14f40 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
14f50 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
14f60 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  s);.}.#else.# de
14f70 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52  fine sqliteViewR
14f80 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e  esetAll(A,B).#en
14f90 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
14fa0 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_VIEW */../*.*
14fb0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
14fc0 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
14fd0 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20   VDBE to adjust 
14fe0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
14ff0 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53  ema.** used by S
15000 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62  QLite when the b
15010 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73  tree layer moves
15020 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61   a table root pa
15030 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d  ge. The.** root-
15040 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
15050 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61  or index in data
15060 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61  base iDb has cha
15070 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a  nged from iFrom.
15080 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a  ** to iTo..**.**
15090 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20   Ticket #1728:  
150a0 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65  The symbol table
150b0 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e   might still con
150c0 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tain information
150d0 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e  .** on tables an
150e0 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61  d/or indices tha
150f0 74 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73  t are the proces
15100 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74  s of being delet
15110 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72  ed..** If you ar
15120 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f  e unlucky, one o
15130 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20  f those deleted 
15140 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65  indices or table
15150 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20  s might.** have 
15160 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67  the same rootpag
15170 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  e number as the 
15180 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e  real table or in
15190 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62  dex that is.** b
151a0 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20  eing moved.  So 
151b0 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73  we cannot stop s
151c0 65 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74  earching after t
151d0 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a  he first match .
151e0 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ** because the f
151f0 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74  irst match might
15200 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74   be for one of t
15210 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  he deleted indic
15220 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20  es.** or tables 
15230 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c  and not the tabl
15240 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  e/index that is 
15250 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d  actually being m
15260 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74  oved..** We must
15270 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e   continue loopin
15280 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c  g until all tabl
15290 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77  es and indices w
152a0 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d  ith.** rootpage=
152b0 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e  =iFrom have been
152c0 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61   converted to ha
152d0 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66  ve a rootpage of
152e0 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72   iTo.** in order
152f0 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74   to be certain t
15300 68 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72  hat we got the r
15310 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66  ight one..*/.#if
15320 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15330 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64  _AUTOVACUUM.void
15340 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65   sqlite3RootPage
15350 4d 6f 76 65 64 28 73 71 6c 69 74 65 33 20 2a 64  Moved(sqlite3 *d
15360 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
15370 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
15380 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  .  HashElem *pEl
15390 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73  em;.  Hash *pHas
153a0 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  h;.  Db *pDb;.. 
153b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
153c0 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
153d0 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
153e0 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
153f0 69 44 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20  iDb];.  pHash = 
15400 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
15410 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  blHash;.  for(pE
15420 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
15430 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
15440 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
15450 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
15460 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
15470 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
15480 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
15490 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pTab->tnum==iF
154a0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61  rom ){.      pTa
154b0 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  b->tnum = iTo;. 
154c0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68     }.  }.  pHash
154d0 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
154e0 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72  ->idxHash;.  for
154f0 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
15500 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
15510 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
15520 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
15530 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  )){.    Index *p
15540 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Idx = sqliteHash
15550 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
15560 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d   if( pIdx->tnum=
15570 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
15580 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pIdx->tnum = iTo
15590 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
155a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
155b0 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  e code to erase 
155c0 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
155d0 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
155e0 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44  from database iD
155f0 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65  b..** Also write
15600 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20   code to modify 
15610 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
15620 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65  r table and inte
15630 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69  rnal schema.** i
15640 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  f a root-page of
15650 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
15660 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
15670 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73  tree-layer whils
15680 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61  t.** erasing iTa
15690 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61  ble (this can ha
156a0 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74  ppen with an aut
156b0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
156c0 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  e)..*/ .static v
156d0 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  oid destroyRootP
156e0 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  age(Parse *pPars
156f0 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  e, int iTable, i
15700 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
15710 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
15720 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
15730 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
15740 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
15750 29 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c  );.  if( iTable<
15760 32 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72  2 ) sqlite3Error
15770 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72  Msg(pParse, "cor
15780 72 75 70 74 20 73 63 68 65 6d 61 22 29 3b 0a 20  rupt schema");. 
15790 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
157a0 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  p3(v, OP_Destroy
157b0 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69 44  , iTable, r1, iD
157c0 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 79  b);.  sqlite3May
157d0 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 23  Abort(pParse);.#
157e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
157f0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
15800 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 73 74  /* OP_Destroy st
15810 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e 74 65 67  ores an in integ
15820 65 72 20 72 31 2e 20 49 66 20 74 68 69 73 20 69  er r1. If this i
15830 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e  nteger.  ** is n
15840 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74  on-zero, then it
15850 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
15860 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61  e number of a ta
15870 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a  ble moved to.  *
15880 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c  * location iTabl
15890 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e. The following
158a0 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74   code modifies t
158b0 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
158c0 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72   table to.  ** r
158d0 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a  eflect this..  *
158e0 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e 4e  *.  ** The "#NNN
158f0 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20  " in the SQL is 
15900 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61  a special consta
15910 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68  nt that means wh
15920 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a  atever value.  *
15930 2a 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72  * is in register
15940 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61 6d 6d   NNN.  See gramm
15950 61 72 20 72 75 6c 65 73 20 61 73 73 6f 63 69 61  ar rules associa
15960 74 65 64 20 77 69 74 68 20 74 68 65 20 54 4b 5f  ted with the TK_
15970 52 45 47 49 53 54 45 52 0a 20 20 2a 2a 20 74 6f  REGISTER.  ** to
15980 6b 65 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ken for addition
15990 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
159a0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65    */.  sqlite3Ne
159b0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
159c0 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20  , .     "UPDATE 
159d0 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61  %Q.%s SET rootpa
159e0 67 65 3d 25 64 20 57 48 45 52 45 20 23 25 64 20  ge=%d WHERE #%d 
159f0 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25 64  AND rootpage=#%d
15a00 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ",.     pParse->
15a10 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
15a20 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  SName, MASTER_NA
15a30 4d 45 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20  ME, iTable, r1, 
15a40 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  r1);.#endif.  sq
15a50 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
15a60 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
15a70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
15a80 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61  VDBE code to era
15a90 73 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e  se table pTab an
15aa0 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64  d all associated
15ab0 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b   indices on disk
15ac0 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64  ..** Code to upd
15ad0 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ate the sqlite_m
15ae0 61 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64  aster tables and
15af0 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
15b00 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20   definitions.** 
15b10 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70  in case a root-p
15b20 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
15b30 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
15b40 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
15b50 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73  tree layer.** is
15b60 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69   also added (thi
15b70 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
15b80 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
15b90 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73   database)..*/.s
15ba0 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
15bb0 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  oyTable(Parse *p
15bc0 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
15bd0 61 62 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65  ab){.  /* If the
15be0 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65   database may be
15bf0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70   auto-vacuum cap
15c00 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f  able (if SQLITE_
15c10 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
15c20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69    ** is not defi
15c30 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73  ned), then it is
15c40 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61   important to ca
15c50 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e  ll OP_Destroy on
15c60 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20   the.  ** table 
15c70 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70  and index root-p
15c80 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73  ages in order, s
15c90 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65  tarting with the
15ca0 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20   numerically .  
15cb0 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  ** largest root-
15cc0 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69  page number. Thi
15cd0 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  s guarantees tha
15ce0 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  t none of the ro
15cf0 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f  ot-pages.  ** to
15d00 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73   be destroyed is
15d10 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e   relocated by an
15d20 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74   earlier OP_Dest
15d30 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  roy. i.e. if the
15d40 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  .  ** following 
15d50 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a  were coded:.  **
15d60 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
15d70 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20   4 0.  ** ....  
15d80 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  ** OP_Destroy 5 
15d90 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20  0.  **.  ** and 
15da0 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70  root page 5 happ
15db0 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c  ened to be the l
15dc0 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
15dd0 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20   number in the. 
15de0 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
15df0 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77  en root page 5 w
15e00 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f  ould be moved to
15e10 20 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a   page 4 by the .
15e20 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79    ** "OP_Destroy
15e30 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68   4 0" opcode. Th
15e40 65 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50  e subsequent "OP
15e50 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f  _Destroy 5 0" wo
15e60 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66  uld hit.  ** a f
15e70 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20  ree-list page.. 
15e80 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
15e90 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69   pTab->tnum;.  i
15ea0 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20  nt iDestroyed = 
15eb0 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29  0;..  while( 1 )
15ec0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
15ed0 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67  x;.    int iLarg
15ee0 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  est = 0;..    if
15ef0 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20  ( iDestroyed==0 
15f00 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79  || iTab<iDestroy
15f10 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72  ed ){.      iLar
15f20 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20  gest = iTab;.   
15f30 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d   }.    for(pIdx=
15f40 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
15f50 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
15f60 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
15f70 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e   iIdx = pIdx->tn
15f80 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  um;.      assert
15f90 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d  ( pIdx->pSchema=
15fa0 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
15fb0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65  ;.      if( (iDe
15fc0 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69  stroyed==0 || (i
15fd0 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29  Idx<iDestroyed))
15fe0 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73   && iIdx>iLarges
15ff0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61  t ){.        iLa
16000 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20  rgest = iIdx;.  
16010 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16020 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20  if( iLargest==0 
16030 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  ){.      return;
16040 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16050 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
16060 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
16070 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
16080 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
16090 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d     assert( iDb>=
160a0 30 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d  0 && iDb<pParse-
160b0 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  >db->nDb );.    
160c0 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
160d0 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65  e(pParse, iLarge
160e0 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  st, iDb);.      
160f0 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61  iDestroyed = iLa
16100 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  rgest;.    }.  }
16110 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
16120 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68   entries from th
16130 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74  e sqlite_statN t
16140 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e 20  ables (for N in 
16150 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74 65  (1,2,3)).** afte
16160 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20 6f  r a DROP INDEX o
16170 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d  r DROP TABLE com
16180 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mand..*/.static 
16190 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61  void sqlite3Clea
161a0 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20 50  rStatTables(.  P
161b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
161c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
161d0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
161e0 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20    int iDb,      
161f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16200 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  database number 
16210 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
16220 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22  *zType,     /* "
16230 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f  idx" or "tbl" */
16240 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
16250 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Name      /* Nam
16260 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74 61  e of index or ta
16270 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ble */.){.  int 
16280 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
16290 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61 72 73  *zDbName = pPars
162a0 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
162b0 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 66 6f 72 28  zDbSName;.  for(
162c0 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b  i=1; i<=4; i++){
162d0 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62 5b 32  .    char zTab[2
162e0 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  4];.    sqlite3_
162f0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
16300 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69  zTab),zTab,"sqli
16310 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a 20  te_stat%d",i);. 
16320 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
16330 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
16340 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d  db, zTab, zDbNam
16350 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
16360 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
16370 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
16380 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
16390 73 20 57 48 45 52 45 20 25 73 3d 25 51 22 2c 0a  s WHERE %s=%Q",.
163a0 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c          zDbName,
163b0 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e   zTab, zType, zN
163c0 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ame.      );.   
163d0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
163e0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
163f0 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a   drop a table..*
16400 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
16410 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  deDropTable(Pars
16420 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
16430 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44 62 2c   *pTab, int iDb,
16440 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20   int isView){.  
16450 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
16460 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
16470 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72 20 2a  >db;.  Trigger *
16480 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62 20 2a  pTrigger;.  Db *
16490 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
164a0 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  Db];..  v = sqli
164b0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
164c0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
164d0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  =0 );.  sqlite3B
164e0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
164f0 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
16500 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
16510 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
16520 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
16530 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
16540 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16550 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp0(v, OP_VBegi
16560 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  n);.  }.#endif..
16570 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72    /* Drop all tr
16580 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65  iggers associate
16590 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
165a0 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
165b0 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e  Code.  ** is gen
165c0 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65  erated to remove
165d0 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71   entries from sq
165e0 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f  lite_master and/
165f0 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74  or.  ** sqlite_t
16600 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65  emp_master if re
16610 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  quired..  */.  p
16620 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65  Trigger = sqlite
16630 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61  3TriggerList(pPa
16640 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 77 68  rse, pTab);.  wh
16650 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29 7b  ile( pTrigger ){
16660 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72  .    assert( pTr
16670 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
16680 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c  pTab->pSchema ||
16690 20 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67   .        pTrigg
166a0 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  er->pSchema==db-
166b0 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
166c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 72  );.    sqlite3Dr
166d0 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61  opTriggerPtr(pPa
166e0 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a  rse, pTrigger);.
166f0 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
16700 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a  Trigger->pNext;.
16710 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
16720 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
16730 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f  REMENT.  /* Remo
16740 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f  ve any entries o
16750 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  f the sqlite_seq
16760 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f  uence table asso
16770 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 2a 2a  ciated with.  **
16780 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
16790 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69   dropped. This i
167a0 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68  s done before th
167b0 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70  e table is dropp
167c0 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 62  ed.  ** at the b
167d0 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63  tree level, in c
167e0 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73  ase the sqlite_s
167f0 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65  equence table ne
16800 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65  eds to.  ** move
16810 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
16820 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61  the drop (can ha
16830 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63  ppen in auto-vac
16840 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a  uum mode)..  */.
16850 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46    if( pTab->tabF
16860 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
16870 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73  crement ){.    s
16880 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
16890 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
168a0 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
168b0 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
168c0 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
168d0 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e        pDb->zDbSN
168e0 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
168f0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  .    );.  }.#end
16900 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c  if..  /* Drop al
16910 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
16920 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
16930 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
16940 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74  er to the.  ** t
16950 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61  able. The progra
16960 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72  m name loops thr
16970 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20  ough the master 
16980 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65  table and delete
16990 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77  s.  ** every row
169a0 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
169b0 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73  a table of the s
169c0 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
169d0 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64  one being.  ** d
169e0 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
169f0 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
16a00 61 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  arately because 
16a10 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
16a20 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e  .  ** created in
16a30 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
16a40 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74  se that refers t
16a50 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f  o a table in ano
16a60 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62 61  ther.  ** databa
16a70 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  se..  */.  sqlit
16a80 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
16a90 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44 45  arse, .      "DE
16aa0 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
16ab0 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25  WHERE tbl_name=%
16ac0 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69  Q and type!='tri
16ad0 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70 44  gger'",.      pD
16ae0 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53  b->zDbSName, MAS
16af0 54 45 52 5f 4e 41 4d 45 2c 20 70 54 61 62 2d 3e  TER_NAME, pTab->
16b00 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69  zName);.  if( !i
16b10 73 56 69 65 77 20 26 26 20 21 49 73 56 69 72 74  sView && !IsVirt
16b20 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
16b30 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50   destroyTable(pP
16b40 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d  arse, pTab);.  }
16b50 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  ..  /* Remove th
16b60 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72  e table entry fr
16b70 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65  om SQLite's inte
16b80 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20  rnal schema and 
16b90 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20  modify.  ** the 
16ba0 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20  schema cookie.. 
16bb0 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
16bc0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
16bd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16be0 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f  p4(v, OP_VDestro
16bf0 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54  y, iDb, 0, 0, pT
16c00 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
16c10 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
16c20 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  rt(pParse);.  }.
16c30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16c40 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61  Op4(v, OP_DropTa
16c50 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  ble, iDb, 0, 0, 
16c60 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
16c70 0a 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  .  sqlite3Change
16c80 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
16c90 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65  Db);.  sqliteVie
16ca0 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44  wResetAll(db, iD
16cb0 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  b);.}../*.** Thi
16cc0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
16cd0 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  led to do the wo
16ce0 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42  rk of a DROP TAB
16cf0 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
16d00 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61   pName is the na
16d10 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
16d20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a  to be dropped..*
16d30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
16d40 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
16d50 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
16d60 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65  pName, int isVie
16d70 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20  w, int noErr){. 
16d80 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
16d90 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
16da0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
16db0 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
16dc0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
16dd0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
16de0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
16df0 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ble;.  }.  asser
16e00 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
16e10 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
16e20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
16e30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 52  ;.  if( sqlite3R
16e40 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
16e50 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72  ) ) goto exit_dr
16e60 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69 66 28 20  op_table;.  if( 
16e70 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70  noErr ) db->supp
16e80 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20 61 73 73  ressErr++;.  ass
16e90 65 72 74 28 20 69 73 56 69 65 77 3d 3d 30 20 7c  ert( isView==0 |
16ea0 7c 20 69 73 56 69 65 77 3d 3d 4c 4f 43 41 54 45  | isView==LOCATE
16eb0 5f 56 49 45 57 20 29 3b 0a 20 20 70 54 61 62 20  _VIEW );.  pTab 
16ec0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
16ed0 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
16ee0 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d   isView, &pName-
16ef0 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f  >a[0]);.  if( no
16f00 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
16f10 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20  ssErr--;..  if( 
16f20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69  pTab==0 ){.    i
16f30 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74  f( noErr ) sqlit
16f40 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
16f50 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  dSchema(pParse, 
16f60 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
16f70 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f  abase);.    goto
16f80 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
16f90 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
16fa0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
16fb0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
16fc0 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28  hema);.  assert(
16fd0 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
16fe0 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20  b->nDb );..  /* 
16ff0 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72  If pTab is a vir
17000 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c  tual table, call
17010 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61   ViewGetColumnNa
17020 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a  mes() to ensure.
17030 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69    ** it is initi
17040 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  alized..  */.  i
17050 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
17060 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65  b) && sqlite3Vie
17070 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
17080 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b  pParse, pTab) ){
17090 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
170a0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23  rop_table;.  }.#
170b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
170c0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
170d0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
170e0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
170f0 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
17100 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
17110 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
17120 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
17130 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  zDbSName;.    co
17140 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20  nst char *zArg2 
17150 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
17160 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
17170 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
17180 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
17190 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  b)){.      goto 
171a0 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
171b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
171c0 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
171d0 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
171e0 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
171f0 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
17200 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45  TE_DROP_TEMP_VIE
17210 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
17220 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
17230 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b  QLITE_DROP_VIEW;
17240 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
17250 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
17260 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65  TUALTABLE.    }e
17270 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61  lse if( IsVirtua
17280 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
17290 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
172a0 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20  ROP_VTABLE;.    
172b0 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65    zArg2 = sqlite
172c0 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
172d0 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d  Tab)->pMod->zNam
172e0 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  e;.#endif.    }e
172f0 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
17300 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
17310 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
17320 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
17330 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ROP_TEMP_TABLE;.
17340 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17350 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
17360 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20  TE_DROP_TABLE;. 
17370 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17380 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
17390 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
173a0 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  de, pTab->zName,
173b0 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a   zArg2, zDb) ){.
173c0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
173d0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
173e0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
173f0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
17400 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
17410 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
17420 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
17430 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
17440 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  able;.    }.  }.
17450 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c  #endif.  if( sql
17460 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
17470 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
17480 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20  e_", 7)==0 .    
17490 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
174a0 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2b 37  mp(pTab->zName+7
174b0 2c 20 22 73 74 61 74 22 2c 20 34 29 21 3d 30 0a  , "stat", 4)!=0.
174c0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
174d0 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
174e0 6d 65 2b 37 2c 20 22 70 61 72 61 6d 65 74 65 72  me+7, "parameter
174f0 73 22 2c 20 31 30 29 21 3d 30 20 29 7b 0a 20 20  s", 10)!=0 ){.  
17500 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
17510 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
17520 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64   %s may not be d
17530 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ropped", pTab->z
17540 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
17550 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
17560 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
17570 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
17580 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20   /* Ensure DROP 
17590 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65  TABLE is not use
175a0 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64  d on a view, and
175b0 20 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f   DROP VIEW is no
175c0 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61  t used.  ** on a
175d0 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
175e0 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61  f( isView && pTa
175f0 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  b->pSelect==0 ){
17600 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
17610 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
17620 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20  e DROP TABLE to 
17630 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22  delete table %s"
17640 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
17650 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
17660 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
17670 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70  if( !isView && p
17680 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
17690 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
176a0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65  Msg(pParse, "use
176b0 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65   DROP VIEW to de
176c0 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20 70  lete view %s", p
176d0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
176e0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
176f0 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69  table;.  }.#endi
17700 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
17710 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
17720 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
17730 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a  he master table.
17740 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20    ** on disk..  
17750 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
17760 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
17770 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
17780 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
17790 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
177a0 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 1, iDb);.    
177b0 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20  if( !isView ){. 
177c0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
177d0 72 53 74 61 74 54 61 62 6c 65 73 28 70 50 61 72  rStatTables(pPar
177e0 73 65 2c 20 69 44 62 2c 20 22 74 62 6c 22 2c 20  se, iDb, "tbl", 
177f0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
17800 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44 72 6f      sqlite3FkDro
17810 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  pTable(pParse, p
17820 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20 20  Name, pTab);.   
17830 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f   }.    sqlite3Co
17840 64 65 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72  deDropTable(pPar
17850 73 65 2c 20 70 54 61 62 2c 20 69 44 62 2c 20 69  se, pTab, iDb, i
17860 73 56 69 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69  sView);.  }..exi
17870 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20  t_drop_table:.  
17880 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
17890 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b  lete(db, pName);
178a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
178b0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
178c0 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
178d0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20   foreign key on 
178e0 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72  the table.** cur
178f0 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
17900 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f  struction.  pFro
17910 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20  mCol determines 
17920 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  which columns.**
17930 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
17940 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74  table point to t
17950 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20  he foreign key. 
17960 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20   If pFromCol==0 
17970 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20  then.** connect 
17980 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c  the key to the l
17990 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72  ast column inser
179a0 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65  ted.  pTo is the
179b0 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20   name of.** the 
179c0 74 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74  table referred t
179d0 6f 20 28 61 2e 6b 2e 61 20 74 68 65 20 22 70 61  o (a.k.a the "pa
179e0 72 65 6e 74 22 20 74 61 62 6c 65 29 2e 20 20 70  rent" table).  p
179f0 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 0a  ToCol is a list.
17a00 2a 2a 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  ** of tables in 
17a10 74 68 65 20 70 61 72 65 6e 74 20 70 54 6f 20 74  the parent pTo t
17a20 61 62 6c 65 2e 20 20 66 6c 61 67 73 20 63 6f 6e  able.  flags con
17a30 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66  tains all.** inf
17a40 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
17a50 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  he conflict reso
17a60 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
17a70 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69  s specified.** i
17a80 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c  n the ON DELETE,
17a90 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f   ON UPDATE and O
17aa0 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73  N INSERT clauses
17ab0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20  ..**.** An FKey 
17ac0 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
17ad0 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74  ated and added t
17ae0 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
17af0 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63  ently.** under c
17b00 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74  onstruction in t
17b10 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  he pParse->pNewT
17b20 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a  able field..**.*
17b30 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  * The foreign ke
17b40 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d  y is set for IMM
17b50 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e  EDIATE processin
17b60 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74  g.  A subsequent
17b70 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69   call.** to sqli
17b80 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
17b90 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67  ey() might chang
17ba0 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52  e this to DEFERR
17bb0 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ED..*/.void sqli
17bc0 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e  te3CreateForeign
17bd0 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
17be0 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
17bf0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
17c00 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46  /.  ExprList *pF
17c10 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75  romCol,  /* Colu
17c20 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c  mns in this tabl
17c30 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  e that point to 
17c40 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
17c50 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20   Token *pTo,    
17c60 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
17c70 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
17c80 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
17c90 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f  pToCol,    /* Co
17ca0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68  lumns in the oth
17cb0 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  er table */.  in
17cc0 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
17cd0 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72     /* Conflict r
17ce0 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
17cf0 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71  thms. */.){.  sq
17d00 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
17d10 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20  se->db;.#ifndef 
17d20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
17d30 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a  IGN_KEY.  FKey *
17d40 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65  pFKey = 0;.  FKe
17d50 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61  y *pNextTo;.  Ta
17d60 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d  ble *p = pParse-
17d70 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e  >pNewTable;.  in
17d80 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69  t nByte;.  int i
17d90 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  ;.  int nCol;.  
17da0 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65  char *z;..  asse
17db0 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20  rt( pTo!=0 );.  
17dc0 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44  if( p==0 || IN_D
17dd0 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f  ECLARE_VTAB ) go
17de0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28  to fk_end;.  if(
17df0 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
17e00 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
17e10 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66  ->nCol-1;.    if
17e20 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29 20  ( NEVER(iCol<0) 
17e30 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
17e40 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26     if( pToCol &&
17e50 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d   pToCol->nExpr!=
17e60 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
17e70 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
17e80 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20  e, "foreign key 
17e90 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20  on %s".         
17ea0 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e  " should referen
17eb0 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75  ce only one colu
17ec0 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c  mn of table %T",
17ed0 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  .         p->aCo
17ee0 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70  l[iCol].zName, p
17ef0 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  To);.      goto 
17f00 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  fk_end;.    }.  
17f10 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65    nCol = 1;.  }e
17f20 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26  lse if( pToCol &
17f30 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21  & pToCol->nExpr!
17f40 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72  =pFromCol->nExpr
17f50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
17f60 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
17f70 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20          "number 
17f80 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f  of columns in fo
17f90 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e  reign key does n
17fa0 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d  ot match the num
17fb0 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20  ber of ".       
17fc0 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65   "columns in the
17fd0 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
17fe0 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  e");.    goto fk
17ff0 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _end;.  }else{. 
18000 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43     nCol = pFromC
18010 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20  ol->nExpr;.  }. 
18020 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
18030 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d  *pFKey) + (nCol-
18040 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d  1)*sizeof(pFKey-
18050 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d  >aCol[0]) + pTo-
18060 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54  >n + 1;.  if( pT
18070 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28  oCol ){.    for(
18080 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e  i=0; i<pToCol->n
18090 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
180a0 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74    nByte += sqlit
180b0 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f  e3Strlen30(pToCo
180c0 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b  l->a[i].zName) +
180d0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
180e0 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 44  pFKey = sqlite3D
180f0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
18100 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70  nByte );.  if( p
18110 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67  FKey==0 ){.    g
18120 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a  oto fk_end;.  }.
18130 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d    pFKey->pFrom =
18140 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65   p;.  pFKey->pNe
18150 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65  xtFrom = p->pFKe
18160 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29  y;.  z = (char*)
18170 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f  &pFKey->aCol[nCo
18180 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f  l];.  pFKey->zTo
18190 20 3d 20 7a 3b 0a 20 20 69 66 28 20 49 4e 5f 52   = z;.  if( IN_R
181a0 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a  ENAME_OBJECT ){.
181b0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
181c0 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65  eTokenMap(pParse
181d0 2c 20 28 76 6f 69 64 2a 29 7a 2c 20 70 54 6f 29  , (void*)z, pTo)
181e0 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a  ;.  }.  memcpy(z
181f0 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e  , pTo->z, pTo->n
18200 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d  );.  z[pTo->n] =
18210 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71   0;.  sqlite3Deq
18220 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20  uote(z);.  z += 
18230 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65  pTo->n+1;.  pFKe
18240 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a  y->nCol = nCol;.
18250 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
18260 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e  0 ){.    pFKey->
18270 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[0].iFrom = 
18280 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c  p->nCol-1;.  }el
18290 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  se{.    for(i=0;
182a0 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
182b0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
182c0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
182d0 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
182e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
182f0 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a  trICmp(p->aCol[j
18300 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f  ].zName, pFromCo
18310 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  l->a[i].zName)==
18320 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
18330 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46  FKey->aCol[i].iF
18340 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  rom = j;.       
18350 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
18360 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
18370 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c    if( j>=p->nCol
18380 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
18390 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
183a0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
183b0 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c  unknown column \
183c0 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e  "%s\" in foreign
183d0 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22   key definition"
183e0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  , .          pFr
183f0 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
18400 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
18410 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d   fk_end;.      }
18420 0a 20 20 20 20 20 20 69 66 28 20 49 4e 5f 52 45  .      if( IN_RE
18430 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  NAME_OBJECT ){. 
18440 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
18450 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70  nameTokenRemap(p
18460 50 61 72 73 65 2c 20 26 70 46 4b 65 79 2d 3e 61  Parse, &pFKey->a
18470 43 6f 6c 5b 69 5d 2c 20 70 46 72 6f 6d 43 6f 6c  Col[i], pFromCol
18480 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
18490 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
184a0 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
184b0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
184c0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
184d0 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
184e0 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c  3Strlen30(pToCol
184f0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
18500 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
18510 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20  [i].zCol = z;.  
18520 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
18530 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
18540 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
18550 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72  eTokenRemap(pPar
18560 73 65 2c 20 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  se, z, pToCol->a
18570 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
18580 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79    }.      memcpy
18590 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  (z, pToCol->a[i]
185a0 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  .zName, n);.    
185b0 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20    z[n] = 0;.    
185c0 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20    z += n+1;.    
185d0 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69  }.  }.  pFKey->i
185e0 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20  sDeferred = 0;. 
185f0 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b   pFKey->aAction[
18600 30 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20  0] = (u8)(flags 
18610 26 20 30 78 66 66 29 3b 20 20 20 20 20 20 20 20  & 0xff);        
18620 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45      /* ON DELETE
18630 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b   action */.  pFK
18640 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d  ey->aAction[1] =
18650 20 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20   (u8)((flags >> 
18660 38 20 29 20 26 20 30 78 66 66 29 3b 20 20 20 20  8 ) & 0xff);    
18670 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74  /* ON UPDATE act
18680 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ion */..  assert
18690 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
186a0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
186b0 70 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  p->pSchema) );. 
186c0 20 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79   pNextTo = (FKey
186d0 20 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e   *)sqlite3HashIn
186e0 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61  sert(&p->pSchema
186f0 2d 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20  ->fkeyHash, .   
18700 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28     pFKey->zTo, (
18710 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20 29  void *)pFKey.  )
18720 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 3d  ;.  if( pNextTo=
18730 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  =pFKey ){.    sq
18740 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
18750 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  );.    goto fk_e
18760 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e  nd;.  }.  if( pN
18770 65 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73 73  extTo ){.    ass
18780 65 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50  ert( pNextTo->pP
18790 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20  revTo==0 );.    
187a0 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d  pFKey->pNextTo =
187b0 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e   pNextTo;.    pN
187c0 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d  extTo->pPrevTo =
187d0 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f   pFKey;.  }..  /
187e0 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69  * Link the forei
187f0 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61  gn key to the ta
18800 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20  ble as the last 
18810 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  step..  */.  p->
18820 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20  pFKey = pFKey;. 
18830 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f   pFKey = 0;..fk_
18840 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  end:.  sqlite3Db
18850 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b  Free(db, pFKey);
18860 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
18870 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
18880 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a  FOREIGN_KEY) */.
18890 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
188a0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f  tDelete(db, pFro
188b0 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  mCol);.  sqlite3
188c0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
188d0 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f  b, pToCol);.}../
188e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
188f0 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
18900 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d   an INITIALLY IM
18910 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49  MEDIATE or INITI
18920 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a  ALLY DEFERRED.**
18930 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20   clause is seen 
18940 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72  as part of a for
18950 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
18960 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65  ion.  The isDefe
18970 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  rred.** paramete
18980 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49  r is 1 for INITI
18990 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e  ALLY DEFERRED an
189a0 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  d 0 for INITIALL
189b0 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20  Y IMMEDIATE..** 
189c0 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  The behavior of 
189d0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
189e0 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67  y created foreig
189f0 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65  n key is adjuste
18a00 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79  d.** accordingly
18a10 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18a20 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
18a30 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
18a40 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b  int isDeferred){
18a50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18a60 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
18a70 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
18a80 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20    FKey *pFKey;. 
18a90 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61   if( (pTab = pPa
18aa0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
18ab0 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70  =0 || (pFKey = p
18ac0 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29  Tab->pFKey)==0 )
18ad0 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
18ae0 74 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30  t( isDeferred==0
18af0 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d   || isDeferred==
18b00 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  1 ); /* EV: R-30
18b10 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70  323-21917 */.  p
18b20 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
18b30 20 3d 20 28 75 38 29 69 73 44 65 66 65 72 72 65   = (u8)isDeferre
18b40 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  d;.#endif.}../*.
18b50 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
18b60 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65   that will erase
18b70 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65   and refill inde
18b80 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69  x *pIdx.  This i
18b90 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69  s.** used to ini
18ba0 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20  tialize a newly 
18bb0 63 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72  created index or
18bc0 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68   to recompute th
18bd0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
18be0 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70  an index in resp
18bf0 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45  onse to a REINDE
18c00 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
18c10 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   if memRootPage 
18c20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c  is not negative,
18c30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
18c40 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c  he index is newl
18c50 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54  y.** created.  T
18c60 68 65 20 72 65 67 69 73 74 65 72 20 73 70 65 63  he register spec
18c70 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74  ified by memRoot
18c80 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Page contains th
18c90 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e  e.** root page n
18ca0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
18cb0 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50  ex.  If memRootP
18cc0 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
18cd0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64   then.** the ind
18ce0 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
18cf0 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c  s and must be cl
18d00 65 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69  eared before bei
18d10 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a  ng refilled and.
18d20 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ** the root page
18d30 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
18d40 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72  ndex is taken fr
18d50 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e  om pIndex->tnum.
18d60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18d70 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
18d80 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
18d90 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c  , Index *pIndex,
18da0 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65   int memRootPage
18db0 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
18dc0 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
18dd0 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  e;  /* The table
18de0 20 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64   that is indexed
18df0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
18e00 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
18e10 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
18e20 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54  rsor used for pT
18e30 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ab */.  int iIdx
18e40 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
18e50 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20  +;     /* Btree 
18e60 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  cursor used for 
18e70 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20  pIndex */.  int 
18e80 69 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20 20  iSorter;        
18e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
18ea0 72 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 4f  rsor opened by O
18eb0 70 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69 6e  penSorter (if in
18ec0 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61   use) */.  int a
18ed0 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  ddr1;           
18ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
18ef0 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c  ress of top of l
18f00 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
18f10 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r2;             
18f20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
18f30 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f  ss to jump to fo
18f40 72 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  r next iteration
18f50 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20   */.  int tnum; 
18f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f70 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
18f80 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e of index */.  
18f90 69 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62 65  int iPartIdxLabe
18fa0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
18fb0 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c  * Jump to this l
18fc0 61 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20 72  abel to skip a r
18fd0 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ow */.  Vdbe *v;
18fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ff0 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
19000 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
19010 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
19020 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
19030 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  pKey;           
19040 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f        /* KeyInfo
19050 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20   for index */.  
19060 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
19070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19080 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
19090 6e 67 20 61 73 73 65 6d 62 6c 65 64 20 69 6e 64  ng assembled ind
190a0 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73  ex record */.  s
190b0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
190c0 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a  rse->db;      /*
190d0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
190e0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
190f0 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
19100 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
19110 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
19120 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
19130 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
19140 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69  ATION.  if( sqli
19150 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
19160 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e  rse, SQLITE_REIN
19170 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  DEX, pIndex->zNa
19180 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d  me, 0,.      db-
19190 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
191a0 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75  me ) ){.    retu
191b0 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
191c0 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77    /* Require a w
191d0 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
191e0 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72   table to perfor
191f0 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  m this operation
19200 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62   */.  sqlite3Tab
19210 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
19220 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
19230 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  1, pTab->zName);
19240 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
19250 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
19260 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
19270 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  urn;.  if( memRo
19280 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  otPage>=0 ){.   
19290 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50   tnum = memRootP
192a0 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
192b0 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d    tnum = pIndex-
192c0 3e 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65  >tnum;.  }.  pKe
192d0 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  y = sqlite3KeyIn
192e0 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
192f0 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 61 73 73  , pIndex);.  ass
19300 65 72 74 28 20 70 4b 65 79 21 3d 30 20 7c 7c 20  ert( pKey!=0 || 
19310 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19320 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
19330 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   );..  /* Open t
19340 68 65 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72  he sorter cursor
19350 20 69 66 20 77 65 20 61 72 65 20 74 6f 20 75 73   if we are to us
19360 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53 6f 72  e one. */.  iSor
19370 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ter = pParse->nT
19380 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56  ab++;.  sqlite3V
19390 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
193a0 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53 6f 72  SorterOpen, iSor
193b0 74 65 72 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  ter, 0, pIndex->
193c0 6e 4b 65 79 43 6f 6c 2c 20 28 63 68 61 72 2a 29  nKeyCol, (char*)
193d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
193e0 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49       sqlite3KeyI
193f0 6e 66 6f 52 65 66 28 70 4b 65 79 29 2c 20 50 34  nfoRef(pKey), P4
19400 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a  _KEYINFO);..  /*
19410 20 4f 70 65 6e 20 74 68 65 20 74 61 62 6c 65 2e   Open the table.
19420 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
19430 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61  l rows of the ta
19440 62 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67 20 69  ble, inserting i
19450 6e 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72 64  ndex.  ** record
19460 73 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65  s into the sorte
19470 72 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f  r. */.  sqlite3O
19480 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
19490 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62   iTab, iDb, pTab
194a0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
194b0 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
194c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
194d0 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20  P_Rewind, iTab, 
194e0 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
194f0 28 76 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64  (v);.  regRecord
19500 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
19510 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
19520 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74  sqlite3MultiWrit
19530 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 73 71  e(pParse);..  sq
19540 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
19550 65 78 4b 65 79 28 70 50 61 72 73 65 2c 70 49 6e  exKey(pParse,pIn
19560 64 65 78 2c 69 54 61 62 2c 72 65 67 52 65 63 6f  dex,iTab,regReco
19570 72 64 2c 30 2c 26 69 50 61 72 74 49 64 78 4c 61  rd,0,&iPartIdxLa
19580 62 65 6c 2c 30 2c 30 29 3b 0a 20 20 73 71 6c 69  bel,0,0);.  sqli
19590 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
195a0 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74   OP_SorterInsert
195b0 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65  , iSorter, regRe
195c0 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
195d0 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61  ResolvePartIdxLa
195e0 62 65 6c 28 70 50 61 72 73 65 2c 20 69 50 61 72  bel(pParse, iPar
195f0 74 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20 73 71  tIdxLabel);.  sq
19600 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19610 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62  v, OP_Next, iTab
19620 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64 62 65  , addr1+1); Vdbe
19630 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
19640 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
19650 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
19660 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3c  if( memRootPage<
19670 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41  0 ) sqlite3VdbeA
19680 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61  ddOp2(v, OP_Clea
19690 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  r, tnum, iDb);. 
196a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
196b0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p4(v, OP_OpenWri
196c0 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20  te, iIdx, tnum, 
196d0 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  iDb, .          
196e0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 20            (char 
196f0 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
19700 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  FO);.  sqlite3Vd
19710 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
19720 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28 28 6d  FLAG_BULKCSR|((m
19730 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29 3f 4f  emRootPage>=0)?O
19740 50 46 4c 41 47 5f 50 32 49 53 52 45 47 3a 30 29  PFLAG_P2ISREG:0)
19750 29 3b 0a 0a 20 20 61 64 64 72 31 20 3d 20 73 71  );..  addr1 = sq
19760 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19770 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  v, OP_SorterSort
19780 2c 20 69 53 6f 72 74 65 72 2c 20 30 29 3b 20 56  , iSorter, 0); V
19790 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
197a0 20 20 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e    if( IsUniqueIn
197b0 64 65 78 28 70 49 6e 64 65 78 29 20 29 7b 0a 20  dex(pIndex) ){. 
197c0 20 20 20 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69     int j2 = sqli
197d0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31  te3VdbeGoto(v, 1
197e0 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73  );.    addr2 = s
197f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
19800 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
19810 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79 41  lite3VdbeVerifyA
19820 62 6f 72 74 61 62 6c 65 28 76 2c 20 4f 45 5f 41  bortable(v, OE_A
19830 62 6f 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  bort);.    sqlit
19840 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
19850 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70  v, OP_SorterComp
19860 61 72 65 2c 20 69 53 6f 72 74 65 72 2c 20 6a 32  are, iSorter, j2
19870 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20 20  , regRecord,.   
19880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19890 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 4b        pIndex->nK
198a0 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65  eyCol); VdbeCove
198b0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
198c0 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72  ite3UniqueConstr
198d0 61 69 6e 74 28 70 50 61 72 73 65 2c 20 4f 45 5f  aint(pParse, OE_
198e0 41 62 6f 72 74 2c 20 70 49 6e 64 65 78 29 3b 0a  Abort, pIndex);.
198f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
19900 75 6d 70 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a  umpHere(v, j2);.
19910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
19920 4d 6f 73 74 20 43 52 45 41 54 45 20 49 4e 44 45  Most CREATE INDE
19930 58 20 61 6e 64 20 52 45 49 4e 44 45 58 20 73 74  X and REINDEX st
19940 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 61 72  atements that ar
19950 65 20 6e 6f 74 20 55 4e 49 51 55 45 20 63 61 6e  e not UNIQUE can
19960 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 62 6f 72   not.    ** abor
19970 74 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  t. The exception
19980 20 69 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68   is if one of th
19990 65 20 69 6e 64 65 78 65 64 20 65 78 70 72 65 73  e indexed expres
199a0 73 69 6f 6e 73 20 63 6f 6e 74 61 69 6e 73 20 61  sions contains a
199b0 0a 20 20 20 20 2a 2a 20 75 73 65 72 20 66 75 6e  .    ** user fun
199c0 63 74 69 6f 6e 20 74 68 61 74 20 74 68 72 6f 77  ction that throw
199d0 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 77  s an exception w
199e0 68 65 6e 20 69 74 20 69 73 20 65 76 61 6c 75 61  hen it is evalua
199f0 74 65 64 2e 20 42 75 74 20 74 68 65 0a 20 20 20  ted. But the.   
19a00 20 2a 2a 20 6f 76 65 72 68 65 61 64 20 6f 66 20   ** overhead of 
19a10 61 64 64 69 6e 67 20 61 20 73 74 61 74 65 6d 65  adding a stateme
19a20 6e 74 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 61 20  nt journal to a 
19a30 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
19a40 74 65 6d 65 6e 74 20 69 73 0a 20 20 20 20 2a 2a  tement is.    **
19a50 20 76 65 72 79 20 73 6d 61 6c 6c 20 28 73 69 6e   very small (sin
19a60 63 65 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 70  ce most of the p
19a70 61 67 65 73 20 77 72 69 74 74 65 6e 20 64 6f 20  ages written do 
19a80 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74  not contain cont
19a90 65 6e 74 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ent that.    ** 
19aa0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
19ab0 6f 72 65 64 20 69 66 20 74 68 65 20 73 74 61 74  ored if the stat
19ac0 65 6d 65 6e 74 20 61 62 6f 72 74 73 29 2c 20 73  ement aborts), s
19ad0 6f 20 77 65 20 63 61 6c 6c 20 0a 20 20 20 20 2a  o we call .    *
19ae0 2a 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72  * sqlite3MayAbor
19af0 74 28 29 20 66 6f 72 20 61 6c 6c 20 43 52 45 41  t() for all CREA
19b00 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
19b10 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c  nts.  */.    sql
19b20 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
19b30 72 73 65 29 3b 0a 20 20 20 20 61 64 64 72 32 20  rse);.    addr2 
19b40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
19b50 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d  rentAddr(v);.  }
19b60 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
19b70 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp3(v, OP_Sorte
19b80 72 44 61 74 61 2c 20 69 53 6f 72 74 65 72 2c 20  rData, iSorter, 
19b90 72 65 67 52 65 63 6f 72 64 2c 20 69 49 64 78 29  regRecord, iIdx)
19ba0 3b 0a 20 20 69 66 28 20 21 70 49 6e 64 65 78 2d  ;.  if( !pIndex-
19bb0 3e 62 41 73 63 4b 65 79 42 75 67 20 29 7b 0a 20  >bAscKeyBug ){. 
19bc0 20 20 20 2f 2a 20 54 68 69 73 20 4f 50 5f 53 65     /* This OP_Se
19bd0 65 6b 45 6e 64 20 6f 70 63 6f 64 65 20 6d 61 6b  ekEnd opcode mak
19be0 65 73 20 69 6e 64 65 78 20 69 6e 73 65 72 74 20  es index insert 
19bf0 66 6f 72 20 61 20 52 45 49 4e 44 45 58 20 67 6f  for a REINDEX go
19c00 20 6d 75 63 68 0a 20 20 20 20 2a 2a 20 66 61 73   much.    ** fas
19c10 74 65 72 20 62 79 20 61 76 6f 69 64 69 6e 67 20  ter by avoiding 
19c20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 65 65 6b  unnecessary seek
19c30 73 2e 20 20 42 75 74 20 74 68 65 20 6f 70 74 69  s.  But the opti
19c40 6d 69 7a 61 74 69 6f 6e 20 64 6f 65 73 0a 20 20  mization does.  
19c50 20 20 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 66 6f    ** not work fo
19c60 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
19c70 69 6e 74 20 69 6e 64 65 78 65 73 20 6f 6e 20 57  int indexes on W
19c80 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
19c90 6c 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  les.    ** with 
19ca0 44 45 53 43 20 70 72 69 6d 61 72 79 20 6b 65 79  DESC primary key
19cb0 73 2c 20 73 69 6e 63 65 20 74 68 6f 73 65 20 69  s, since those i
19cc0 6e 64 65 78 65 73 20 68 61 76 65 20 74 68 65 72  ndexes have ther
19cd0 65 20 6b 65 79 73 20 69 6e 0a 20 20 20 20 2a 2a  e keys in.    **
19ce0 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64   a different ord
19cf0 65 72 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  er from the main
19d00 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 53   table..    ** S
19d10 65 65 20 74 69 63 6b 65 74 3a 20 68 74 74 70 73  ee ticket: https
19d20 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72  ://www.sqlite.or
19d30 67 2f 73 72 63 2f 69 6e 66 6f 2f 62 62 61 37 62  g/src/info/bba7b
19d40 36 39 66 39 38 34 39 62 35 62 66 0a 20 20 20 20  69f9849b5bf.    
19d50 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
19d60 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53  beAddOp1(v, OP_S
19d70 65 65 6b 45 6e 64 2c 20 69 49 64 78 29 3b 0a 20  eekEnd, iIdx);. 
19d80 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
19d90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
19da0 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65  Insert, iIdx, re
19db0 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
19dc0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
19dd0 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
19de0 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
19df0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
19e00 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
19e10 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
19e20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19e30 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53 6f 72  SorterNext, iSor
19e40 74 65 72 2c 20 61 64 64 72 32 29 3b 20 56 64 62  ter, addr2); Vdb
19e50 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
19e60 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
19e70 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a  ere(v, addr1);..
19e80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19e90 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
19ea0 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65   iTab);.  sqlite
19eb0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
19ec0 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a  P_Close, iIdx);.
19ed0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19ee0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
19ef0 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a   iSorter);.}../*
19f00 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68 65 61  .** Allocate hea
19f10 70 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  p space to hold 
19f20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  an Index object 
19f30 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e  with nCol column
19f40 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61 73  s..**.** Increas
19f50 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  e the allocation
19f60 20 73 69 7a 65 20 74 6f 20 70 72 6f 76 69 64 65   size to provide
19f70 20 61 6e 20 65 78 74 72 61 20 6e 45 78 74 72 61   an extra nExtra
19f80 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38 2d 62   bytes.** of 8-b
19f90 79 74 65 20 61 6c 69 67 6e 65 64 20 73 70 61 63  yte aligned spac
19fa0 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65  e after the Inde
19fb0 78 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  x object and ret
19fc0 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72  urn a.** pointer
19fd0 20 74 6f 20 74 68 69 73 20 65 78 74 72 61 20 73   to this extra s
19fe0 70 61 63 65 20 69 6e 20 2a 70 70 45 78 74 72 61  pace in *ppExtra
19ff0 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  ..*/.Index *sqli
1a000 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78  te3AllocateIndex
1a010 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c 69 74 65  Object(.  sqlite
1a020 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
1a030 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
1a040 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36 20 6e  ction */.  i16 n
1a050 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
1a060 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
1a070 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
1a080 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
1a090 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
1a0a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1a0b0 79 74 65 73 20 6f 66 20 65 78 74 72 61 20 73 70  ytes of extra sp
1a0c0 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f 0a  ace to alloc */.
1a0d0 20 20 63 68 61 72 20 2a 2a 70 70 45 78 74 72 61    char **ppExtra
1a0e0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1a0f0 72 20 74 6f 20 74 68 65 20 22 65 78 74 72 61 22  r to the "extra"
1a100 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20 20 49   space */.){.  I
1a110 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20  ndex *p;        
1a120 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
1a130 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   index object */
1a140 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
1a150 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
1a160 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 49 6e   of space for In
1a170 64 65 78 20 6f 62 6a 65 63 74 20 2b 20 61 72 72  dex object + arr
1a180 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74 65 20  ays */..  nByte 
1a190 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
1a1a0 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20 20 20  Index)) +       
1a1b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1a1c0 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20  structure  */.  
1a1d0 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73          ROUND8(s
1a1e0 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f  izeof(char*)*nCo
1a1f0 6c 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20  l) +         /* 
1a200 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20  Index.azColl    
1a210 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f   */.          RO
1a220 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c 6f 67 45  UND8(sizeof(LogE
1a230 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20  st)*(nCol+1) +  
1a240 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f     /* Index.aiRo
1a250 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a 20 20 20  wLogEst   */.   
1a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
1a270 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 20 2b  zeof(i16)*nCol +
1a280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1a290 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20  ndex.aiColumn   
1a2a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1a2b0 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e      sizeof(u8)*n
1a2c0 43 6f 6c 29 3b 20 20 20 20 20 20 20 20 20 20 20  Col);           
1a2d0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74    /* Index.aSort
1a2e0 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d 20 73  Order */.  p = s
1a2f0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1a300 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b 20 6e  ro(db, nByte + n
1a310 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70 20  Extra);.  if( p 
1a320 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 45 78  ){.    char *pEx
1a330 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29  tra = ((char*)p)
1a340 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49  +ROUND8(sizeof(I
1a350 6e 64 65 78 29 29 3b 0a 20 20 20 20 70 2d 3e 61  ndex));.    p->a
1a360 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63  zColl = (const c
1a370 68 61 72 2a 2a 29 70 45 78 74 72 61 3b 20 70 45  har**)pExtra; pE
1a380 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38 28 73  xtra += ROUND8(s
1a390 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f  izeof(char*)*nCo
1a3a0 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52 6f 77  l);.    p->aiRow
1a3b0 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67 45 73 74  LogEst = (LogEst
1a3c0 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74 72 61  *)pExtra; pExtra
1a3d0 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73   += sizeof(LogEs
1a3e0 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20  t)*(nCol+1);.   
1a3f0 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28   p->aiColumn = (
1a400 69 31 36 2a 29 70 45 78 74 72 61 3b 20 20 20 20  i16*)pExtra;    
1a410 20 20 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a     pExtra += siz
1a420 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20  eof(i16)*nCol;. 
1a430 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72     p->aSortOrder
1a440 20 3d 20 28 75 38 2a 29 70 45 78 74 72 61 3b 0a   = (u8*)pExtra;.
1a450 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d      p->nColumn =
1a460 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b   nCol;.    p->nK
1a470 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31  eyCol = nCol - 1
1a480 3b 0a 20 20 20 20 2a 70 70 45 78 74 72 61 20 3d  ;.    *ppExtra =
1a490 20 28 28 63 68 61 72 2a 29 70 29 20 2b 20 6e 42   ((char*)p) + nB
1a4a0 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  yte;.  }.  retur
1a4b0 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n p;.}../*.** If
1a4c0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
1a4d0 20 70 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20   pList contains 
1a4e0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
1a4f0 61 74 20 77 61 73 20 70 61 72 73 65 64 20 77 69  at was parsed wi
1a500 74 68 0a 2a 2a 20 61 6e 20 65 78 70 6c 69 63 69  th.** an explici
1a510 74 20 22 4e 55 4c 4c 53 20 46 49 52 53 54 22 20  t "NULLS FIRST" 
1a520 6f 72 20 22 4e 55 4c 4c 53 20 4c 41 53 54 22 20  or "NULLS LAST" 
1a530 63 6c 61 75 73 65 2c 20 6c 65 61 76 65 20 61 6e  clause, leave an
1a540 20 65 72 72 6f 72 20 69 6e 0a 2a 2a 20 70 50 61   error in.** pPa
1a550 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e  rse and return n
1a560 6f 6e 2d 7a 65 72 6f 2e 20 4f 74 68 65 72 77 69  on-zero. Otherwi
1a570 73 65 2c 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e  se, return zero.
1a580 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 48  .*/.int sqlite3H
1a590 61 73 45 78 70 6c 69 63 69 74 4e 75 6c 6c 73 28  asExplicitNulls(
1a5a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1a5b0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
1a5c0 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
1a5d0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
1a5e0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1a5f0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1a600 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
1a610 5b 69 5d 2e 62 4e 75 6c 6c 73 20 29 7b 0a 20 20  [i].bNulls ){.  
1a620 20 20 20 20 20 20 75 38 20 73 66 20 3d 20 70 4c        u8 sf = pL
1a630 69 73 74 2d 3e 61 5b 69 5d 2e 73 6f 72 74 46 6c  ist->a[i].sortFl
1a640 61 67 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ags;.        sql
1a650 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1a660 72 73 65 2c 20 22 75 6e 73 75 70 70 6f 72 74 65  rse, "unsupporte
1a670 64 20 75 73 65 20 6f 66 20 4e 55 4c 4c 53 20 25  d use of NULLS %
1a680 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  s", .           
1a690 20 28 73 66 3d 3d 30 20 7c 7c 20 73 66 3d 3d 33   (sf==0 || sf==3
1a6a0 29 20 3f 20 22 46 49 52 53 54 22 20 3a 20 22 4c  ) ? "FIRST" : "L
1a6b0 41 53 54 22 0a 20 20 20 20 20 20 20 20 29 3b 0a  AST".        );.
1a6c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
1a6d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a6e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1a6f0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1a700 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20  a new index for 
1a710 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70  an SQL table.  p
1a720 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20  Name1.pName2 is 
1a730 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
1a740 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54  index .** and pT
1a750 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61  blList is the na
1a760 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
1a770 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
1a780 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c  dexed.  Both wil
1a790 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f  l .** be NULL fo
1a7a0 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  r a primary key 
1a7b0 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  or an index that
1a7c0 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20 73   is created to s
1a7d0 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51  atisfy a.** UNIQ
1a7e0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
1a7f0 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49  If pTable and pI
1a800 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75  ndex are NULL, u
1a810 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
1a820 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74  able.** as the t
1a830 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
1a840 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  ed.  pParse->pNe
1a850 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c  wTable is a tabl
1a860 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72  e that is.** cur
1a870 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
1a880 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43 52  structed by a CR
1a890 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
1a8a0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  ment..**.** pLis
1a8b0 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63  t is a list of c
1a8c0 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
1a8d0 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c  exed.  pList wil
1a8e0 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69  l be NULL if thi
1a8f0 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72  s.** is a primar
1a900 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d  y key or unique-
1a910 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68  constraint on th
1a920 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f  e most recent co
1a930 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f  lumn added.** to
1a940 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
1a950 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
1a960 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f  ruction.  .*/.vo
1a970 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
1a980 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
1a990 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41  pParse,     /* A
1a9a0 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
1a9b0 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20  bout this parse 
1a9c0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
1a9d0 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74  e1,     /* First
1a9e0 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
1a9f0 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
1aa00 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
1aa10 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f  me2,     /* Seco
1aa20 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  nd part of index
1aa30 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
1aa40 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  LL */.  SrcList 
1aa50 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61  *pTblName, /* Ta
1aa60 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73  ble to index. Us
1aa70 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
1aa80 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78  ble if 0 */.  Ex
1aa90 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
1aaa0 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f   /* A list of co
1aab0 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65  lumns to be inde
1aac0 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
1aad0 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f  rror,       /* O
1aae0 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
1aaf0 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20  re, OE_Replace, 
1ab00 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20  or OE_None */.  
1ab10 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
1ab20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
1ab30 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
1ab40 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ns this statemen
1ab50 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 49  t */.  Expr *pPI
1ab60 57 68 65 72 65 2c 20 20 20 20 2f 2a 20 57 48 45  Where,    /* WHE
1ab70 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 70 61  RE clause for pa
1ab80 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f  rtial indices */
1ab90 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
1aba0 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72  ,     /* Sort or
1abb0 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b  der of primary k
1abc0 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e  ey when pList==N
1abd0 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e  ULL */.  int ifN
1abe0 6f 74 45 78 69 73 74 2c 20 20 20 20 2f 2a 20 4f  otExist,    /* O
1abf0 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64  mit error if ind
1ac00 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
1ac10 73 20 2a 2f 0a 20 20 75 38 20 69 64 78 54 79 70  s */.  u8 idxTyp
1ac20 65 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e         /* The
1ac30 20 69 6e 64 65 78 20 74 79 70 65 20 2a 2f 0a 29   index type */.)
1ac40 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
1ac50 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c  = 0;     /* Tabl
1ac60 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
1ac70 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
1ac80 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  ex = 0;   /* The
1ac90 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65   index to be cre
1aca0 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ated */.  char *
1acb0 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  zName = 0;     /
1acc0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
1acd0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  dex */.  int nNa
1ace0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
1acf0 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
1ad00 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a  cters in zName *
1ad10 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  /.  int i, j;.  
1ad20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20  DbFixer sFix;   
1ad30 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69       /* For assi
1ad40 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e  gning database n
1ad50 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a  ames to pTable *
1ad60 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
1ad70 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f  rMask;   /* 1 to
1ad80 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69   honor DESC in i
1ad90 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f  ndex.  0 to igno
1ada0 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  re. */.  sqlite3
1adb0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1adc0 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  b;.  Db *pDb;   
1add0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ade0 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20   specific table 
1adf0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69  containing the i
1ae00 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20  ndexed database 
1ae10 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
1ae20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1ae30 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
1ae40 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  se that is being
1ae50 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f   written */.  To
1ae60 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20  ken *pName = 0; 
1ae70 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
1ae80 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  d name of the in
1ae90 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  dex to create */
1aea0 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
1aeb0 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74  st_item *pListIt
1aec0 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  em; /* For loopi
1aed0 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f  ng over pList */
1aee0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20  .  int nExtra = 
1aef0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1af00 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c      /* Space all
1af10 6f 63 61 74 65 64 20 66 6f 72 20 7a 45 78 74 72  ocated for zExtr
1af20 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  a[] */.  int nEx
1af30 74 72 61 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  traCol;         
1af40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1af50 62 65 72 20 6f 66 20 65 78 74 72 61 20 63 6f 6c  ber of extra col
1af60 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20  umns needed */. 
1af70 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20 3d 20   char *zExtra = 
1af80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1af90 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65    /* Extra space
1afa0 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65 78   after the Index
1afb0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64   object */.  Ind
1afc0 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20  ex *pPk = 0;    
1afd0 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    /* PRIMARY KEY
1afe0 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f   index for WITHO
1aff0 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20  UT ROWID tables 
1b000 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  */..  if( db->ma
1b010 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
1b020 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a  arse->nErr>0 ){.
1b030 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1b040 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
1b050 20 20 69 66 28 20 49 4e 5f 44 45 43 4c 41 52 45    if( IN_DECLARE
1b060 5f 56 54 41 42 20 26 26 20 69 64 78 54 79 70 65  _VTAB && idxType
1b070 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  !=SQLITE_IDXTYPE
1b080 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 7b 0a 20  _PRIMARYKEY ){. 
1b090 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1b0a0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
1b0b0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1b0c0 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
1b0d0 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
1b0e0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1b0f0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  e_index;.  }.  i
1b100 66 28 20 73 71 6c 69 74 65 33 48 61 73 45 78 70  f( sqlite3HasExp
1b110 6c 69 63 69 74 4e 75 6c 6c 73 28 70 50 61 72 73  licitNulls(pPars
1b120 65 2c 20 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  e, pList) ){.   
1b130 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1b140 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
1b150 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
1b160 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
1b170 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52  o be indexed.  R
1b180 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e  eturn early if n
1b190 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
1b1a0 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
1b1b0 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20   ){..    /* Use 
1b1c0 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64  the two-part ind
1b1d0 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  ex name to deter
1b1e0 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73  mine the databas
1b1f0 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61  e .    ** to sea
1b200 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c  rch for the tabl
1b210 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62  e. 'Fix' the tab
1b220 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20  le name to this 
1b230 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  db.    ** before
1b240 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20   looking up the 
1b250 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
1b260 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
1b270 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20   && pName2 );.  
1b280 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
1b290 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
1b2a0 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
1b2b0 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
1b2c0 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f  if( iDb<0 ) goto
1b2d0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1b2e0 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
1b2f0 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e  pName && pName->
1b300 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  z );..#ifndef SQ
1b310 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42  LITE_OMIT_TEMPDB
1b320 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
1b330 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e  ndex name was un
1b340 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b  qualified, check
1b350 20 69 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20   if the table.  
1b360 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74    ** is a temp t
1b370 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74  able. If so, set
1b380 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
1b390 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68   1. Do not do th
1b3a0 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69  is.    ** if ini
1b3b0 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61  tialising a data
1b3c0 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20  base schema..   
1b3d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d   */.    if( !db-
1b3e0 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
1b3f0 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
1b400 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28  e3SrcListLookup(
1b410 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65  pParse, pTblName
1b420 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61  );.      if( pNa
1b430 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61  me2->n==0 && pTa
1b440 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65  b && pTab->pSche
1b450 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
1b460 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
1b470 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20    iDb = 1;.     
1b480 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
1b490 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 49  .    sqlite3FixI
1b4a0 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
1b4b0 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c  e, iDb, "index",
1b4c0 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   pName);.    if(
1b4d0 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
1b4e0 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61  st(&sFix, pTblNa
1b4f0 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  me) ){.      /* 
1b500 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73  Because the pars
1b510 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54  er constructs pT
1b520 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69  blName from a si
1b530 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c  ngle identifier,
1b540 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
1b550 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20  3FixSrcList can 
1b560 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20  never fail. */. 
1b570 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
1b580 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
1b590 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
1b5a0 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
1b5b0 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b  0, &pTblName->a[
1b5c0 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0]);.    assert(
1b5d0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1b5e0 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20  d==0 || pTab==0 
1b5f0 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
1b600 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
1b610 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1b620 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26 20 64   if( iDb==1 && d
1b630 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
1b640 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema!=pTab->pSche
1b650 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ma ){.      sqli
1b660 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1b670 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
1b680 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61  "cannot create a
1b690 20 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e   TEMP index on n
1b6a0 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c 22  on-TEMP table \"
1b6b0 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\"",.         
1b6c0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
1b6d0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1b6e0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1b6f0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73    }.    if( !Has
1b700 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 50  Rowid(pTab) ) pP
1b710 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
1b720 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
1b730 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1b740 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
1b750 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1b760 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Start==0 );.    
1b770 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
1b780 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66  NewTable;.    if
1b790 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65  ( !pTab ) goto e
1b7a0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1b7b0 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
1b7c0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
1b7d0 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
1b7e0 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d  ma);.  }.  pDb =
1b7f0 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
1b800 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21  .  assert( pTab!
1b810 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1b820 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
1b830 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1b840 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
1b850 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
1b860 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26   7)==0 .       &
1b870 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  & db->init.busy=
1b880 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 54 62  =0.       && pTb
1b890 6c 4e 61 6d 65 21 3d 30 0a 23 69 66 20 53 51 4c  lName!=0.#if SQL
1b8a0 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
1b8b0 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 20 20 26  ICATION.       &
1b8c0 26 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  & sqlite3UserAut
1b8d0 68 54 61 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61  hTable(pTab->zNa
1b8e0 6d 65 29 3d 3d 30 0a 23 65 6e 64 69 66 0a 23 69  me)==0.#endif.#i
1b8f0 66 64 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f  fdef SQLITE_ALLO
1b900 57 5f 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 5f  W_SQLITE_MASTER_
1b910 49 4e 44 45 58 0a 20 20 20 20 20 20 20 26 26 20  INDEX.       && 
1b920 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 26  sqlite3StrICmp(&
1b930 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22  pTab->zName[7],"
1b940 6d 61 73 74 65 72 22 29 21 3d 30 0a 23 65 6e 64  master")!=0.#end
1b950 69 66 0a 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  if. ){.    sqlit
1b960 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1b970 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
1b980 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
1b990 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
1b9a0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1b9b0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
1b9c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b9d0 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70  MIT_VIEW.  if( p
1b9e0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
1b9f0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1ba00 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
1ba10 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ws may not be in
1ba20 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74  dexed");.    got
1ba30 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1ba40 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  dex;.  }.#endif.
1ba50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ba60 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1ba70 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
1ba80 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
1ba90 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1baa0 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74  arse, "virtual t
1bab0 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
1bac0 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
1bad0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1bae0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
1baf0 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  if..  /*.  ** Fi
1bb00 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
1bb10 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  he index.  Make 
1bb20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
1bb30 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65  t already anothe
1bb40 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  r.  ** index or 
1bb50 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
1bb60 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a  ame name.  .  **
1bb70 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a  .  ** Exception:
1bb80 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64    If we are read
1bb90 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ing the names of
1bba0 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63   permanent indic
1bbb0 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  es from the.  **
1bbc0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
1bbd0 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f  able (because so
1bbe0 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
1bbf0 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68   changed the sch
1bc00 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e  ema) and.  ** on
1bc10 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e  e of the index n
1bc20 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69  ames collides wi
1bc30 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  th the name of a
1bc40 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1bc50 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20   or.  ** index, 
1bc60 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e  then we will con
1bc70 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73  tinue to process
1bc80 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a   this index..  *
1bc90 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d  *.  ** If pName=
1bca0 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  =0 it means that
1bcb0 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61   we are.  ** dea
1bcc0 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d  ling with a prim
1bcd0 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55  ary key or UNIQU
1bce0 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57  E constraint.  W
1bcf0 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74  e have to invent
1bd00 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61   our.  ** own na
1bd10 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  me..  */.  if( p
1bd20 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  Name ){.    zNam
1bd30 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
1bd40 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
1bd50 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  me);.    if( zNa
1bd60 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
1bd70 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1bd80 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
1bd90 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69  e->z!=0 );.    i
1bda0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
1bdb0 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
1bdc0 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61  Name(pParse, zNa
1bdd0 6d 65 2c 22 69 6e 64 65 78 22 2c 70 54 61 62 2d  me,"index",pTab-
1bde0 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  >zName) ){.     
1bdf0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1be00 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
1be10 20 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d     if( !IN_RENAM
1be20 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
1be30 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
1be40 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  busy ){.        
1be50 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
1be60 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
1be70 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)!=0 ){.       
1be80 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1be90 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
1bea0 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74  e is already a t
1beb0 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20  able named %s", 
1bec0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
1bed0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1bee0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
1bef0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1bf00 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
1bf10 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
1bf20 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29  , pDb->zDbSName)
1bf30 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
1bf40 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29  f( !ifNotExist )
1bf50 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1bf60 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1bf70 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c  se, "index %s al
1bf80 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a  ready exists", z
1bf90 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Name);.        }
1bfa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1bfb0 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
1bfc0 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20  t.busy );.      
1bfd0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
1bfe0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
1bff0 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
1c000 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f    }.        goto
1c010 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1c020 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
1c030 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
1c040 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20  nt n;.    Index 
1c050 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28  *pLoop;.    for(
1c060 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64  pLoop=pTab->pInd
1c070 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20  ex, n=1; pLoop; 
1c080 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65  pLoop=pLoop->pNe
1c090 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a  xt, n++){}.    z
1c0a0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
1c0b0 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74  rintf(db, "sqlit
1c0c0 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25  e_autoindex_%s_%
1c0d0 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  d", pTab->zName,
1c0e0 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61   n);.    if( zNa
1c0f0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  me==0 ){.      g
1c100 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1c110 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 0a 20 20  index;.    }..  
1c120 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69    /* Automatic i
1c130 6e 64 65 78 20 6e 61 6d 65 73 20 67 65 6e 65 72  ndex names gener
1c140 61 74 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  ated from within
1c150 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
1c160 5f 76 74 61 62 28 29 0a 20 20 20 20 2a 2a 20 6d  _vtab().    ** m
1c170 75 73 74 20 68 61 76 65 20 6e 61 6d 65 73 20 74  ust have names t
1c180 68 61 74 20 61 72 65 20 64 69 73 74 69 6e 63 74  hat are distinct
1c190 20 66 72 6f 6d 20 6e 6f 72 6d 61 6c 20 61 75 74   from normal aut
1c1a0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6e 61 6d  omatic index nam
1c1b0 65 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66  es..    ** The f
1c1c0 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
1c1d0 6e 74 20 63 6f 6e 76 65 72 74 73 20 22 73 71 6c  nt converts "sql
1c1e0 69 74 65 33 5f 61 75 74 6f 69 6e 64 65 78 2e 2e  ite3_autoindex..
1c1f0 2e 22 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 22  ." into.    ** "
1c200 73 71 6c 69 74 65 33 5f 62 75 74 6f 69 6e 64 65  sqlite3_butoinde
1c210 78 2e 2e 2e 22 20 69 6e 20 6f 72 64 65 72 20 74  x..." in order t
1c220 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 73  o make the names
1c230 20 64 69 73 74 69 6e 63 74 2e 0a 20 20 20 20 2a   distinct..    *
1c240 2a 20 54 68 65 20 22 76 74 61 62 5f 65 72 72 2e  * The "vtab_err.
1c250 74 65 73 74 22 20 74 65 73 74 20 64 65 6d 6f 6e  test" test demon
1c260 73 74 72 61 74 65 73 20 74 68 65 20 6e 65 65 64  strates the need
1c270 20 6f 66 20 74 68 69 73 20 73 74 61 74 65 6d 65   of this stateme
1c280 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 49  nt. */.    if( I
1c290 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20  N_SPECIAL_PARSE 
1c2a0 29 20 7a 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a 20 20  ) zName[7]++;.  
1c2b0 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
1c2c0 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  r authorization 
1c2d0 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  to create an ind
1c2e0 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ex..  */.#ifndef
1c2f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1c300 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
1c310 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45   !IN_RENAME_OBJE
1c320 43 54 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  CT ){.    const 
1c330 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d  char *zDb = pDb-
1c340 3e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69  >zDbSName;.    i
1c350 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1c360 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1c370 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
1c380 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c  A_TABLE(iDb), 0,
1c390 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
1c3a0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1c3b0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
1c3c0 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
1c3d0 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  TE_INDEX;.    if
1c3e0 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
1c3f0 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53  & iDb==1 ) i = S
1c400 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
1c410 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
1c420 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1c430 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61  k(pParse, i, zNa
1c440 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
1c450 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
1c460 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1c470 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
1c480 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1c490 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65   pList==0, it me
1c4a0 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ans this routine
1c4b0 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d   was called to m
1c4c0 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20  ake a primary.  
1c4d0 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68  ** key out of th
1c4e0 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64  e last column ad
1c4f0 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
1c500 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1c510 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65  ion..  ** So cre
1c520 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20  ate a fake list 
1c530 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73  to simulate this
1c540 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69  ..  */.  if( pLi
1c550 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54 6f 6b  st==0 ){.    Tok
1c560 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20 20 20 20  en prevCol;.    
1c570 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 26  Column *pCol = &
1c580 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
1c590 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 20 20 70 43  >nCol-1];.    pC
1c5a0 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
1c5b0 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45 3b 0a  COLFLAG_UNIQUE;.
1c5c0 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
1c5d0 49 6e 69 74 28 26 70 72 65 76 43 6f 6c 2c 20 70  Init(&prevCol, p
1c5e0 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
1c5f0 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1c600 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
1c610 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20  Parse, 0,.      
1c620 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1c630 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
1c640 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20 30 29  ID, &prevCol, 0)
1c650 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
1c660 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
1c670 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1c680 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
1c690 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20  >nExpr==1 );.   
1c6a0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1c6b0 53 65 74 53 6f 72 74 4f 72 64 65 72 28 70 4c 69  SetSortOrder(pLi
1c6c0 73 74 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 53  st, sortOrder, S
1c6d0 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e  QLITE_SO_UNDEFIN
1c6e0 45 44 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ED);.  }else{.  
1c6f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
1c700 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61  tCheckLength(pPa
1c710 72 73 65 2c 20 70 4c 69 73 74 2c 20 22 69 6e 64  rse, pList, "ind
1c720 65 78 22 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ex");.    if( pP
1c730 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
1c740 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1c750 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  dex;.  }..  /* F
1c760 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
1c770 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ny bytes of spac
1c780 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  e are required t
1c790 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74  o store explicit
1c7a0 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65  ly.  ** specifie
1c7b0 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
1c7c0 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f  ence names..  */
1c7d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1c7e0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1c7f0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
1c800 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
1c810 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
1c820 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  t( pExpr!=0 );. 
1c830 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
1c840 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a  ==TK_COLLATE ){.
1c850 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20        nExtra += 
1c860 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c  (1 + sqlite3Strl
1c870 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54  en30(pExpr->u.zT
1c880 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20  oken));.    }.  
1c890 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c  }..  /* .  ** Al
1c8a0 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
1c8b0 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a   structure. .  *
1c8c0 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  nName = sqli
1c8d0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
1c8e0 65 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20  e);.  nExtraCol 
1c8f0 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65  = pPk ? pPk->nKe
1c900 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 61 73 73 65  yCol : 1;.  asse
1c910 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
1c920 20 2b 20 6e 45 78 74 72 61 43 6f 6c 20 3c 3d 20   + nExtraCol <= 
1c930 33 32 37 36 37 20 2f 2a 20 46 69 74 73 20 69 6e  32767 /* Fits in
1c940 20 69 31 36 20 2a 2f 20 29 3b 0a 20 20 70 49 6e   i16 */ );.  pIn
1c950 64 65 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c  dex = sqlite3All
1c960 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74  ocateIndexObject
1c970 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70  (db, pList->nExp
1c980 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20  r + nExtraCol,. 
1c990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9b0 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78       nName + nEx
1c9c0 74 72 61 20 2b 20 31 2c 20 26 7a 45 78 74 72 61  tra + 1, &zExtra
1c9d0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
1c9e0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1c9f0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1ca00 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61  e_index;.  }.  a
1ca10 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
1ca20 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64  E_ALIGNMENT(pInd
1ca30 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 29  ex->aiRowLogEst)
1ca40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
1ca50 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
1ca60 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  NT(pIndex->azCol
1ca70 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  l) );.  pIndex->
1ca80 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a  zName = zExtra;.
1ca90 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d    zExtra += nNam
1caa0 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28  e + 1;.  memcpy(
1cab0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  pIndex->zName, z
1cac0 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a  Name, nName+1);.
1cad0 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
1cae0 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65   = pTab;.  pInde
1caf0 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38  x->onError = (u8
1cb00 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64  )onError;.  pInd
1cb10 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  ex->uniqNotNull 
1cb20 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  = onError!=OE_No
1cb30 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 64  ne;.  pIndex->id
1cb40 78 54 79 70 65 20 3d 20 69 64 78 54 79 70 65 3b  xType = idxType;
1cb50 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  .  pIndex->pSche
1cb60 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
1cb70 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e  ].pSchema;.  pIn
1cb80 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70  dex->nKeyCol = p
1cb90 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
1cba0 66 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20  f( pPIWhere ){. 
1cbb0 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
1cbc0 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70  eSelfReference(p
1cbd0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f  Parse, pTab, NC_
1cbe0 50 61 72 74 49 64 78 2c 20 70 50 49 57 68 65 72  PartIdx, pPIWher
1cbf0 65 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65  e, 0);.    pInde
1cc00 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
1cc10 20 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20   = pPIWhere;.   
1cc20 20 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20   pPIWhere = 0;. 
1cc30 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
1cc40 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
1cc50 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
1cc60 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
1cc70 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75  o see if we shou
1cc80 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65  ld honor DESC re
1cc90 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20  quests on index 
1cca0 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
1ccb0 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
1ccc0 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
1ccd0 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  ){.    sortOrder
1cce0 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20  Mask = -1;   /* 
1ccf0 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20  Honor DESC */.  
1cd00 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f  }else{.    sortO
1cd10 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20  rderMask = 0;   
1cd20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20   /* Ignore DESC 
1cd30 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61  */.  }..  /* Ana
1cd40 6c 79 7a 65 20 74 68 65 20 6c 69 73 74 20 6f 66  lyze the list of
1cd50 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1cd60 74 20 66 6f 72 6d 20 74 68 65 20 74 65 72 6d 73  t form the terms
1cd70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e   of the index an
1cd80 64 0a 20 20 2a 2a 20 72 65 70 6f 72 74 20 61 6e  d.  ** report an
1cd90 79 20 65 72 72 6f 72 73 2e 20 20 49 6e 20 74 68  y errors.  In th
1cda0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
1cdb0 65 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ere the expressi
1cdc0 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 0a 20 20  on is exactly.  
1cdd0 2a 2a 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d  ** a table colum
1cde0 6e 2c 20 73 74 6f 72 65 20 74 68 61 74 20 63 6f  n, store that co
1cdf0 6c 75 6d 6e 20 69 6e 20 61 69 43 6f 6c 75 6d 6e  lumn in aiColumn
1ce00 5b 5d 2e 20 20 46 6f 72 20 67 65 6e 65 72 61 6c  [].  For general
1ce10 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 20 20   expressions,.  
1ce20 2a 2a 20 70 6f 70 75 6c 61 74 65 20 70 49 6e 64  ** populate pInd
1ce30 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 61 6e 64  ex->aColExpr and
1ce40 20 73 74 6f 72 65 20 58 4e 5f 45 58 50 52 20 28   store XN_EXPR (
1ce50 2d 32 29 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b  -2) in aiColumn[
1ce60 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  ]..  **.  ** TOD
1ce70 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e 69  O: Issue a warni
1ce80 6e 67 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ng if two or mor
1ce90 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
1cea0 20 69 6e 64 65 78 20 61 72 65 20 69 64 65 6e 74   index are ident
1ceb0 69 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f 44 4f 3a  ical..  ** TODO:
1cec0 20 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67   Issue a warning
1ced0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 70 72   if the table pr
1cee0 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73 65  imary key is use
1cef0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
1cf00 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6b 65 79 2e  .  ** index key.
1cf10 0a 20 20 2a 2f 0a 20 20 70 4c 69 73 74 49 74 65  .  */.  pListIte
1cf20 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20  m = pList->a;.  
1cf30 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
1cf40 4a 45 43 54 20 29 7b 0a 20 20 20 20 70 49 6e 64  JECT ){.    pInd
1cf50 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70  ex->aColExpr = p
1cf60 4c 69 73 74 3b 0a 20 20 20 20 70 4c 69 73 74 20  List;.    pList 
1cf70 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  = 0;.  }.  for(i
1cf80 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 4b  =0; i<pIndex->nK
1cf90 65 79 43 6f 6c 3b 20 69 2b 2b 2c 20 70 4c 69 73  eyCol; i++, pLis
1cfa0 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  tItem++){.    Ex
1cfb0 70 72 20 2a 70 43 45 78 70 72 3b 20 20 20 20 20  pr *pCExpr;     
1cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cfd0 54 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20 65  The i-th index e
1cfe0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
1cff0 20 69 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f   int requestedSo
1d000 72 74 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20  rtOrder;        
1d010 2f 2a 20 41 53 43 20 6f 72 20 44 45 53 43 20 6f  /* ASC or DESC o
1d020 6e 20 74 68 65 20 69 2d 74 68 20 65 78 70 72 65  n the i-th expre
1d030 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e  ssion */.    con
1d040 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20  st char *zColl; 
1d050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1d060 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1d070 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 73  e name */..    s
1d080 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64  qlite3StringToId
1d090 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70  (pListItem->pExp
1d0a0 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  r);.    sqlite3R
1d0b0 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65  esolveSelfRefere
1d0c0 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  nce(pParse, pTab
1d0d0 2c 20 4e 43 5f 49 64 78 45 78 70 72 2c 20 70 4c  , NC_IdxExpr, pL
1d0e0 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  istItem->pExpr, 
1d0f0 30 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72  0);.    if( pPar
1d100 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
1d110 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1d120 78 3b 0a 20 20 20 20 70 43 45 78 70 72 20 3d 20  x;.    pCExpr = 
1d130 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
1d140 6f 6c 6c 61 74 65 28 70 4c 69 73 74 49 74 65 6d  ollate(pListItem
1d150 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ->pExpr);.    if
1d160 28 20 70 43 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  ( pCExpr->op!=TK
1d170 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
1d180 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73   if( pTab==pPars
1d190 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a  e->pNewTable ){.
1d1a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1d1b0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1d1c0 22 65 78 70 72 65 73 73 69 6f 6e 73 20 70 72 6f  "expressions pro
1d1d0 68 69 62 69 74 65 64 20 69 6e 20 50 52 49 4d 41  hibited in PRIMA
1d1e0 52 59 20 4b 45 59 20 61 6e 64 20 22 0a 20 20 20  RY KEY and ".   
1d1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d200 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55 4e               "UN
1d210 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73  IQUE constraints
1d220 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ");.        goto
1d230 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1d240 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
1d250 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 43    if( pIndex->aC
1d260 6f 6c 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20  olExpr==0 ){.   
1d270 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f       pIndex->aCo
1d280 6c 45 78 70 72 20 3d 20 70 4c 69 73 74 3b 0a 20  lExpr = pList;. 
1d290 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 30         pList = 0
1d2a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d2b0 6a 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20  j = XN_EXPR;.   
1d2c0 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
1d2d0 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 45 58 50 52  umn[i] = XN_EXPR
1d2e0 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  ;.      pIndex->
1d2f0 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b  uniqNotNull = 0;
1d300 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d310 20 20 6a 20 3d 20 70 43 45 78 70 72 2d 3e 69 43    j = pCExpr->iC
1d320 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 61 73 73  olumn;.      ass
1d330 65 72 74 28 20 6a 3c 3d 30 78 37 66 66 66 20 29  ert( j<=0x7fff )
1d340 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 30 20  ;.      if( j<0 
1d350 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70  ){.        j = p
1d360 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
1d370 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
1d380 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c  ->aCol[j].notNul
1d390 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
1d3a0 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e  pIndex->uniqNotN
1d3b0 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ull = 0;.      }
1d3c0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  .      pIndex->a
1d3d0 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31  iColumn[i] = (i1
1d3e0 36 29 6a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  6)j;.    }.    z
1d3f0 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  Coll = 0;.    if
1d400 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  ( pListItem->pEx
1d410 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pr->op==TK_COLLA
1d420 54 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  TE ){.      int 
1d430 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a 43 6f  nColl;.      zCo
1d440 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e  ll = pListItem->
1d450 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
1d460 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73  .      nColl = s
1d470 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1d480 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20  Coll) + 1;.     
1d490 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e   assert( nExtra>
1d4a0 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20  =nColl );.      
1d4b0 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a  memcpy(zExtra, z
1d4c0 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20  Coll, nColl);.  
1d4d0 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74      zColl = zExt
1d4e0 72 61 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61  ra;.      zExtra
1d4f0 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20   += nColl;.     
1d500 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c   nExtra -= nColl
1d510 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1d520 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43  j>=0 ){.      zC
1d530 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  oll = pTab->aCol
1d540 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 7d  [j].zColl;.    }
1d550 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20  .    if( !zColl 
1d560 29 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ) zColl = sqlite
1d570 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20  3StrBINARY;.    
1d580 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
1d590 73 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f  sy && !sqlite3Lo
1d5a0 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
1d5b0 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  se, zColl) ){.  
1d5c0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1d5d0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1d5e0 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a  }.    pIndex->az
1d5f0 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b  Coll[i] = zColl;
1d600 0a 20 20 20 20 72 65 71 75 65 73 74 65 64 53 6f  .    requestedSo
1d610 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49  rtOrder = pListI
1d620 74 65 6d 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  tem->sortFlags &
1d630 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a   sortOrderMask;.
1d640 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72      pIndex->aSor
1d650 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29  tOrder[i] = (u8)
1d660 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
1d670 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70  er;.  }..  /* Ap
1d680 70 65 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6b  pend the table k
1d690 65 79 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ey to the end of
1d6a0 20 74 68 65 20 69 6e 64 65 78 2e 20 20 46 6f 72   the index.  For
1d6b0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20   WITHOUT ROWID. 
1d6c0 20 2a 2a 20 74 61 62 6c 65 73 20 28 77 68 65 6e   ** tables (when
1d6d0 20 70 50 6b 21 3d 30 29 20 74 68 69 73 20 77 69   pPk!=0) this wi
1d6e0 6c 6c 20 62 65 20 74 68 65 20 64 65 63 6c 61 72  ll be the declar
1d6f0 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20  ed PRIMARY KEY. 
1d700 20 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c   For.  ** normal
1d710 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50   tables (when pP
1d720 6b 3d 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20  k==0) this will 
1d730 62 65 20 74 68 65 20 72 6f 77 69 64 2e 0a 20 20  be the rowid..  
1d740 2a 2f 0a 20 20 69 66 28 20 70 50 6b 20 29 7b 0a  */.  if( pPk ){.
1d750 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
1d760 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  Pk->nKeyCol; j++
1d770 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d  ){.      int x =
1d780 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a   pPk->aiColumn[j
1d790 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
1d7a0 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69   x>=0 );.      i
1d7b0 66 28 20 69 73 44 75 70 43 6f 6c 75 6d 6e 28 70  f( isDupColumn(p
1d7c0 49 6e 64 65 78 2c 20 70 49 6e 64 65 78 2d 3e 6e  Index, pIndex->n
1d7d0 4b 65 79 43 6f 6c 2c 20 70 50 6b 2c 20 6a 29 20  KeyCol, pPk, j) 
1d7e0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
1d7f0 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20  x->nColumn--; . 
1d800 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d810 20 20 20 20 74 65 73 74 63 61 73 65 28 20 68 61      testcase( ha
1d820 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e  sColumn(pIndex->
1d830 61 69 43 6f 6c 75 6d 6e 2c 70 49 6e 64 65 78 2d  aiColumn,pIndex-
1d840 3e 6e 4b 65 79 43 6f 6c 2c 78 29 20 29 3b 0a 20  >nKeyCol,x) );. 
1d850 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
1d860 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a  iColumn[i] = x;.
1d870 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1d880 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d  azColl[i] = pPk-
1d890 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20  >azColl[j];.    
1d8a0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72      pIndex->aSor
1d8b0 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 50 6b 2d  tOrder[i] = pPk-
1d8c0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a  >aSortOrder[j];.
1d8d0 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
1d8e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
1d8f0 73 73 65 72 74 28 20 69 3d 3d 70 49 6e 64 65 78  ssert( i==pIndex
1d900 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d  ->nColumn );.  }
1d910 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64 65 78  else{.    pIndex
1d920 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
1d930 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 70 49  XN_ROWID;.    pI
1d940 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20  ndex->azColl[i] 
1d950 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  = sqlite3StrBINA
1d960 52 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  RY;.  }.  sqlite
1d970 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70  3DefaultRowEst(p
1d980 49 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 70 50  Index);.  if( pP
1d990 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
1d9a0 3d 30 20 29 20 65 73 74 69 6d 61 74 65 49 6e 64  =0 ) estimateInd
1d9b0 65 78 57 69 64 74 68 28 70 49 6e 64 65 78 29 3b  exWidth(pIndex);
1d9c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1d9d0 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73 20 65 76  ndex contains ev
1d9e0 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 74  ery column of it
1d9f0 73 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  s table, then ma
1da00 72 6b 0a 20 20 2a 2a 20 69 74 20 61 73 20 61 20  rk.  ** it as a 
1da10 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a  covering index *
1da20 2f 0a 20 20 61 73 73 65 72 74 28 20 48 61 73 52  /.  assert( HasR
1da30 6f 77 69 64 28 70 54 61 62 29 20 0a 20 20 20 20  owid(pTab) .    
1da40 20 20 7c 7c 20 70 54 61 62 2d 3e 69 50 4b 65 79    || pTab->iPKey
1da50 3c 30 20 7c 7c 20 73 71 6c 69 74 65 33 43 6f 6c  <0 || sqlite3Col
1da60 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65  umnOfIndex(pInde
1da70 78 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79 29 3e  x, pTab->iPKey)>
1da80 3d 30 20 29 3b 0a 20 20 72 65 63 6f 6d 70 75 74  =0 );.  recomput
1da90 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65 78  eColumnsNotIndex
1daa0 65 64 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66  ed(pIndex);.  if
1dab0 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 26 26  ( pTblName!=0 &&
1dac0 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
1dad0 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  >=pTab->nCol ){.
1dae0 20 20 20 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f      pIndex->isCo
1daf0 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20  vering = 1;.    
1db00 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
1db10 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
1db20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e     if( j==pTab->
1db30 69 50 4b 65 79 20 29 20 63 6f 6e 74 69 6e 75 65  iPKey ) continue
1db40 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
1db50 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
1db60 28 70 49 6e 64 65 78 2c 6a 29 3e 3d 30 20 29 20  (pIndex,j)>=0 ) 
1db70 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1db80 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72 69  pIndex->isCoveri
1db90 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  ng = 0;.      br
1dba0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
1dbb0 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72    if( pTab==pPar
1dbc0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b  se->pNewTable ){
1dbd0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  .    /* This rou
1dbe0 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61  tine has been ca
1dbf0 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
1dc00 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
1dc10 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65  x as a.    ** re
1dc20 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52  sult of a PRIMAR
1dc30 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
1dc40 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75  clause on a colu
1dc50 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f  mn definition, o
1dc60 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41  r.    ** a PRIMA
1dc70 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
1dc80 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e   clause followin
1dc90 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66  g the column def
1dca0 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  initions..    **
1dcb0 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20   i.e. one of:.  
1dcc0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41    **.    ** CREA
1dcd0 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49  TE TABLE t(x PRI
1dce0 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
1dcf0 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
1dd00 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45  E t(x, y, UNIQUE
1dd10 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a  (x, y));.    **.
1dd20 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61      ** Either wa
1dd30 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  y, check to see 
1dd40 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  if the table alr
1dd50 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e  eady has such an
1dd60 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a   index. If.    *
1dd70 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68  * so, don't both
1dd80 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73  er creating this
1dd90 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20   one. This only 
1dda0 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a  applies to.    *
1ddb0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
1ddc0 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e  created indices.
1ddd0 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73   Users can do as
1dde0 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a   they wish with.
1ddf0 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20      ** explicit 
1de00 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a  indices..    **.
1de10 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55      ** Two UNIQU
1de20 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
1de30 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
1de40 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69   considered equi
1de50 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61  valent.    ** (a
1de60 6e 64 20 74 68 75 73 20 73 75 70 70 72 65 73 73  nd thus suppress
1de70 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  ing the second o
1de80 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68 65 79  ne) even if they
1de90 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
1dea0 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65      ** sort orde
1deb0 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rs..    **.    *
1dec0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
1ded0 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69  ifferent collati
1dee0 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20  ng sequences or 
1def0 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  if the columns o
1df00 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e  f.    ** the con
1df10 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e  straint occur in
1df20 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
1df30 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73  s, then the cons
1df40 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20  traints are.    
1df50 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69  ** considered di
1df60 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20  stinct and both 
1df70 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61  result in separa
1df80 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  te indices..    
1df90 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
1dfa0 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
1dfb0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
1dfc0 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
1dfd0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
1dfe0 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t k;.      asser
1dff0 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  t( IsUniqueIndex
1e000 28 70 49 64 78 29 20 29 3b 0a 20 20 20 20 20 20  (pIdx) );.      
1e010 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 64  assert( pIdx->id
1e020 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44  xType!=SQLITE_ID
1e030 58 54 59 50 45 5f 41 50 50 44 45 46 20 29 3b 0a  XTYPE_APPDEF );.
1e040 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73        assert( Is
1e050 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64  UniqueIndex(pInd
1e060 65 78 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  ex) );..      if
1e070 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21  ( pIdx->nKeyCol!
1e080 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c  =pIndex->nKeyCol
1e090 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e0a0 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49     for(k=0; k<pI
1e0b0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b  dx->nKeyCol; k++
1e0c0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
1e0d0 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20   char *z1;.     
1e0e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1e0f0 32 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  2;.        asser
1e100 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  t( pIdx->aiColum
1e110 6e 5b 6b 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20  n[k]>=0 );.     
1e120 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
1e130 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78  olumn[k]!=pIndex
1e140 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20  ->aiColumn[k] ) 
1e150 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a  break;.        z
1e160 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  1 = pIdx->azColl
1e170 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20  [k];.        z2 
1e180 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
1e190 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [k];.        if(
1e1a0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1e1b0 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b  z1, z2) ) break;
1e1c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1e1d0 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79  f( k==pIdx->nKey
1e1e0 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Col ){.        i
1e1f0 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
1e200 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  !=pIndex->onErro
1e210 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
1e220 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  * This constrain
1e230 74 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61  t creates the sa
1e240 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72  me index as a pr
1e250 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20  evious.         
1e260 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73   ** constraint s
1e270 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65  pecified somewhe
1e280 72 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  re in the CREATE
1e290 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
1e2a0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48  ..          ** H
1e2b0 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f  owever the ON CO
1e2c0 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61  NFLICT clauses a
1e2d0 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66  re different. If
1e2e0 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20   both this .    
1e2f0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61        ** constra
1e300 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76  int and the prev
1e310 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20  ious equivalent 
1e320 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20  constraint have 
1e330 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20  explicit.       
1e340 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43     ** ON CONFLIC
1e350 54 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69  T clauses this i
1e360 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65  s an error. Othe
1e370 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20  rwise, use the. 
1e380 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c           ** expl
1e390 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64  icitly specified
1e3a0 20 62 65 68 61 76 69 6f 72 20 66 6f 72 20 74 68   behavior for th
1e3b0 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  e index..       
1e3c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1e3d0 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72  if( !(pIdx->onEr
1e3e0 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
1e3f0 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  || pIndex->onErr
1e400 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20  or==OE_Default) 
1e410 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1e420 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1e430 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
1e440 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63          "conflic
1e450 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54  ting ON CONFLICT
1e460 20 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69   clauses specifi
1e470 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ed", 0);.       
1e480 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
1e490 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
1e4a0 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a  ==OE_Default ){.
1e4b0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
1e4c0 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64  ->onError = pInd
1e4d0 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20  ex->onError;.   
1e4e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e4f0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
1e500 64 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49  dxType==SQLITE_I
1e510 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45  DXTYPE_PRIMARYKE
1e520 59 20 29 20 70 49 64 78 2d 3e 69 64 78 54 79 70  Y ) pIdx->idxTyp
1e530 65 20 3d 20 69 64 78 54 79 70 65 3b 0a 20 20 20  e = idxType;.   
1e540 20 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41       if( IN_RENA
1e550 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
1e560 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70         pIndex->p
1e570 4e 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 70  Next = pParse->p
1e580 4e 65 77 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  NewIndex;.      
1e590 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
1e5a0 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
1e5b0 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78            pIndex
1e5c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
1e5d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
1e5e0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1e5f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e600 7d 0a 0a 20 20 69 66 28 20 21 49 4e 5f 52 45 4e  }..  if( !IN_REN
1e610 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 0a 20  AME_OBJECT ){.. 
1e620 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e     /* Link the n
1e630 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  ew Index structu
1e640 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20  re to its table 
1e650 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72  and to the other
1e660 0a 20 20 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  .    ** in-memor
1e670 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  y database struc
1e680 74 75 72 65 73 2e 20 0a 20 20 20 20 2a 2f 0a 20  tures. .    */. 
1e690 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1e6a0 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20  e->nErr==0 );.  
1e6b0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
1e6c0 75 73 79 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  usy ){.      Ind
1e6d0 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 61 73 73  ex *p;.      ass
1e6e0 65 72 74 28 20 21 49 4e 5f 53 50 45 43 49 41 4c  ert( !IN_SPECIAL
1e6f0 5f 50 41 52 53 45 20 29 3b 0a 20 20 20 20 20 20  _PARSE );.      
1e700 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
1e710 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
1e720 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53  b, 0, pIndex->pS
1e730 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20  chema) );.      
1e740 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
1e750 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
1e760 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  x->tnum = db->in
1e770 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20  it.newTnum;.    
1e780 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1e790 6e 64 65 78 48 61 73 44 75 70 6c 69 63 61 74 65  ndexHasDuplicate
1e7a0 52 6f 6f 74 50 61 67 65 28 70 49 6e 64 65 78 29  RootPage(pIndex)
1e7b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
1e7c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1e7d0 61 72 73 65 2c 20 22 69 6e 76 61 6c 69 64 20 72  arse, "invalid r
1e7e0 6f 6f 74 70 61 67 65 22 29 3b 0a 20 20 20 20 20  ootpage");.     
1e7f0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
1e800 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1e810 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
1e820 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1e830 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 20  e_index;.       
1e840 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1e850 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
1e860 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e  Insert(&pIndex->
1e870 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
1e880 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 49 6e  , .          pIn
1e890 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64  dex->zName, pInd
1e8a0 65 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ex);.      if( p
1e8b0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1e8c0 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b  rt( p==pIndex );
1e8d0 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
1e8e0 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
1e8f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
1e900 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
1e910 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1e920 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1e930 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6d     }.      db->m
1e940 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41  DbFlags |= DBFLA
1e950 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  G_SchemaChange;.
1e960 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1e970 20 74 68 69 73 20 69 73 20 74 68 65 20 69 6e 69   this is the ini
1e980 74 69 61 6c 20 43 52 45 41 54 45 20 49 4e 44 45  tial CREATE INDE
1e990 58 20 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20  X statement (or 
1e9a0 43 52 45 41 54 45 20 54 41 42 4c 45 20 69 66 20  CREATE TABLE if 
1e9b0 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  the.    ** index
1e9c0 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 69   is an implied i
1e9d0 6e 64 65 78 20 66 6f 72 20 61 20 55 4e 49 51 55  ndex for a UNIQU
1e9e0 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
1e9f0 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 74 68 65   constraint) the
1ea00 6e 0a 20 20 20 20 2a 2a 20 65 6d 69 74 20 63 6f  n.    ** emit co
1ea10 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  de to allocate t
1ea20 68 65 20 69 6e 64 65 78 20 72 6f 6f 74 70 61 67  he index rootpag
1ea30 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64 20 6d 61  e on disk and ma
1ea40 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 0a  ke an entry for.
1ea50 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78      ** the index
1ea60 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
1ea70 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
1ea80 70 6f 70 75 6c 61 74 65 20 74 68 65 20 69 6e 64  populate the ind
1ea90 65 78 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 63  ex with.    ** c
1eaa0 6f 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f  ontent.  But, do
1eab0 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 69 66 20   not do this if 
1eac0 77 65 20 61 72 65 20 73 69 6d 70 6c 79 20 72 65  we are simply re
1ead0 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
1eae0 5f 6d 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 74  _master.    ** t
1eaf0 61 62 6c 65 20 74 6f 20 70 61 72 73 65 20 74 68  able to parse th
1eb00 65 20 73 63 68 65 6d 61 2c 20 6f 72 20 69 66 20  e schema, or if 
1eb10 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 74 68  this index is th
1eb20 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
1eb30 64 65 78 0a 20 20 20 20 2a 2a 20 6f 66 20 61 20  dex.    ** of a 
1eb40 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
1eb50 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ble..    **.    
1eb60 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d  ** If pTblName==
1eb70 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
1eb80 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74  index is generat
1eb90 65 64 20 61 73 20 61 6e 20 69 6d 70 6c 69 65 64  ed as an implied
1eba0 20 50 52 49 4d 41 52 59 20 4b 45 59 0a 20 20 20   PRIMARY KEY.   
1ebb0 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 69 6e   ** or UNIQUE in
1ebc0 64 65 78 20 69 6e 20 61 20 43 52 45 41 54 45 20  dex in a CREATE 
1ebd0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
1ebe0 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c    Since the tabl
1ebf0 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6a 75 73  e.    ** has jus
1ec00 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  t been created, 
1ec10 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  it contains no d
1ec20 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ata and the inde
1ec30 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  x initialization
1ec40 0a 20 20 20 20 2a 2a 20 73 74 65 70 20 63 61 6e  .    ** step can
1ec50 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   be skipped..   
1ec60 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1ec70 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
1ec80 7c 7c 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  || pTblName!=0 )
1ec90 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76 3b  {.      Vdbe *v;
1eca0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 74  .      char *zSt
1ecb0 6d 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d  mt;.      int iM
1ecc0 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
1ecd0 4d 65 6d 3b 0a 0a 20 20 20 20 20 20 76 20 3d 20  Mem;..      v = 
1ece0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1ecf0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66  Parse);.      if
1ed00 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ( v==0 ) goto ex
1ed10 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1ed20 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ..      sqlite3B
1ed30 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
1ed40 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
1ed50 62 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72  b);..      /* Cr
1ed60 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67  eate the rootpag
1ed70 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  e for the index 
1ed80 75 73 69 6e 67 20 43 72 65 61 74 65 49 6e 64 65  using CreateInde
1ed90 78 2e 20 42 75 74 20 62 65 66 6f 72 65 0a 20 20  x. But before.  
1eda0 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c      ** doing so,
1edb0 20 63 6f 64 65 20 61 20 4e 6f 6f 70 20 69 6e 73   code a Noop ins
1edc0 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 73 74 6f  truction and sto
1edd0 72 65 20 69 74 73 20 61 64 64 72 65 73 73 20 69  re its address i
1ede0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 49 6e 64 65  n .      ** Inde
1edf0 78 2e 74 6e 75 6d 2e 20 54 68 69 73 20 69 73 20  x.tnum. This is 
1ee00 72 65 71 75 69 72 65 64 20 69 6e 20 63 61 73 65  required in case
1ee10 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 61   this index is a
1ee20 63 74 75 61 6c 6c 79 20 61 20 0a 20 20 20 20 20  ctually a .     
1ee30 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
1ee40 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 69 73  and the table is
1ee50 20 61 63 74 75 61 6c 6c 79 20 61 20 57 49 54 48   actually a WITH
1ee60 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e  OUT ROWID table.
1ee70 20 49 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   In .      ** th
1ee80 61 74 20 63 61 73 65 20 74 68 65 20 63 6f 6e 76  at case the conv
1ee90 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69  ertToWithoutRowi
1eea0 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65  dTable() routine
1eeb0 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20   will replace.  
1eec0 20 20 20 20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20      ** the Noop 
1eed0 77 69 74 68 20 61 20 47 6f 74 6f 20 74 6f 20 6a  with a Goto to j
1eee0 75 6d 70 20 6f 76 65 72 20 74 68 65 20 56 44 42  ump over the VDB
1eef0 45 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  E code generated
1ef00 20 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20   below. */.     
1ef10 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
1ef20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ef30 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20  0(v, OP_Noop);. 
1ef40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ef50 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65  AddOp3(v, OP_Cre
1ef60 61 74 65 42 74 72 65 65 2c 20 69 44 62 2c 20 69  ateBtree, iDb, i
1ef70 4d 65 6d 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b  Mem, BTREE_BLOBK
1ef80 45 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  EY);..      /* G
1ef90 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65  ather the comple
1efa0 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
1efb0 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
1efc0 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 20  ement into.     
1efd0 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61   ** the zStmt va
1efe0 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a  riable.      */.
1eff0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
1f000 61 6d 65 21 3d 30 20 7c 7c 20 70 53 74 61 72 74  ame!=0 || pStart
1f010 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
1f020 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20   pStart ){.     
1f030 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29     int n = (int)
1f040 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f  (pParse->sLastTo
1f050 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a  ken.z - pName->z
1f060 29 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  ) + pParse->sLas
1f070 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20  tToken.n;.      
1f080 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e    if( pName->z[n
1f090 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a  -1]==';' ) n--;.
1f0a0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d          /* A nam
1f0b0 65 64 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e  ed index with an
1f0c0 20 65 78 70 6c 69 63 69 74 20 43 52 45 41 54 45   explicit CREATE
1f0d0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
1f0e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53 74 6d   */.        zStm
1f0f0 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
1f100 74 66 28 64 62 2c 20 22 43 52 45 41 54 45 25 73  tf(db, "CREATE%s
1f110 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20   INDEX %.*s",.  
1f120 20 20 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f            onErro
1f130 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20  r==OE_None ? "" 
1f140 3a 20 22 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20  : " UNIQUE", n, 
1f150 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 20  pName->z);.     
1f160 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f170 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20  /* An automatic 
1f180 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79  index created by
1f190 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
1f1a0 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
1f1b0 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 2f  int */.        /
1f1c0 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  * zStmt = sqlite
1f1d0 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f  3MPrintf(""); */
1f1e0 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  .        zStmt =
1f1f0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   0;.      }..   
1f200 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74     /* Add an ent
1f210 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73  ry in sqlite_mas
1f220 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64  ter for this ind
1f230 65 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ex.      */.    
1f240 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
1f250 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
1f260 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20          "INSERT 
1f270 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45  INTO %Q.%s VALUE
1f280 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c  S('index',%Q,%Q,
1f290 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20  #%d,%Q);",.     
1f2a0 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
1f2b0 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54  ].zDbSName, MAST
1f2c0 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20 20  ER_NAME,.       
1f2d0 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
1f2e0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  ,.          pTab
1f2f0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
1f300 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20     iMem,.       
1f310 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 20 20 20     zStmt.       
1f320 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
1f330 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
1f340 74 6d 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  tmt);..      /* 
1f350 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77  Fill the index w
1f360 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70  ith data and rep
1f370 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e  arse the schema.
1f380 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69   Code an OP_Expi
1f390 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 69  re.      ** to i
1f3a0 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72  nvalidate all pr
1f3b0 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  e-compiled state
1f3c0 6d 65 6e 74 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  ments..      */.
1f3d0 20 20 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61        if( pTblNa
1f3e0 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
1f3f0 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
1f400 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
1f410 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20   iMem);.        
1f420 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
1f430 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
1f440 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1f450 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68  3VdbeAddParseSch
1f460 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20  emaOp(v, iDb,.  
1f470 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1f480 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61  3MPrintf(db, "na
1f490 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65  me='%q' AND type
1f4a0 3d 27 69 6e 64 65 78 27 22 2c 20 70 49 6e 64 65  ='index'", pInde
1f4b0 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
1f4c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f4d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 78 70 69  ddOp2(v, OP_Expi
1f4e0 72 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20  re, 0, 1);.     
1f4f0 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65   }..      sqlite
1f500 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1f510 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 29 3b 0a   pIndex->tnum);.
1f520 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1f530 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69  When adding an i
1f540 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74  ndex to the list
1f550 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20   of indices for 
1f560 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20  a table, make.  
1f570 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69  ** sure all indi
1f580 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52  ces labeled OE_R
1f590 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65  eplace come afte
1f5a0 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65  r all those labe
1f5b0 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f  led.  ** OE_Igno
1f5c0 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  re.  This is nec
1f5d0 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63  essary for the c
1f5e0 6f 72 72 65 63 74 20 63 6f 6e 73 74 72 61 69 6e  orrect constrain
1f5f0 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f  t check.  ** pro
1f600 63 65 73 73 69 6e 67 20 28 69 6e 20 73 71 6c 69  cessing (in sqli
1f610 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74  te3GenerateConst
1f620 72 61 69 6e 74 43 68 65 63 6b 73 28 29 29 20 61  raintChecks()) a
1f630 73 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55  s part of.  ** U
1f640 50 44 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54  PDATE and INSERT
1f650 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20   statements.  . 
1f660 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
1f670 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e  it.busy || pTblN
1f680 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ame==0 ){.    if
1f690 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ( onError!=OE_Re
1f6a0 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70  place || pTab->p
1f6b0 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20  Index==0.       
1f6c0 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65    || pTab->pInde
1f6d0 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52  x->onError==OE_R
1f6e0 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70  eplace){.      p
1f6f0 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
1f700 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
1f710 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20     pTab->pIndex 
1f720 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65  = pIndex;.    }e
1f730 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
1f740 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d   *pOther = pTab-
1f750 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77  >pIndex;.      w
1f760 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e  hile( pOther->pN
1f770 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70  ext && pOther->p
1f780 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  Next->onError!=O
1f790 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20  E_Replace ){.   
1f7a0 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f       pOther = pO
1f7b0 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
1f7c0 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65     }.      pInde
1f7d0 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65  x->pNext = pOthe
1f7e0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
1f7f0 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20  pOther->pNext = 
1f800 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  pIndex;.    }.  
1f810 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
1f820 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 49 4e 5f  }.  else if( IN_
1f830 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
1f840 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1f850 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78 3d 3d  rse->pNewIndex==
1f860 30 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  0 );.    pParse-
1f870 3e 70 4e 65 77 49 6e 64 65 78 20 3d 20 70 49 6e  >pNewIndex = pIn
1f880 64 65 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 20  dex;.    pIndex 
1f890 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
1f8a0 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65  lean up before e
1f8b0 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63  xiting */.exit_c
1f8c0 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69  reate_index:.  i
1f8d0 66 28 20 70 49 6e 64 65 78 20 29 20 73 71 6c 69  f( pIndex ) sqli
1f8e0 74 65 33 46 72 65 65 49 6e 64 65 78 28 64 62 2c  te3FreeIndex(db,
1f8f0 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69   pIndex);.  sqli
1f900 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1f910 2c 20 70 50 49 57 68 65 72 65 29 3b 0a 20 20 73  , pPIWhere);.  s
1f920 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
1f930 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
1f940 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
1f950 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62 6c  tDelete(db, pTbl
1f960 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
1f970 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
1f980 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c  );.}../*.** Fill
1f990 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77   the Index.aiRow
1f9a0 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68  Est[] array with
1f9b0 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61   default informa
1f9c0 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69  tion - informati
1f9d0 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64  on.** to be used
1f9e0 20 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f   when we have no
1f9f0 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a  t run the ANALYZ
1fa00 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  E command..**.**
1fa10 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20   aiRowEst[0] is 
1fa20 73 75 70 70 6f 73 65 64 20 74 6f 20 63 6f 6e 74  supposed to cont
1fa30 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ain the number o
1fa40 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
1fa50 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63  e index..** Sinc
1fa60 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  e we do not know
1fa70 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f  , guess 1 millio
1fa80 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20  n.  aiRowEst[1] 
1fa90 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
1faa0 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  f the.** number 
1fab0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
1fac0 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20  able that match 
1fad0 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 76  any particular v
1fae0 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  alue of the.** f
1faf0 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  irst column of t
1fb00 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77  he index.  aiRow
1fb10 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74  Est[2] is an est
1fb20 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
1fb30 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74  ber.** of rows t
1fb40 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
1fb50 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61  rticular combina
1fb60 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73  tion of the firs
1fb70 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f  t 2 columns.** o
1fb80 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e  f the index.  An
1fb90 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20  d so forth.  It 
1fba0 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 74  must always be t
1fbb0 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a  he case that.*.*
1fbc0 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
1fbd0 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73  wEst[N]<=aiRowEs
1fbe0 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20  t[N-1].**       
1fbf0 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e      aiRowEst[N]>
1fc00 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66  =1.**.** Apart f
1fc10 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76  rom that, we hav
1fc20 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f  e little to go o
1fc30 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75 69 74  n besides intuit
1fc40 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77  ion as to.** how
1fc50 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75   aiRowEst[] shou
1fc60 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ld be initialize
1fc70 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20  d.  The numbers 
1fc80 67 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a  generated here.*
1fc90 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74  * are based on t
1fca0 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f  ypical values fo
1fcb0 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e  und in actual in
1fcc0 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dices..*/.void s
1fcd0 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77  qlite3DefaultRow
1fce0 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29  Est(Index *pIdx)
1fcf0 7b 0a 20 20 2f 2a 20 20 20 20 20 20 20 20 20 20  {.  /*          
1fd00 20 20 20 20 20 20 31 30 2c 20 20 39 2c 20 20 38        10,  9,  8
1fd10 2c 20 20 37 2c 20 20 36 20 2a 2f 0a 20 20 4c 6f  ,  7,  6 */.  Lo
1fd20 67 45 73 74 20 61 56 61 6c 5b 5d 20 3d 20 7b 20  gEst aVal[] = { 
1fd30 33 33 2c 20 33 32 2c 20 33 30 2c 20 32 38 2c 20  33, 32, 30, 28, 
1fd40 32 36 20 7d 3b 0a 20 20 4c 6f 67 45 73 74 20 2a  26 };.  LogEst *
1fd50 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c  a = pIdx->aiRowL
1fd60 6f 67 45 73 74 3b 0a 20 20 69 6e 74 20 6e 43 6f  ogEst;.  int nCo
1fd70 70 79 20 3d 20 4d 49 4e 28 41 72 72 61 79 53 69  py = MIN(ArraySi
1fd80 7a 65 28 61 56 61 6c 29 2c 20 70 49 64 78 2d 3e  ze(aVal), pIdx->
1fd90 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 69 6e 74 20  nKeyCol);.  int 
1fda0 69 3b 0a 0a 20 20 2f 2a 20 49 6e 64 65 78 65 73  i;..  /* Indexes
1fdb0 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 72 6f   with default ro
1fdc0 77 20 65 73 74 69 6d 61 74 65 73 20 73 68 6f 75  w estimates shou
1fdd0 6c 64 20 6e 6f 74 20 68 61 76 65 20 73 74 61 74  ld not have stat
1fde0 31 20 64 61 74 61 20 2a 2f 0a 20 20 61 73 73 65  1 data */.  asse
1fdf0 72 74 28 20 21 70 49 64 78 2d 3e 68 61 73 53 74  rt( !pIdx->hasSt
1fe00 61 74 31 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  at1 );..  /* Set
1fe10 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1fe20 20 28 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73   (number of rows
1fe30 20 69 6e 20 74 68 65 20 69 6e 64 65 78 29 20 74   in the index) t
1fe40 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  o the estimated 
1fe50 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
1fe60 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1fe70 65 2c 20 6f 72 20 68 61 6c 66 20 74 68 65 20 6e  e, or half the n
1fe80 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1fe90 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20   the table.  ** 
1fea0 66 6f 72 20 61 20 70 61 72 74 69 61 6c 20 69 6e  for a partial in
1feb0 64 65 78 2e 20 20 20 42 75 74 20 64 6f 20 6e 6f  dex.   But do no
1fec0 74 20 6c 65 74 20 74 68 65 20 65 73 74 69 6d 61  t let the estima
1fed0 74 65 20 64 72 6f 70 20 62 65 6c 6f 77 20 31 30  te drop below 10
1fee0 2e 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20 70 49  . */.  a[0] = pI
1fef0 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77  dx->pTable->nRow
1ff00 4c 6f 67 45 73 74 3b 0a 20 20 69 66 28 20 70 49  LogEst;.  if( pI
1ff10 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
1ff20 65 21 3d 30 20 29 20 61 5b 30 5d 20 2d 3d 20 31  e!=0 ) a[0] -= 1
1ff30 30 3b 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d  0;  assert( 10==
1ff40 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29  sqlite3LogEst(2)
1ff50 20 29 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3c 33   );.  if( a[0]<3
1ff60 33 20 29 20 61 5b 30 5d 20 3d 20 33 33 3b 20 20  3 ) a[0] = 33;  
1ff70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff80 61 73 73 65 72 74 28 20 33 33 3d 3d 73 71 6c 69  assert( 33==sqli
1ff90 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 29 3b  te3LogEst(10) );
1ffa0 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20  ..  /* Estimate 
1ffb0 74 68 61 74 20 61 5b 31 5d 20 69 73 20 31 30 2c  that a[1] is 10,
1ffc0 20 61 5b 32 5d 20 69 73 20 39 2c 20 61 5b 33 5d   a[2] is 9, a[3]
1ffd0 20 69 73 20 38 2c 20 61 5b 34 5d 20 69 73 20 37   is 8, a[4] is 7
1ffe0 2c 20 61 5b 35 5d 20 69 73 0a 20 20 2a 2a 20 36  , a[5] is.  ** 6
1fff0 20 61 6e 64 20 65 61 63 68 20 73 75 62 73 65 71   and each subseq
20000 75 65 6e 74 20 76 61 6c 75 65 20 28 69 66 20 61  uent value (if a
20010 6e 79 29 20 69 73 20 35 2e 20 20 2a 2f 0a 20 20  ny) is 5.  */.  
20020 6d 65 6d 63 70 79 28 26 61 5b 31 5d 2c 20 61 56  memcpy(&a[1], aV
20030 61 6c 2c 20 6e 43 6f 70 79 2a 73 69 7a 65 6f 66  al, nCopy*sizeof
20040 28 4c 6f 67 45 73 74 29 29 3b 0a 20 20 66 6f 72  (LogEst));.  for
20050 28 69 3d 6e 43 6f 70 79 2b 31 3b 20 69 3c 3d 70  (i=nCopy+1; i<=p
20060 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b  Idx->nKeyCol; i+
20070 2b 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 32  +){.    a[i] = 2
20080 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3;              
20090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32 33        assert( 23
200a0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
200b0 35 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  5) );.  }..  ass
200c0 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c  ert( 0==sqlite3L
200d0 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20 69 66  ogEst(1) );.  if
200e0 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  ( IsUniqueIndex(
200f0 70 49 64 78 29 20 29 20 61 5b 70 49 64 78 2d 3e  pIdx) ) a[pIdx->
20100 6e 4b 65 79 43 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a  nKeyCol] = 0;.}.
20110 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
20120 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e  ine will drop an
20130 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20   existing named 
20140 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75  index.  This rou
20150 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tine.** implemen
20160 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45  ts the DROP INDE
20170 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  X statement..*/.
20180 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
20190 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
201a0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
201b0 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73 74  ame, int ifExist
201c0 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  s){.  Index *pIn
201d0 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  dex;.  Vdbe *v;.
201e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
201f0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
20200 74 20 69 44 62 3b 0a 0a 20 20 61 73 73 65 72 74  t iDb;..  assert
20210 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
20220 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76 65 72 20  0 );   /* Never 
20230 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72 69 6f  called with prio
20240 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66  r errors */.  if
20250 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
20260 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
20270 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
20280 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
20290 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
202a0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
202b0 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
202c0 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
202d0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
202e0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49  _index;.  }.  pI
202f0 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
20300 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d  ndIndex(db, pNam
20310 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
20320 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
20330 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e  base);.  if( pIn
20340 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  dex==0 ){.    if
20350 28 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a 20  ( !ifExists ){. 
20360 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
20370 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
20380 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22   such index: %S"
20390 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , pName, 0);.   
203a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
203b0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e  lite3CodeVerifyN
203c0 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72 73  amedSchema(pPars
203d0 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
203e0 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 7d  Database);.    }
203f0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65  .    pParse->che
20400 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
20410 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
20420 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
20430 28 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70  ( pIndex->idxTyp
20440 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e!=SQLITE_IDXTYP
20450 45 5f 41 50 50 44 45 46 20 29 7b 0a 20 20 20 20  E_APPDEF ){.    
20460 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
20470 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61  pParse, "index a
20480 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55  ssociated with U
20490 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f  NIQUE ".      "o
204a0 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
204b0 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
204c0 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b  be dropped", 0);
204d0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
204e0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
204f0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
20500 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
20510 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
20520 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
20530 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
20540 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
20550 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
20560 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61  OP_INDEX;.    Ta
20570 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
20580 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20  ex->pTable;.    
20590 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
205a0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
205b0 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  DbSName;.    con
205c0 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
205d0 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
205e0 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
205f0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
20600 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
20610 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
20620 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
20630 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
20640 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f      }.    if( !O
20650 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
20660 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  b ) code = SQLIT
20670 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45  E_DROP_TEMP_INDE
20680 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
20690 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
206a0 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78  se, code, pIndex
206b0 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
206c0 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
206d0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
206e0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
206f0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
20700 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
20710 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  o remove the ind
20720 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20  ex and from the 
20730 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
20740 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
20750 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
20760 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
20770 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
20780 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
20790 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  1, iDb);.    sql
207a0 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
207b0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22  pParse,.       "
207c0 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
207d0 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 20  s WHERE name=%Q 
207e0 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27  AND type='index'
207f0 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ",.       db->aD
20800 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c  b[iDb].zDbSName,
20810 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70 49   MASTER_NAME, pI
20820 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  ndex->zName.    
20830 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c  );.    sqlite3Cl
20840 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70 50  earStatTables(pP
20850 61 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78 22  arse, iDb, "idx"
20860 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  , pIndex->zName)
20870 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
20880 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
20890 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74  , iDb);.    dest
208a0 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
208b0 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  se, pIndex->tnum
208c0 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
208d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
208e0 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69   OP_DropIndex, i
208f0 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78  Db, 0, 0, pIndex
20900 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ->zName, 0);.  }
20910 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  ..exit_drop_inde
20920 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  x:.  sqlite3SrcL
20930 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e  istDelete(db, pN
20940 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  ame);.}../*.** p
20950 41 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74  Array is a point
20960 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f  er to an array o
20970 66 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68 20  f objects. Each 
20980 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a  object in the.**
20990 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72   array is szEntr
209a0 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
209b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73   This routine us
209c0 65 73 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c  es sqlite3DbReal
209d0 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65  loc().** to exte
209e0 6e 64 20 74 68 65 20 61 72 72 61 79 20 73 6f 20  nd the array so 
209f0 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 70  that there is sp
20a00 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f 62  ace for a new ob
20a10 6a 65 63 74 20 61 74 20 74 68 65 20 65 6e 64 2e  ject at the end.
20a20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
20a30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
20a40 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f  led, *pnEntry co
20a50 6e 74 61 69 6e 73 20 74 68 65 20 63 75 72 72 65  ntains the curre
20a60 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68  nt size of.** th
20a70 65 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74 72  e array (in entr
20a80 69 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c  ies - so the all
20a90 6f 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e  ocation is ((*pn
20aa0 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72 79  Entry) * szEntry
20ab0 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f  ) bytes.** in to
20ac0 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tal)..**.** If t
20ad0 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73 20  he realloc() is 
20ae0 73 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65 2e  successful (i.e.
20af0 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69   if no OOM condi
20b00 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74 68  tion occurs), th
20b10 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63  e.** space alloc
20b20 61 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77  ated for the new
20b30 20 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f 65   object is zeroe
20b40 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64 61  d, *pnEntry upda
20b50 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63  ted to.** reflec
20b60 74 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20 6f  t the new size o
20b70 66 20 74 68 65 20 61 72 72 61 79 20 61 6e 64 20  f the array and 
20b80 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
20b90 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a   new allocation.
20ba0 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70 49  ** returned. *pI
20bb0 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
20bc0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65   index of the ne
20bd0 77 20 61 72 72 61 79 20 65 6e 74 72 79 20 69 6e  w array entry in
20be0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
20bf0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
20c00 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66 61  the realloc() fa
20c10 69 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73 65  ils, *pIdx is se
20c20 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72  t to -1, *pnEntr
20c30 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63  y remains.** unc
20c40 68 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f 70  hanged and a cop
20c50 79 20 6f 66 20 70 41 72 72 61 79 20 72 65 74 75  y of pArray retu
20c60 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  rned..*/.void *s
20c70 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
20c80 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ate(.  sqlite3 *
20c90 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  db,      /* Conn
20ca0 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79  ection to notify
20cb0 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   of malloc failu
20cc0 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  res */.  void *p
20cd0 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72  Array,     /* Ar
20ce0 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20  ray of objects. 
20cf0 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f   Might be reallo
20d00 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  cated */.  int s
20d10 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20  zEntry,      /* 
20d20 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a  Size of each obj
20d30 65 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79  ect in the array
20d40 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74   */.  int *pnEnt
20d50 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ry,     /* Numbe
20d60 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72  r of objects cur
20d70 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f  rently in use */
20d80 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20  .  int *pIdx    
20d90 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
20da0 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77  e index of a new
20db0 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b   slot here */.){
20dc0 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 71  .  char *z;.  sq
20dd0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 20 3d 20  lite3_int64 n = 
20de0 2a 70 49 64 78 20 3d 20 2a 70 6e 45 6e 74 72 79  *pIdx = *pnEntry
20df0 3b 0a 20 20 69 66 28 20 28 6e 20 26 20 28 6e 2d  ;.  if( (n & (n-
20e00 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  1))==0 ){.    sq
20e10 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 20 3d  lite3_int64 sz =
20e20 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a   (n==0) ? 1 : 2*
20e30 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65  n;.    void *pNe
20e40 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
20e50 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c  lloc(db, pArray,
20e60 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20   sz*szEntry);.  
20e70 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
20e80 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d  .      *pIdx = -
20e90 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
20ea0 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20  pArray;.    }.  
20eb0 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b    pArray = pNew;
20ec0 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72  .  }.  z = (char
20ed0 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73  *)pArray;.  mems
20ee0 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72  et(&z[n * szEntr
20ef0 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b  y], 0, szEntry);
20f00 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20  .  ++*pnEntry;. 
20f10 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a   return pArray;.
20f20 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
20f30 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
20f40 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73   the given IdLis
20f50 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
20f60 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65   IdList if.** ne
20f70 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ed be..**.** A n
20f80 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74  ew IdList is ret
20f90 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
20fa0 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
20fb0 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c  ..*/.IdList *sql
20fc0 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
20fd0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
20fe0 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  IdList *pList, T
20ff0 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
21000 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
21010 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
21020 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
21030 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
21040 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
21050 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
21060 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  (IdList) );.    
21070 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
21080 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
21090 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65  List->a = sqlite
210a0 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
210b0 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
210c0 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20  pList->a,.      
210d0 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
210e0 30 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c 69 73  0]),.      &pLis
210f0 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 69  t->nId,.      &i
21100 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20  .  );.  if( i<0 
21110 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  ){.    sqlite3Id
21120 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
21130 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72  List);.    retur
21140 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
21150 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
21160 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
21170 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
21180 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45  .  if( IN_RENAME
21190 5f 4f 42 4a 45 43 54 20 26 26 20 70 4c 69 73 74  _OBJECT && pList
211a0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
211b0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
211c0 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65  eTokenMap(pParse
211d0 2c 20 28 76 6f 69 64 2a 29 70 4c 69 73 74 2d 3e  , (void*)pList->
211e0 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 6b  a[i].zName, pTok
211f0 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  en);.  }.  retur
21200 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
21210 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69  * Delete an IdLi
21220 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
21230 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
21240 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c  sqlite3 *db, IdL
21250 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
21260 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
21270 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
21280 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
21290 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
212a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
212b0 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
212c0 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
212d0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
212e0 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
212f0 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
21300 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
21310 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
21320 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74  ex in pList of t
21330 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61  he identifier na
21340 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e  med zId.  Return
21350 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f   -1.** if not fo
21360 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
21370 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49  te3IdListIndex(I
21380 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
21390 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
213a0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
213b0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
213c0 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
213d0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
213e0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
213f0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
21400 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
21410 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
21420 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
21430 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
21440 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  Maximum size of 
21450 61 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74  a SrcList object
21460 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74  ..** The SrcList
21470 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65 64 20   object is used 
21480 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  to represent the
21490 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
214a0 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
214b0 65 6d 65 6e 74 2c 20 61 6e 64 20 74 68 65 20 71  ement, and the q
214c0 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 63 61 6e  uery planner can
214d0 6e 6f 74 20 64 65 61 6c 20 77 69 74 68 20 6d 6f  not deal with mo
214e0 72 65 0a 2a 2a 20 74 68 61 6e 20 36 34 20 74 61  re.** than 64 ta
214f0 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 2e 20  bles in a join. 
21500 20 53 6f 20 61 6e 79 20 76 61 6c 75 65 20 6c 61   So any value la
21510 72 67 65 72 20 74 68 61 6e 20 36 34 20 68 65 72  rger than 64 her
21520 65 0a 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65  e.** is sufficie
21530 6e 74 20 66 6f 72 20 6d 6f 73 74 20 75 73 65 73  nt for most uses
21540 2e 20 20 53 6d 61 6c 6c 65 72 20 76 61 6c 75 65  .  Smaller value
21550 73 2c 20 6c 69 6b 65 20 73 61 79 20 31 30 2c 20  s, like say 10, 
21560 61 72 65 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61  are.** appropria
21570 74 65 20 66 6f 72 20 73 6d 61 6c 6c 20 61 6e 64  te for small and
21580 20 6d 65 6d 6f 72 79 2d 6c 69 6d 69 74 65 64 20   memory-limited 
21590 61 70 70 6c 69 63 61 74 69 6f 6e 73 2e 0a 2a 2f  applications..*/
215a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
215b0 4d 41 58 5f 53 52 43 4c 49 53 54 0a 23 20 64 65  MAX_SRCLIST.# de
215c0 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f  fine SQLITE_MAX_
215d0 53 52 43 4c 49 53 54 20 32 30 30 0a 23 65 6e 64  SRCLIST 200.#end
215e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64  if../*.** Expand
215f0 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
21600 61 74 65 64 20 66 6f 72 20 74 68 65 20 67 69 76  ated for the giv
21610 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63  en SrcList objec
21620 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67  t by.** creating
21630 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74   nExtra new slot
21640 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69  s beginning at i
21650 53 74 61 72 74 2e 20 20 69 53 74 61 72 74 20 69  Start.  iStart i
21660 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a  s zero based..**
21670 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a   New slots are z
21680 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  eroed..**.** For
21690 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73   example, suppos
216a0 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74  e a SrcList init
216b0 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74  ially contains t
216c0 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e  wo entries: A,B.
216d0 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20  .** To append 3 
216e0 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f  new entries onto
216f0 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69   the end, do thi
21700 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69  s:.**.**    sqli
21710 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
21720 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20  e(db, pSrclist, 
21730 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74  3, 2);.**.** Aft
21740 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  er the call abov
21750 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61  e it would conta
21760 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20  in:  A, B, nil, 
21770 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20  nil, nil..** If 
21780 74 68 65 20 69 53 74 61 72 74 20 61 72 67 75 6d  the iStart argum
21790 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20 69  ent had been 1 i
217a0 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65  nstead of 2, the
217b0 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  n the result.** 
217c0 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a  would have been:
217d0 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e    A, nil, nil, n
217e0 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65  il, B.  To prepe
217f0 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73  nd the new slots
21800 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20  ,.** the iStart 
21810 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30  value would be 0
21820 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 74 68  .  The result th
21830 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20  en would.** be: 
21840 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41  nil, nil, nil, A
21850 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  , B..**.** If a 
21860 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
21870 6e 20 66 61 69 6c 73 20 6f 72 20 74 68 65 20 53  n fails or the S
21880 72 63 4c 69 73 74 20 62 65 63 6f 6d 65 73 20 74  rcList becomes t
21890 6f 6f 20 6c 61 72 67 65 2c 20 6c 65 61 76 65 0a  oo large, leave.
218a0 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
218b0 53 72 63 4c 69 73 74 20 75 6e 63 68 61 6e 67 65  SrcList unchange
218c0 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2c 20  d, return NULL, 
218d0 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72  and leave an err
218e0 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e  or message.** in
218f0 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 53 72 63 4c   pParse..*/.SrcL
21900 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
21910 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20 50 61  istEnlarge(.  Pa
21920 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
21930 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
21940 65 78 74 20 69 6e 74 6f 20 77 68 69 63 68 20 65  ext into which e
21950 72 72 6f 72 73 20 61 72 65 20 72 65 70 6f 72 74  rrors are report
21960 65 64 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ed */.  SrcList 
21970 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68  *pSrc,     /* Th
21980 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20  e SrcList to be 
21990 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e  enlarged */.  in
219a0 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
219b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65   /* Number of ne
219c0 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74  w slots to add t
219d0 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20  o pSrc->a[] */. 
219e0 20 69 6e 74 20 69 53 74 61 72 74 20 20 20 20 20   int iStart     
219f0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
21a00 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72  pSrc->a[] of fir
21a10 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29  st new slot */.)
21a20 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
21a30 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
21a40 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61   on calling para
21a50 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65  meters */.  asse
21a60 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b  rt( iStart>=0 );
21a70 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72  .  assert( nExtr
21a80 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  a>=1 );.  assert
21a90 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 61  ( pSrc!=0 );.  a
21aa0 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70  ssert( iStart<=p
21ab0 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20  Src->nSrc );..  
21ac0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69  /* Allocate addi
21ad0 74 69 6f 6e 61 6c 20 73 70 61 63 65 20 69 66 20  tional space if 
21ae0 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20  needed */.  if( 
21af0 28 75 33 32 29 70 53 72 63 2d 3e 6e 53 72 63 2b  (u32)pSrc->nSrc+
21b00 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c  nExtra>pSrc->nAl
21b10 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  loc ){.    SrcLi
21b20 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 73 71  st *pNew;.    sq
21b30 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 41 6c 6c  lite3_int64 nAll
21b40 6f 63 20 3d 20 32 2a 28 73 71 6c 69 74 65 33 5f  oc = 2*(sqlite3_
21b50 69 6e 74 36 34 29 70 53 72 63 2d 3e 6e 53 72 63  int64)pSrc->nSrc
21b60 2b 6e 45 78 74 72 61 3b 0a 20 20 20 20 73 71 6c  +nExtra;.    sql
21b70 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
21b80 65 2d 3e 64 62 3b 0a 0a 20 20 20 20 69 66 28 20  e->db;..    if( 
21b90 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72  pSrc->nSrc+nExtr
21ba0 61 3e 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52  a>=SQLITE_MAX_SR
21bb0 43 4c 49 53 54 20 29 7b 0a 20 20 20 20 20 20 73  CLIST ){.      s
21bc0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
21bd0 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
21be0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
21bf0 6d 73 2c 20 6d 61 78 3a 20 25 64 22 2c 0a 20 20  ms, max: %d",.  
21c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c10 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53      SQLITE_MAX_S
21c20 52 43 4c 49 53 54 29 3b 0a 20 20 20 20 20 20 72  RCLIST);.      r
21c30 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
21c40 20 20 20 69 66 28 20 6e 41 6c 6c 6f 63 3e 53 51     if( nAlloc>SQ
21c50 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54  LITE_MAX_SRCLIST
21c60 20 29 20 6e 41 6c 6c 6f 63 20 3d 20 53 51 4c 49   ) nAlloc = SQLI
21c70 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 3b 0a  TE_MAX_SRCLIST;.
21c80 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
21c90 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
21ca0 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  pSrc,.          
21cb0 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72       sizeof(*pSr
21cc0 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a  c) + (nAlloc-1)*
21cd0 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
21ce0 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ]) );.    if( pN
21cf0 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ew==0 ){.      a
21d00 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
21d10 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
21d20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
21d30 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77  .    pSrc = pNew
21d40 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c  ;.    pSrc->nAll
21d50 6f 63 20 3d 20 6e 41 6c 6c 6f 63 3b 0a 20 20 7d  oc = nAlloc;.  }
21d60 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73  ..  /* Move exis
21d70 74 69 6e 67 20 73 6c 6f 74 73 20 74 68 61 74 20  ting slots that 
21d80 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65 20 6e  come after the n
21d90 65 77 6c 79 20 69 6e 73 65 72 74 65 64 20 73 6c  ewly inserted sl
21da0 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20  ots.  ** out of 
21db0 74 68 65 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72  the way */.  for
21dc0 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b  (i=pSrc->nSrc-1;
21dd0 20 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29   i>=iStart; i--)
21de0 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b  {.    pSrc->a[i+
21df0 6e 45 78 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e  nExtra] = pSrc->
21e00 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63  a[i];.  }.  pSrc
21e10 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45 78 74 72 61  ->nSrc += nExtra
21e20 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65  ;..  /* Zero the
21e30 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   newly allocated
21e40 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73   slots */.  mems
21e50 65 74 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61  et(&pSrc->a[iSta
21e60 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  rt], 0, sizeof(p
21e70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72  Src->a[0])*nExtr
21e80 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61  a);.  for(i=iSta
21e90 72 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78  rt; i<iStart+nEx
21ea0 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  tra; i++){.    p
21eb0 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
21ec0 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  r = -1;.  }..  /
21ed0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
21ee0 65 72 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67  er to the enlarg
21ef0 65 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  ed SrcList */.  
21f00 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a  return pSrc;.}..
21f10 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
21f20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  new table name t
21f30 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  o the given SrcL
21f40 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
21f50 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a  ew SrcList if.**
21f60 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77   need be.  A new
21f70 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65   entry is create
21f80 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  d in the SrcList
21f90 20 65 76 65 6e 20 69 66 20 70 54 61 62 6c 65 20   even if pTable 
21fa0 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41  is NULL..**.** A
21fb0 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75   SrcList is retu
21fc0 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
21fd0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d   there is an OOM
21fe0 20 65 72 72 6f 72 20 6f 72 20 69 66 20 74 68 65   error or if the
21ff0 0a 2a 2a 20 53 72 63 4c 69 73 74 20 67 72 6f 77  .** SrcList grow
22000 73 20 74 6f 20 6c 61 72 67 65 2e 20 20 54 68 65  s to large.  The
22010 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63   returned.** Src
22020 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 74 68  List might be th
22030 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 53 72  e same as the Sr
22040 63 4c 69 73 74 20 74 68 61 74 20 77 61 73 20 69  cList that was i
22050 6e 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74  nput or it might
22060 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65   be.** a new one
22070 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  .  If an OOM err
22080 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20  or does occurs, 
22090 74 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76  then the prior v
220a0 61 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a  alue of pList.**
220b0 20 74 68 61 74 20 69 73 20 69 6e 70 75 74 20 74   that is input t
220c0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
220d0 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
220e0 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  freed..**.** If 
220f0 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74  pDatabase is not
22100 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20   null, it means 
22110 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68  that the table h
22120 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a  as an optional.*
22130 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * database name 
22140 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68  prefix.  Like th
22150 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74  is:  "database.t
22160 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74  able".  The pDat
22170 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20  abase.** points 
22180 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  to the table nam
22190 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65  e and the pTable
221a0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64   points to the d
221b0 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a  atabase name..**
221c0 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d   The SrcList.a[]
221d0 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20  .zName field is 
221e0 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
221f0 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68  table name which
22200 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66   might.** come f
22210 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70  rom pTable (if p
22220 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c  Database is NULL
22230 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62  ) or from pDatab
22240 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73  ase.  .** SrcLis
22250 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20  t.a[].zDatabase 
22260 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
22270 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
22280 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a   from pTable,.**
22290 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66   or with NULL if
222a0 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20   no database is 
222b0 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
222c0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
222d0 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68   if call like th
222e0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
222f0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
22300 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b  Append(D,A,B,0);
22310 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73  .**.** Then B is
22320 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   a table name an
22330 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  d the database n
22340 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69  ame is unspecifi
22350 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a  ed.  If called.*
22360 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  * like this:.**.
22370 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
22380 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
22390 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,B,C);.**.** 
223a0 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61  Then C is the ta
223b0 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69  ble name and B i
223c0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  s the database n
223d0 61 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64 65  ame.  If C is de
223e0 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f  fined.** then so
223f0 20 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72   is B.  In other
22400 20 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72   words, we never
22410 20 68 61 76 65 20 61 20 63 61 73 65 20 77 68 65   have a case whe
22420 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
22430 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
22440 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b  Append(D,A,0,C);
22450 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62  .**.** Both pTab
22460 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65  le and pDatabase
22470 20 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20   are assumed to 
22480 62 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79  be quoted.  They
22490 20 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a   are dequoted.**
224a0 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64   before being ad
224b0 64 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69  ded to the SrcLi
224c0 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  st..*/.SrcList *
224d0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
224e0 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
224f0 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
22500 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2c 20  arsing context, 
22510 69 6e 20 77 68 69 63 68 20 65 72 72 6f 72 73 20  in which errors 
22520 61 72 65 20 72 65 70 6f 72 74 65 64 20 2a 2f 0a  are reported */.
22530 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74    SrcList *pList
22540 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ,     /* Append 
22550 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e  to this SrcList.
22560 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20   NULL creates a 
22570 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20  new SrcList */. 
22580 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
22590 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
225a0 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b   append */.  Tok
225b0 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20  en *pDatabase   
225c0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20   /* Database of 
225d0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  the table */.){.
225e0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
225f0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
22600 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61  sqlite3 *db;.  a
22610 73 73 65 72 74 28 20 70 44 61 74 61 62 61 73 65  ssert( pDatabase
22620 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30  ==0 || pTable!=0
22630 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68   );  /* Cannot h
22640 61 76 65 20 43 20 77 69 74 68 6f 75 74 20 42 20  ave C without B 
22650 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
22660 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
22670 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d  rt( pParse->db!=
22680 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  0 );.  db = pPar
22690 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c  se->db;.  if( pL
226a0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
226b0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
226c0 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73  allocRawNN(pPars
226d0 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 53 72  e->db, sizeof(Sr
226e0 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  cList) );.    if
226f0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
22700 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
22710 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20  ->nAlloc = 1;.  
22720 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 3d 20    pList->nSrc = 
22730 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70  1;.    memset(&p
22740 4c 69 73 74 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73  List->a[0], 0, s
22750 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
22760 5d 29 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  ]));.    pList->
22770 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d  a[0].iCursor = -
22780 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
22790 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  SrcList *pNew = 
227a0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
227b0 6c 61 72 67 65 28 70 50 61 72 73 65 2c 20 70 4c  large(pParse, pL
227c0 69 73 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e  ist, 1, pList->n
227d0 53 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  Src);.    if( pN
227e0 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
227f0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
22800 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
22810 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
22820 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22830 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20   pList = pNew;. 
22840 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 6d     }.  }.  pItem
22850 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
22860 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69  st->nSrc-1];.  i
22870 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
22880 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20  pDatabase->z==0 
22890 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  ){.    pDatabase
228a0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
228b0 70 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20  pDatabase ){.   
228c0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
228d0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
228e0 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61  oken(db, pDataba
228f0 73 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  se);.    pItem->
22900 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
22910 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
22920 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
22930 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 6d  }else{.    pItem
22940 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
22950 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
22960 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20  b, pTable);.    
22970 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
22980 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
22990 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
229a0 2a 2a 20 41 73 73 69 67 6e 20 56 64 62 65 43 75  ** Assign VdbeCu
229b0 72 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62 65  rsor index numbe
229c0 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73  rs to all tables
229d0 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f   in a SrcList.*/
229e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
229f0 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
22a00 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
22a10 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
22a20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
22a30 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
22a40 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72   *pItem;.  asser
22a50 74 28 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73  t(pList || pPars
22a60 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
22a70 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  led );.  if( pLi
22a80 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
22a90 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
22aa0 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  a; i<pList->nSrc
22ab0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
22ac0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
22ad0 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62  ->iCursor>=0 ) b
22ae0 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65  reak;.      pIte
22af0 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61  m->iCursor = pPa
22b00 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
22b10 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
22b20 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
22b30 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
22b40 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
22b50 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  rse, pItem->pSel
22b60 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20  ect->pSrc);.    
22b70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
22b80 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
22b90 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20   entire SrcList 
22ba0 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74  including all it
22bb0 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a  s substructure..
22bc0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
22bd0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c  rcListDelete(sql
22be0 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73  ite3 *db, SrcLis
22bf0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
22c00 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
22c10 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
22c20 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
22c30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
22c40 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
22c50 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
22c60 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
22c70 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
22c80 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
22c90 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
22ca0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
22cb0 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  b, pItem->zName)
22cc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
22cd0 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
22ce0 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20  Alias);.    if( 
22cf0 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  pItem->fg.isInde
22d00 78 65 64 42 79 20 29 20 73 71 6c 69 74 65 33 44  xedBy ) sqlite3D
22d10 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
22d20 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b  >u1.zIndexedBy);
22d30 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
22d40 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 20 73  fg.isTabFunc ) s
22d50 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
22d60 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
22d70 75 31 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20 20  u1.pFuncArg);.  
22d80 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
22d90 61 62 6c 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  able(db, pItem->
22da0 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
22db0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
22dc0 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  b, pItem->pSelec
22dd0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
22de0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
22df0 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73  tem->pOn);.    s
22e00 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
22e10 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55  te(db, pItem->pU
22e20 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sing);.  }.  sql
22e30 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
22e40 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
22e50 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
22e60 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
22e70 70 61 72 73 65 72 20 74 6f 20 61 64 64 20 61 20  parser to add a 
22e80 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a  new term to the.
22e90 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77  ** end of a grow
22ea0 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  ing FROM clause.
22eb0 20 20 54 68 65 20 22 70 22 20 70 61 72 61 6d 65    The "p" parame
22ec0 74 65 72 20 69 73 20 74 68 65 20 70 61 72 74 20  ter is the part 
22ed0 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  of.** the FROM c
22ee0 6c 61 75 73 65 20 74 68 61 74 20 68 61 73 20 61  lause that has a
22ef0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73  lready been cons
22f00 74 72 75 63 74 65 64 2e 20 20 22 70 22 20 69 73  tructed.  "p" is
22f10 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73   NULL.** if this
22f20 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65   is the first te
22f30 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
22f40 6c 61 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61  lause.  pTable a
22f50 6e 64 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  nd pDatabase.** 
22f60 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  are the name of 
22f70 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61  the table and da
22f80 74 61 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20  tabase named in 
22f90 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
22fa0 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61  term..** pDataba
22fb0 73 65 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68  se is NULL if th
22fc0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
22fd0 71 75 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73  qualifier is mis
22fe0 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73  sing - the.** us
22ff0 75 61 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68  ual case.  If th
23000 65 20 74 65 72 6d 20 68 61 73 20 61 6e 20 61 6c  e term has an al
23010 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73  ias, then pAlias
23020 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
23030 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20  * alias token.  
23040 49 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 61  If the term is a
23050 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20   subquery, then 
23060 70 53 75 62 71 75 65 72 79 20 69 73 20 74 68 65  pSubquery is the
23070 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
23080 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 73 75  ment that the su
23090 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20  bquery encodes. 
230a0 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a   The pTable and.
230b0 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70 61 72  ** pDatabase par
230c0 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c  ameters are NULL
230d0 20 66 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e   for subqueries.
230e0 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55    The pOn and pU
230f0 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65  sing.** paramete
23100 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65  rs are the conte
23110 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64  nt of the ON and
23120 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a   USING clauses..
23130 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e  **.** Return a n
23140 65 77 20 53 72 63 4c 69 73 74 20 77 68 69 63 68  ew SrcList which
23150 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20   encodes is the 
23160 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65  FROM with the ne
23170 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e  w.** term added.
23180 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
23190 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
231a0 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72  dFromTerm(.  Par
231b0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
231c0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
231d0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
231e0 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20  List *p,        
231f0 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74       /* The left
23200 20 70 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f   part of the FRO
23210 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79  M clause already
23220 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e   seen */.  Token
23230 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20   *pTable,       
23240 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
23250 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74  e table to add t
23260 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  o the FROM claus
23270 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44  e */.  Token *pD
23280 61 74 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f  atabase,       /
23290 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
232a0 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
232b0 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f  g pTable */.  To
232c0 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20  ken *pAlias,    
232d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
232e0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
232f0 74 68 65 20 41 53 20 73 75 62 65 78 70 72 65 73  the AS subexpres
23300 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  sion */.  Select
23310 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20 20 20   *pSubquery,    
23320 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20    /* A subquery 
23330 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
23340 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f   a table name */
23350 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20  .  Expr *pOn,   
23360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
23370 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61  e ON clause of a
23380 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73   join */.  IdLis
23390 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20  t *pUsing       
233a0 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20     /* The USING 
233b0 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e  clause of a join
233c0 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
233d0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
233e0 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tem;.  sqlite3 *
233f0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
23400 0a 20 20 69 66 28 20 21 70 20 26 26 20 28 70 4f  .  if( !p && (pO
23410 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a  n || pUsing) ){.
23420 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
23430 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a  Msg(pParse, "a J
23440 4f 49 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65  OIN clause is re
23450 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 25 73  quired before %s
23460 22 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f  ", .      (pOn ?
23470 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29   "ON" : "USING")
23480 0a 20 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f  .    );.    goto
23490 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72   append_from_err
234a0 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71  or;.  }.  p = sq
234b0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
234c0 6e 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70 54  nd(pParse, p, pT
234d0 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29  able, pDatabase)
234e0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
234f0 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f      goto append_
23500 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  from_error;.  }.
23510 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 72    assert( p->nSr
23520 63 3e 30 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d  c>0 );.  pItem =
23530 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31   &p->a[p->nSrc-1
23540 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 54  ];.  assert( (pT
23550 61 62 6c 65 3d 3d 30 29 3d 3d 28 70 44 61 74 61  able==0)==(pData
23560 62 61 73 65 3d 3d 30 29 20 29 3b 0a 20 20 61 73  base==0) );.  as
23570 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61  sert( pItem->zNa
23580 6d 65 3d 3d 30 20 7c 7c 20 70 44 61 74 61 62 61  me==0 || pDataba
23590 73 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 49  se!=0 );.  if( I
235a0 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
235b0 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  && pItem->zName 
235c0 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  ){.    Token *pT
235d0 6f 6b 65 6e 20 3d 20 28 41 4c 57 41 59 53 28 70  oken = (ALWAYS(p
235e0 44 61 74 61 62 61 73 65 29 20 26 26 20 70 44 61  Database) && pDa
235f0 74 61 62 61 73 65 2d 3e 7a 29 20 3f 20 70 44 61  tabase->z) ? pDa
23600 74 61 62 61 73 65 20 3a 20 70 54 61 62 6c 65 3b  tabase : pTable;
23610 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61  .    sqlite3Rena
23620 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73  meTokenMap(pPars
23630 65 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  e, pItem->zName,
23640 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20   pToken);.  }.  
23650 61 73 73 65 72 74 28 20 70 41 6c 69 61 73 21 3d  assert( pAlias!=
23660 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69 61  0 );.  if( pAlia
23670 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65  s->n ){.    pIte
23680 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
23690 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
236a0 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20  (db, pAlias);.  
236b0 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  }.  pItem->pSele
236c0 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a  ct = pSubquery;.
236d0 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70    pItem->pOn = p
236e0 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73  On;.  pItem->pUs
236f0 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20  ing = pUsing;.  
23700 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65  return p;.. appe
23710 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20  nd_from_error:. 
23720 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b   assert( p==0 );
23730 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
23740 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20  lete(db, pOn);. 
23750 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
23760 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29  lete(db, pUsing)
23770 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
23780 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
23790 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72 6e  query);.  return
237a0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   0;.}../*.** Add
237b0 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f   an INDEXED BY o
237c0 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  r NOT INDEXED cl
237d0 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74  ause to the most
237e0 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
237f0 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  .** element of t
23800 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70  he source-list p
23810 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
23820 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
23830 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
23840 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 50 61  ListIndexedBy(Pa
23850 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
23860 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a  List *p, Token *
23870 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 61  pIndexedBy){.  a
23880 73 73 65 72 74 28 20 70 49 6e 64 65 78 65 64 42  ssert( pIndexedB
23890 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 20  y!=0 );.  if( p 
238a0 26 26 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e  && pIndexedBy->n
238b0 3e 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  >0 ){.    struct
238c0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
238d0 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  Item;.    assert
238e0 28 20 70 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a 20  ( p->nSrc>0 );. 
238f0 20 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61     pItem = &p->a
23900 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20  [p->nSrc-1];.   
23910 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
23920 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30  fg.notIndexed==0
23930 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
23940 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  pItem->fg.isInde
23950 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  xedBy==0 );.    
23960 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
23970 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29  g.isTabFunc==0 )
23980 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  ;.    if( pIndex
23990 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70  edBy->n==1 && !p
239a0 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a  IndexedBy->z ){.
239b0 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20        /* A "NOT 
239c0 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65 20  INDEXED" clause 
239d0 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65  was supplied. Se
239e0 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20  e parse.y .     
239f0 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69   ** construct "i
23a00 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20  ndexed_opt" for 
23a10 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  details. */.    
23a20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49    pItem->fg.notI
23a30 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20  ndexed = 1;.    
23a40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74  }else{.      pIt
23a50 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  em->u1.zIndexedB
23a60 79 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  y = sqlite3NameF
23a70 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
23a80 3e 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29  >db, pIndexedBy)
23a90 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66  ;.      pItem->f
23aa0 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 3d 20  g.isIndexedBy = 
23ab0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  1;.    }.  }.}..
23ac0 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 6c 69  /*.** Add the li
23ad0 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  st of function a
23ae0 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  rguments to the 
23af0 53 72 63 4c 69 73 74 20 65 6e 74 72 79 20 66 6f  SrcList entry fo
23b00 72 20 61 0a 2a 2a 20 74 61 62 6c 65 2d 76 61 6c  r a.** table-val
23b10 75 65 64 2d 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ued-function..*/
23b20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
23b30 4c 69 73 74 46 75 6e 63 41 72 67 73 28 50 61 72  ListFuncArgs(Par
23b40 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
23b50 69 73 74 20 2a 70 2c 20 45 78 70 72 4c 69 73 74  ist *p, ExprList
23b60 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20   *pList){.  if( 
23b70 70 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  p ){.    struct 
23b80 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
23b90 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
23ba0 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  Src-1];.    asse
23bb0 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f  rt( pItem->fg.no
23bc0 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20  tIndexed==0 );. 
23bd0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
23be0 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
23bf0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
23c00 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54  t( pItem->fg.isT
23c10 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  abFunc==0 );.   
23c20 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63   pItem->u1.pFunc
23c30 41 72 67 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20  Arg = pList;.   
23c40 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62   pItem->fg.isTab
23c50 46 75 6e 63 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  Func = 1;.  }els
23c60 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
23c70 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
23c80 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b  rse->db, pList);
23c90 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  .  }.}../*.** Wh
23ca0 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61  en building up a
23cb0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20   FROM clause in 
23cc0 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20  the parser, the 
23cd0 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  join operator.**
23ce0 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74   is initially at
23cf0 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
23d00 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74  ft operand.  But
23d10 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
23d20 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74  tor.** expects t
23d30 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
23d40 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69   to be on the ri
23d50 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68  ght operand.  Th
23d60 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68  is routine.** Sh
23d70 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70  ifts all join op
23d80 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66  erators from lef
23d90 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61  t to right for a
23da0 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a  n entire FROM.**
23db0 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45   clause..**.** E
23dc0 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20  xample: Suppose 
23dd0 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65  the join is like
23de0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
23df0 20 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c         A natural
23e00 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a   cross join B.**
23e10 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72  .** The operator
23e20 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f   is "natural cro
23e30 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41  ss join".  The A
23e40 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20   and B operands 
23e50 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  are stored.** in
23e60 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e   p->a[0] and p->
23e70 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65  a[1], respective
23e80 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  ly.  The parser 
23e90 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73  initially stores
23ea0 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72   the.** operator
23eb0 20 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72   with A.  This r
23ec0 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68  outine shifts th
23ed0 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72  at operator over
23ee0 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73   to B..*/.void s
23ef0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69  qlite3SrcListShi
23f00 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69  ftJoinType(SrcLi
23f10 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  st *p){.  if( p 
23f20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
23f30 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d    for(i=p->nSrc-
23f40 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
23f50 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 66 67 2e 6a      p->a[i].fg.j
23f60 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69  ointype = p->a[i
23f70 2d 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b  -1].fg.jointype;
23f80 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b  .    }.    p->a[
23f90 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d  0].fg.jointype =
23fa0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
23fb0 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
23fc0 6f 64 65 20 66 6f 72 20 61 20 42 45 47 49 4e 20  ode for a BEGIN 
23fd0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
23fe0 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54  id sqlite3BeginT
23ff0 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
24000 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79   *pParse, int ty
24010 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pe){.  sqlite3 *
24020 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
24030 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72   int i;..  asser
24040 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
24050 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
24060 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  b;.  assert( db!
24070 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  =0 );.  if( sqli
24080 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
24090 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
240a0 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22  SACTION, "BEGIN"
240b0 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  , 0, 0) ){.    r
240c0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d  eturn;.  }.  v =
240d0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
240e0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21  pParse);.  if( !
240f0 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  v ) return;.  if
24100 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52  ( type!=TK_DEFER
24110 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  RED ){.    for(i
24120 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
24130 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
24140 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
24150 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
24160 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43  i, (type==TK_EXC
24170 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20  LUSIVE)+1);.    
24180 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
24190 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20  sBtree(v, i);.  
241a0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
241b0 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
241c0 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 29 3b 0a 7d  P_AutoCommit);.}
241d0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
241e0 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61   VDBE code for a
241f0 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42   COMMIT or ROLLB
24200 41 43 4b 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ACK statement..*
24210 2a 20 43 6f 64 65 20 66 6f 72 20 52 4f 4c 4c 42  * Code for ROLLB
24220 41 43 4b 20 69 73 20 67 65 6e 65 72 61 74 65 64  ACK is generated
24230 20 69 66 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f   if eType==TK_RO
24240 4c 4c 42 41 43 4b 2e 20 20 4f 74 68 65 72 77 69  LLBACK.  Otherwi
24250 73 65 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65  se.** code is ge
24260 6e 65 72 61 74 65 64 20 66 6f 72 20 61 20 43 4f  nerated for a CO
24270 4d 4d 49 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  MMIT..*/.void sq
24280 6c 69 74 65 33 45 6e 64 54 72 61 6e 73 61 63 74  lite3EndTransact
24290 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
242a0 65 2c 20 69 6e 74 20 65 54 79 70 65 29 7b 0a 20  e, int eType){. 
242b0 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
242c0 69 73 52 6f 6c 6c 62 61 63 6b 3b 0a 0a 20 20 61  isRollback;..  a
242d0 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
242e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
242f0 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  arse->db!=0 );. 
24300 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
24310 54 4b 5f 43 4f 4d 4d 49 54 20 7c 7c 20 65 54 79  TK_COMMIT || eTy
24320 70 65 3d 3d 54 4b 5f 45 4e 44 20 7c 7c 20 65 54  pe==TK_END || eT
24330 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b  ype==TK_ROLLBACK
24340 20 29 3b 0a 20 20 69 73 52 6f 6c 6c 62 61 63 6b   );.  isRollback
24350 20 3d 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c   = eType==TK_ROL
24360 4c 42 41 43 4b 3b 0a 20 20 69 66 28 20 73 71 6c  LBACK;.  if( sql
24370 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
24380 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
24390 4e 53 41 43 54 49 4f 4e 2c 20 0a 20 20 20 20 20  NSACTION, .     
243a0 20 20 69 73 52 6f 6c 6c 62 61 63 6b 20 3f 20 22    isRollback ? "
243b0 52 4f 4c 4c 42 41 43 4b 22 20 3a 20 22 43 4f 4d  ROLLBACK" : "COM
243c0 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20  MIT", 0, 0) ){. 
243d0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
243e0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
243f0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
24400 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
24410 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
24420 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
24430 31 2c 20 69 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a  1, isRollback);.
24440 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
24450 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
24460 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
24470 65 72 20 77 68 65 6e 20 69 74 20 70 61 72 73 65  er when it parse
24480 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63  s a command to c
24490 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73  reate,.** releas
244a0 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  e or rollback an
244b0 20 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20   SQL savepoint. 
244c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
244d0 53 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20  Savepoint(Parse 
244e0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c  *pParse, int op,
244f0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
24500 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
24510 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
24520 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
24530 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
24540 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  Name ){.    Vdbe
24550 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
24560 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69  Vdbe(pParse);.#i
24570 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24580 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
24590 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
245a0 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a   char * const az
245b0 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20  [] = { "BEGIN", 
245c0 22 52 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c  "RELEASE", "ROLL
245d0 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73  BACK" };.    ass
245e0 65 72 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f  ert( !SAVEPOINT_
245f0 42 45 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49  BEGIN && SAVEPOI
24600 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26  NT_RELEASE==1 &&
24610 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
24620 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66  ACK==2 );.#endif
24630 0a 20 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73  .    if( !v || s
24640 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
24650 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
24660 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d  AVEPOINT, az[op]
24670 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20  , zName, 0) ){. 
24680 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
24690 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
246a0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
246b0 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  urn;.    }.    s
246c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
246d0 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74  (v, OP_Savepoint
246e0 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d  , op, 0, 0, zNam
246f0 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  e, P4_DYNAMIC);.
24700 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
24710 65 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20  e sure the TEMP 
24720 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
24730 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66   and available f
24740 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a  or use.  Return.
24750 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
24760 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20   errors.  Leave 
24770 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
24780 65 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  es in the pParse
24790 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
247a0 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65  nt sqlite3OpenTe
247b0 6d 70 44 61 74 61 62 61 73 65 28 50 61 72 73 65  mpDatabase(Parse
247c0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
247d0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
247e0 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d  e->db;.  if( db-
247f0 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26  >aDb[1].pBt==0 &
24800 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  & !pParse->expla
24810 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  in ){.    int rc
24820 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  ;.    Btree *pBt
24830 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
24840 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a  st int flags = .
24850 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
24860 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
24870 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
24880 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
24890 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
248a0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
248b0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
248c0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
248d0 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20  NCLOSE |.       
248e0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
248f0 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20  EMP_DB;..    rc 
24900 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  = sqlite3BtreeOp
24910 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20  en(db->pVfs, 0, 
24920 64 62 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c 61  db, &pBt, 0, fla
24930 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  gs);.    if( rc!
24940 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24950 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
24960 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
24970 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  ble to open a te
24980 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
24990 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65   ".        "file
249a0 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d   for storing tem
249b0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b  porary tables");
249c0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
249d0 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  c = rc;.      re
249e0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
249f0 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74    db->aDb[1].pBt
24a00 20 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65   = pBt;.    asse
24a10 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  rt( db->aDb[1].p
24a20 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66  Schema );.    if
24a30 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d  ( SQLITE_NOMEM==
24a40 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
24a50 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d  ageSize(pBt, db-
24a60 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d  >nextPagesize, -
24a70 31 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73  1, 0) ){.      s
24a80 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
24a90 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  b);.      return
24aa0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
24ab0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
24ac0 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61  ** Record the fa
24ad0 63 74 20 74 68 61 74 20 74 68 65 20 73 63 68 65  ct that the sche
24ae0 6d 61 20 63 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e  ma cookie will n
24af0 65 65 64 20 74 6f 20 62 65 20 76 65 72 69 66 69  eed to be verifi
24b00 65 64 0a 2a 2a 20 66 6f 72 20 64 61 74 61 62 61  ed.** for databa
24b10 73 65 20 69 44 62 2e 20 20 54 68 65 20 63 6f 64  se iDb.  The cod
24b20 65 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 76 65  e to actually ve
24b30 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
24b40 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f  cookie.** will o
24b50 63 63 75 72 20 61 74 20 74 68 65 20 65 6e 64 20  ccur at the end 
24b60 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  of the top-level
24b70 20 56 44 42 45 20 61 6e 64 20 77 69 6c 6c 20 62   VDBE and will b
24b80 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 6c  e generated.** l
24b90 61 74 65 72 2c 20 62 79 20 73 71 6c 69 74 65 33  ater, by sqlite3
24ba0 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
24bb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
24bc0 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
24bd0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
24be0 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65  nt iDb){.  Parse
24bf0 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
24c00 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
24c10 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 61  el(pParse);..  a
24c20 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
24c30 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d   iDb<pParse->db-
24c40 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
24c50 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  ( pParse->db->aD
24c60 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c  b[iDb].pBt!=0 ||
24c70 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 61 73 73   iDb==1 );.  ass
24c80 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f  ert( iDb<SQLITE_
24c90 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29  MAX_ATTACHED+2 )
24ca0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
24cb0 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
24cc0 6c 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 69  ld(pParse->db, i
24cd0 44 62 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20  Db, 0) );.  if( 
24ce0 44 62 4d 61 73 6b 54 65 73 74 28 70 54 6f 70 6c  DbMaskTest(pTopl
24cf0 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  evel->cookieMask
24d00 2c 20 69 44 62 29 3d 3d 30 20 29 7b 0a 20 20 20  , iDb)==0 ){.   
24d10 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c   DbMaskSet(pTopl
24d20 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  evel->cookieMask
24d30 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , iDb);.    if( 
24d40 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
24d50 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
24d60 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
24d70 61 74 61 62 61 73 65 28 70 54 6f 70 6c 65 76 65  atabase(pTopleve
24d80 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  l);.    }.  }.}.
24d90 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ./*.** If argume
24da0 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20  nt zDb is NULL, 
24db0 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65  then call sqlite
24dc0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
24dd0 61 28 29 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a  a() for each .**
24de0 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
24df0 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  se. Otherwise, i
24e00 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20 74 68 65  nvoke it for the
24e10 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20   database named 
24e20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  zDb only..*/.voi
24e30 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  d sqlite3CodeVer
24e40 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 50  ifyNamedSchema(P
24e50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
24e60 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a  nst char *zDb){.
24e70 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
24e80 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
24e90 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
24ea0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
24eb0 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
24ec0 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
24ed0 69 66 28 20 70 44 62 2d 3e 70 42 74 20 26 26 20  if( pDb->pBt && 
24ee0 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c 69  (!zDb || 0==sqli
24ef0 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20  te3StrICmp(zDb, 
24f00 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 29 20  pDb->zDbSName)) 
24f10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24f20 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
24f30 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20  (pParse, i);.   
24f40 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
24f50 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
24f60 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73  de that prepares
24f70 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70   for doing an op
24f80 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  eration that.** 
24f90 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65  might change the
24fa0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
24fb0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74   This routine st
24fc0 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73  arts a new trans
24fd0 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65  action if we are
24fe0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74   not already wit
24ff0 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63  hin.** a transac
25000 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65  tion.  If we are
25010 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20   already within 
25020 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  a transaction, t
25030 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  hen a checkpoint
25040 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74 68  .** is set if th
25050 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70  e setStatement p
25060 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65  arameter is true
25070 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20  .  A checkpoint 
25080 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74  should.** be set
25090 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   for operations 
250a0 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20  that might fail 
250b0 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72  (due to a constr
250c0 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a  aint) part of.**
250d0 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67 68   the way through
250e0 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20   and which will 
250f0 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d  need to undo som
25100 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75 74  e writes without
25110 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f   having to.** ro
25120 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65  llback the whole
25130 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46   transaction.  F
25140 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68  or operations wh
25150 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ere all constrai
25160 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68  nts.** can be ch
25170 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79  ecked before any
25180 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
25190 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
251a0 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a  e, it is never.*
251b0 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75  * necessary to u
251c0 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20  ndo a write and 
251d0 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73  the checkpoint s
251e0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74  hould not be set
251f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
25200 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
25210 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
25220 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65  se, int setState
25230 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a  ment, int iDb){.
25240 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
25250 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
25260 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
25270 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65  );.  sqlite3Code
25280 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
25290 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 44 62 4d  rse, iDb);.  DbM
252a0 61 73 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c  askSet(pToplevel
252b0 2d 3e 77 72 69 74 65 4d 61 73 6b 2c 20 69 44 62  ->writeMask, iDb
252c0 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
252d0 69 73 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d 20  isMultiWrite |= 
252e0 73 65 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a  setStatement;.}.
252f0 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20  ./*.** Indicate 
25300 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
25310 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  nt currently und
25320 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
25330 6d 69 67 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d  might write.** m
25340 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74  ore than one ent
25350 72 79 20 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c  ry (example: del
25360 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68  eting one row th
25370 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f  en inserting ano
25380 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69  ther,.** inserti
25390 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ng multiple rows
253a0 20 69 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72 20   in a table, or 
253b0 69 6e 73 65 72 74 69 6e 67 20 61 20 72 6f 77 20  inserting a row 
253c0 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  and index entrie
253d0 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f  s.).** If an abo
253e0 72 74 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  rt occurs after 
253f0 73 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 77 72  some of these wr
25400 69 74 65 73 20 68 61 76 65 20 63 6f 6d 70 6c 65  ites have comple
25410 74 65 64 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  ted, then it wil
25420 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72  l.** be necessar
25430 79 20 74 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f  y to undo the co
25440 6d 70 6c 65 74 65 64 20 77 72 69 74 65 73 2e 0a  mpleted writes..
25450 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  */.void sqlite3M
25460 75 6c 74 69 57 72 69 74 65 28 50 61 72 73 65 20  ultiWrite(Parse 
25470 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73  *pParse){.  Pars
25480 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
25490 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
254a0 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70  vel(pParse);.  p
254b0 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74  Toplevel->isMult
254c0 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f  iWrite = 1;.}../
254d0 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  * .** The code g
254e0 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c 73 20 74  enerator calls t
254f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 66 20 69  his routine if i
25500 73 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74  s discovers that
25510 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62   it is.** possib
25520 6c 65 20 74 6f 20 61 62 6f 72 74 20 61 20 73 74  le to abort a st
25530 61 74 65 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f  atement prior to
25540 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e   completion.  In
25550 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65   order to .** pe
25560 72 66 6f 72 6d 20 74 68 69 73 20 61 62 6f 72 74  rform this abort
25570 20 77 69 74 68 6f 75 74 20 63 6f 72 72 75 70 74   without corrupt
25580 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
25590 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b  , we need to mak
255a0 65 0a 2a 2a 20 73 75 72 65 20 74 68 61 74 20 74  e.** sure that t
255b0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
255c0 70 72 6f 74 65 63 74 65 64 20 62 79 20 61 20 73  protected by a s
255d0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
255e0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68  tion..**.** Tech
255f0 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79  nically, we only
25600 20 6e 65 65 64 20 74 6f 20 73 65 74 20 74 68 65   need to set the
25610 20 6d 61 79 41 62 6f 72 74 20 66 6c 61 67 20 69   mayAbort flag i
25620 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69  f the.** isMulti
25630 57 72 69 74 65 20 66 6c 61 67 20 77 61 73 20 70  Write flag was p
25640 72 65 76 69 6f 75 73 6c 79 20 73 65 74 2e 20 20  reviously set.  
25650 54 68 65 72 65 20 69 73 20 61 20 74 69 6d 65 20  There is a time 
25660 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75  dependency.** su
25670 63 68 20 74 68 61 74 20 74 68 65 20 61 62 6f 72  ch that the abor
25680 74 20 6d 75 73 74 20 6f 63 63 75 72 20 61 66 74  t must occur aft
25690 65 72 20 74 68 65 20 6d 75 6c 74 69 77 72 69 74  er the multiwrit
256a0 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a  e.  This makes.*
256b0 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74  * some statement
256c0 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20  s involving the 
256d0 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74  REPLACE conflict
256e0 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
256f0 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69  rithm.** go a li
25700 74 74 6c 65 20 66 61 73 74 65 72 2e 20 20 42 75  ttle faster.  Bu
25710 74 20 74 61 6b 69 6e 67 20 61 64 76 61 6e 74 61  t taking advanta
25720 67 65 20 6f 66 20 74 68 69 73 20 74 69 6d 65 20  ge of this time 
25730 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61  dependency.** ma
25740 6b 65 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66  kes it more diff
25750 69 63 75 6c 74 20 74 6f 20 70 72 6f 76 65 20 74  icult to prove t
25760 68 61 74 20 74 68 65 20 63 6f 64 65 20 69 73 20  hat the code is 
25770 63 6f 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20  correct (in .** 
25780 70 61 72 74 69 63 75 6c 61 72 2c 20 69 74 20 70  particular, it p
25790 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20  revents us from 
257a0 77 72 69 74 69 6e 67 20 61 6e 20 65 66 66 65 63  writing an effec
257b0 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tive.** implemen
257c0 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  tation of sqlite
257d0 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  3AssertMayAbort(
257e0 29 29 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76  )) and so we hav
257f0 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74  e chosen.** to t
25800 61 6b 65 20 74 68 65 20 73 61 66 65 20 72 6f 75  ake the safe rou
25810 74 65 20 61 6e 64 20 73 6b 69 70 20 74 68 65 20  te and skip the 
25820 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f  optimization..*/
25830 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 79  .void sqlite3May
25840 41 62 6f 72 74 28 50 61 72 73 65 20 2a 70 50 61  Abort(Parse *pPa
25850 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  rse){.  Parse *p
25860 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
25870 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
25880 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c  pParse);.  pTopl
25890 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d  evel->mayAbort =
258a0 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64   1;.}../*.** Cod
258b0 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61  e an OP_Halt tha
258c0 74 20 63 61 75 73 65 73 20 74 68 65 20 76 64 62  t causes the vdb
258d0 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 53  e to return an S
258e0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
258f0 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68 65 20 6f  .** error. The o
25900 6e 45 72 72 6f 72 20 70 61 72 61 6d 65 74 65 72  nError parameter
25910 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
25920 68 20 28 69 66 20 61 6e 79 29 20 6f 66 20 74 68  h (if any) of th
25930 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61  e statement.** a
25940 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74 20 74 72  nd/or current tr
25950 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
25960 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69  led back..*/.voi
25970 64 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e  d sqlite3HaltCon
25980 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65  straint(.  Parse
25990 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
259a0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
259b0 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65  */.  int errCode
259c0 2c 20 20 20 20 20 20 2f 2a 20 65 78 74 65 6e 64  ,      /* extend
259d0 65 64 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  ed error code */
259e0 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
259f0 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69       /* Constrai
25a00 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61  nt type */.  cha
25a10 72 20 2a 70 34 2c 20 20 20 20 20 20 20 20 20 2f  r *p4,         /
25a20 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * Error message 
25a30 2a 2f 0a 20 20 69 38 20 70 34 74 79 70 65 2c 20  */.  i8 p4type, 
25a40 20 20 20 20 20 20 20 2f 2a 20 50 34 5f 53 54 41         /* P4_STA
25a50 54 49 43 20 6f 72 20 50 34 5f 54 52 41 4e 53 49  TIC or P4_TRANSI
25a60 45 4e 54 20 2a 2f 0a 20 20 75 38 20 70 35 45 72  ENT */.  u8 p5Er
25a70 72 6d 73 67 20 20 20 20 20 20 20 2f 2a 20 50 35  rmsg       /* P5
25a80 5f 45 72 72 4d 73 67 20 74 79 70 65 20 2a 2f 0a  _ErrMsg type */.
25a90 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
25aa0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
25ab0 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
25ac0 20 28 65 72 72 43 6f 64 65 26 30 78 66 66 29 3d   (errCode&0xff)=
25ad0 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
25ae0 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f 6e 45 72  NT );.  if( onEr
25af0 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ror==OE_Abort ){
25b00 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41  .    sqlite3MayA
25b10 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
25b20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
25b30 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74  ddOp4(v, OP_Halt
25b40 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e 45 72 72  , errCode, onErr
25b50 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34 74 79 70  or, 0, p4, p4typ
25b60 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
25b70 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 45  eChangeP5(v, p5E
25b80 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrmsg);.}../*.**
25b90 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74   Code an OP_Halt
25ba0 20 64 75 65 20 74 6f 20 55 4e 49 51 55 45 20 6f   due to UNIQUE o
25bb0 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
25bc0 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69  nstraint violati
25bd0 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
25be0 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61  te3UniqueConstra
25bf0 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
25c00 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
25c10 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
25c20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
25c30 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74     /* Constraint
25c40 20 74 79 70 65 20 2a 2f 0a 20 20 49 6e 64 65 78   type */.  Index
25c50 20 2a 70 49 64 78 20 20 20 20 20 20 20 2f 2a 20   *pIdx       /* 
25c60 54 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 74  The index that t
25c70 72 69 67 67 65 72 73 20 74 68 65 20 63 6f 6e 73  riggers the cons
25c80 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  traint */.){.  c
25c90 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 69 6e 74  har *zErr;.  int
25ca0 20 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 65   j;.  StrAccum e
25cb0 72 72 4d 73 67 3b 0a 20 20 54 61 62 6c 65 20 2a  rrMsg;.  Table *
25cc0 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61  pTab = pIdx->pTa
25cd0 62 6c 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53  ble;..  sqlite3S
25ce0 74 72 41 63 63 75 6d 49 6e 69 74 28 26 65 72 72  trAccumInit(&err
25cf0 4d 73 67 2c 20 70 50 61 72 73 65 2d 3e 64 62 2c  Msg, pParse->db,
25d00 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20   0, 0, .        
25d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
25d20 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74  arse->db->aLimit
25d30 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
25d40 4e 47 54 48 5d 29 3b 0a 20 20 69 66 28 20 70 49  NGTH]);.  if( pI
25d50 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 7b 0a  dx->aColExpr ){.
25d60 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
25d70 61 70 70 65 6e 64 66 28 26 65 72 72 4d 73 67 2c  appendf(&errMsg,
25d80 20 22 69 6e 64 65 78 20 27 25 71 27 22 2c 20 70   "index '%q'", p
25d90 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  Idx->zName);.  }
25da0 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  else{.    for(j=
25db0 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  0; j<pIdx->nKeyC
25dc0 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
25dd0 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
25de0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
25df0 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29  aiColumn[j]>=0 )
25e00 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70  ;.      zCol = p
25e10 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e  Tab->aCol[pIdx->
25e20 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61  aiColumn[j]].zNa
25e30 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 20  me;.      if( j 
25e40 29 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70  ) sqlite3_str_ap
25e50 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2c  pend(&errMsg, ",
25e60 20 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71   ", 2);.      sq
25e70 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
25e80 61 6c 6c 28 26 65 72 72 4d 73 67 2c 20 70 54 61  all(&errMsg, pTa
25e90 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
25ea0 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
25eb0 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2e 22  end(&errMsg, "."
25ec0 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
25ed0 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c  te3_str_appendal
25ee0 6c 28 26 65 72 72 4d 73 67 2c 20 7a 43 6f 6c 29  l(&errMsg, zCol)
25ef0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 45  ;.    }.  }.  zE
25f00 72 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41  rr = sqlite3StrA
25f10 63 63 75 6d 46 69 6e 69 73 68 28 26 65 72 72 4d  ccumFinish(&errM
25f20 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 48 61  sg);.  sqlite3Ha
25f30 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
25f40 72 73 65 2c 20 0a 20 20 20 20 49 73 50 72 69 6d  rse, .    IsPrim
25f50 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
25f60 29 20 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ) ? SQLITE_CONST
25f70 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59  RAINT_PRIMARYKEY
25f80 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
25f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
25fa0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
25fb0 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e  T_UNIQUE,.    on
25fc0 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f  Error, zErr, P4_
25fd0 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73  DYNAMIC, P5_Cons
25fe0 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d  traintUnique);.}
25ff0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  .../*.** Code an
26000 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20   OP_Halt due to 
26010 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64  non-unique rowid
26020 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
26030 33 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74  3RowidConstraint
26040 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
26050 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
26060 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
26070 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
26080 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f  /* Conflict reso
26090 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
260a0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
260b0 62 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  b       /* The t
260c0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6e 6f  able with the no
260d0 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 20 2a  n-unique rowid *
260e0 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d  / .){.  char *zM
260f0 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  sg;.  int rc;.  
26100 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e  if( pTab->iPKey>
26110 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d  =0 ){.    zMsg =
26120 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
26130 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e  pParse->db, "%s.
26140 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
26150 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26160 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
26170 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b  ->aCol[pTab->iPK
26180 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ey].zName);.    
26190 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
261a0 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
261b0 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
261c0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
261d0 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
261e0 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c 20 70 54  , "%s.rowid", pT
261f0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
26200 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
26210 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20  TRAINT_ROWID;.  
26220 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43  }.  sqlite3HaltC
26230 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
26240 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a  , rc, onError, z
26250 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c  Msg, P4_DYNAMIC,
26260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26270 20 20 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73           P5_Cons
26280 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d  traintUnique);.}
26290 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
262a0 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75   see if pIndex u
262b0 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  ses the collatin
262c0 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
262d0 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
262e0 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64  e if it does and
262f0 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65   false if it doe
26300 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  s not..*/.#ifnde
26310 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
26320 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74  INDEX.static int
26330 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
26340 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
26350 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  l, Index *pIndex
26360 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
26370 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29  sert( zColl!=0 )
26380 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
26390 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Index->nColumn; 
263a0 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
263b0 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78  char *z = pIndex
263c0 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
263d0 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c   assert( z!=0 ||
263e0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
263f0 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66  n[i]<0 );.    if
26400 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ( pIndex->aiColu
26410 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73  mn[i]>=0 && 0==s
26420 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
26430 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
26440 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
26450 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
26460 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
26470 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
26480 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74  ndices of pTab t
26490 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  hat use the coll
264a0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
264b0 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c  Coll..** If pCol
264c0 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
264d0 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
264e0 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e  of pTab..*/.#ifn
264f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26500 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
26510 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65  oid reindexTable
26520 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
26530 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61  Table *pTab, cha
26540 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b  r const *zColl){
26550 0a 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61  .  if( !IsVirtua
26560 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 49  l(pTab) ){.    I
26570 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
26580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
26590 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
265a0 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a  d with pTab */..
265b0 20 20 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70      for(pIndex=p
265c0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  Tab->pIndex; pIn
265d0 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64  dex; pIndex=pInd
265e0 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ex->pNext){.    
265f0 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c    if( zColl==0 |
26600 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  | collationMatch
26610 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20  (zColl, pIndex) 
26620 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
26630 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
26640 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
26650 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
26660 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ema);.        sq
26670 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
26680 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
26690 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20   0, iDb);.      
266a0 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
266b0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
266c0 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  dex, -1);.      
266d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  }.    }.  }.}.#e
266e0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ndif../*.** Reco
266f0 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
26700 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  s of all tables 
26710 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
26720 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e   where the.** in
26730 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63 6f  dices use the co
26740 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
26750 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c   pColl.  If pCol
26760 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
26770 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63  ute.** all indic
26780 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a  es everywhere..*
26790 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
267a0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
267b0 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65  atic void reinde
267c0 78 44 61 74 61 62 61 73 65 73 28 50 61 72 73 65  xDatabases(Parse
267d0 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 63   *pParse, char c
267e0 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20  onst *zColl){.  
267f0 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
26800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
26810 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
26820 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
26830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26840 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
26850 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
26860 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
26870 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
26880 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
26890 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
268a0 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20  HashElem *k;    
268b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
268c0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
268d0 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f  tables in pDb */
268e0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
268f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26900 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
26910 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20   database */..  
26920 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
26930 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65  treeHoldsAllMute
26940 78 65 73 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e  xes(db) );  /* N
26950 65 65 64 65 64 20 66 6f 72 20 73 63 68 65 6d 61  eeded for schema
26960 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72   access */.  for
26970 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e  (iDb=0, pDb=db->
26980 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  aDb; iDb<db->nDb
26990 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b  ; iDb++, pDb++){
269a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62  .    assert( pDb
269b0 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b  !=0 );.    for(k
269c0 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
269d0 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  (&pDb->pSchema->
269e0 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d  tblHash);  k; k=
269f0 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b  sqliteHashNext(k
26a00 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d  )){.      pTab =
26a10 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48   (Table*)sqliteH
26a20 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20  ashData(k);.    
26a30 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70    reindexTable(p
26a40 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f  Parse, pTab, zCo
26a50 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ll);.    }.  }.}
26a60 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
26a70 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
26a80 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d   the REINDEX com
26a90 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mand..**.**     
26aa0 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20     REINDEX      
26ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ac0 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20        -- 1.**   
26ad0 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63       REINDEX  <c
26ae0 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20  ollation>       
26af0 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20          -- 2.** 
26b00 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
26b10 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61  ?<database>.?<ta
26b20 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a  blename>  -- 3.*
26b30 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
26b40 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
26b50 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34  indexname>  -- 4
26b60 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61  .**.** Form 1 ca
26b70 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  uses all indices
26b80 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64   in all attached
26b90 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65   databases to be
26ba0 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72   rebuilt..** For
26bb0 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c  m 2 rebuilds all
26bc0 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
26bd0 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75  databases that u
26be0 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20  se the named.** 
26bf0 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
26c00 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64  on.  Forms 3 and
26c10 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e   4 rebuild the n
26c20 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c  amed index or al
26c30 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73  l.** indices ass
26c40 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
26c50 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f   named table..*/
26c60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26c70 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69  OMIT_REINDEX.voi
26c80 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78  d sqlite3Reindex
26c90 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
26ca0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54  Token *pName1, T
26cb0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20  oken *pName2){. 
26cc0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
26cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26ce0 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
26cf0 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ce to be reindex
26d00 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ed, or NULL */. 
26d10 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
26d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26d30 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  Name of a table 
26d40 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f  or index */.  co
26d50 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  nst char *zDb;  
26d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
26d70 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
26d80 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
26d90 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
26da0 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
26db0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
26dc0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
26dd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
26de0 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
26df0 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
26e00 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
26e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
26e30 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
26e40 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
26e50 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
26e60 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
26e70 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  onnection */.  T
26e80 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20  oken *pObjName; 
26e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
26ea0 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
26eb0 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72  or index to be r
26ec0 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f  eindexed */..  /
26ed0 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
26ee0 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
26ef0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
26f00 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
26f10 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
26f20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
26f30 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
26f40 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
26f50 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
26f60 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
26f70 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
26f80 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d  ..  if( pName1==
26f90 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78  0 ){.    reindex
26fa0 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65  Databases(pParse
26fb0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
26fc0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45  ;.  }else if( NE
26fd0 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c  VER(pName2==0) |
26fe0 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29  | pName2->z==0 )
26ff0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c  {.    char *zCol
27000 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  l;.    assert( p
27010 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20  Name1->z );.    
27020 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e  zColl = sqlite3N
27030 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
27040 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29  rse->db, pName1)
27050 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c  ;.    if( !zColl
27060 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
27070 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
27080 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
27090 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
270a0 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
270b0 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78  ){.      reindex
270c0 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65  Databases(pParse
270d0 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
270e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
270f0 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
27100 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
27110 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
27120 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a  db, zColl);.  }.
27130 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
27140 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
27150 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
27160 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20  2, &pObjName);. 
27170 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
27180 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  urn;.  z = sqlit
27190 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
271a0 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20  db, pObjName);. 
271b0 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
271c0 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e  rn;.  zDb = db->
271d0 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
271e0 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  e;.  pTab = sqli
271f0 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
27200 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20   z, zDb);.  if( 
27210 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e  pTab ){.    rein
27220 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
27230 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73   pTab, 0);.    s
27240 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
27250 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   z);.    return;
27260 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
27270 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
27280 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20  (db, z, zDb);.  
27290 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
272a0 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  , z);.  if( pInd
272b0 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
272c0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
272d0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
272e0 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
272f0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
27300 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29  rse, pIndex, -1)
27310 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
27320 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  }.  sqlite3Error
27330 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
27340 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20  ble to identify 
27350 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65  the object to be
27360 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a   reindexed");.}.
27370 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
27380 74 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73  turn a KeyInfo s
27390 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
273a0 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
273b0 20 74 68 65 20 67 69 76 65 6e 20 49 6e 64 65 78   the given Index
273c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
273d0 65 72 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  er should invoke
273e0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
273f0 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 72 65  nref() on the re
27400 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 0a 2a 2a  turned object.**
27410 20 77 68 65 6e 20 69 74 20 68 61 73 20 66 69 6e   when it has fin
27420 69 73 68 65 64 20 75 73 69 6e 67 20 69 74 2e 0a  ished using it..
27430 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
27440 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65  te3KeyInfoOfInde
27450 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
27460 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20   Index *pIdx){. 
27470 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
27480 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ol = pIdx->nColu
27490 6d 6e 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d  mn;.  int nKey =
274a0 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a   pIdx->nKeyCol;.
274b0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b    KeyInfo *pKey;
274c0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
274d0 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Err ) return 0;.
274e0 20 20 69 66 28 20 70 49 64 78 2d 3e 75 6e 69 71    if( pIdx->uniq
274f0 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70  NotNull ){.    p
27500 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Key = sqlite3Key
27510 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65  InfoAlloc(pParse
27520 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c  ->db, nKey, nCol
27530 2d 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  -nKey);.  }else{
27540 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69  .    pKey = sqli
27550 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
27560 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c  pParse->db, nCol
27570 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
27580 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65  pKey ){.    asse
27590 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
275a0 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
275b0 65 79 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ey) );.    for(i
275c0 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
275d0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
275e0 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78  ar *zColl = pIdx
275f0 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
27600 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69     pKey->aColl[i
27610 5d 20 3d 20 7a 43 6f 6c 6c 3d 3d 73 71 6c 69 74  ] = zColl==sqlit
27620 65 33 53 74 72 42 49 4e 41 52 59 20 3f 20 30 20  e3StrBINARY ? 0 
27630 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
27640 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
27650 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
27660 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  Parse, zColl);. 
27670 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74       pKey->aSort
27680 46 6c 61 67 73 5b 69 5d 20 3d 20 70 49 64 78 2d  Flags[i] = pIdx-
27690 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a  >aSortOrder[i];.
276a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d        assert( 0=
276b0 3d 28 70 4b 65 79 2d 3e 61 53 6f 72 74 46 6c 61  =(pKey->aSortFla
276c0 67 73 5b 69 5d 20 26 20 4b 45 59 49 4e 46 4f 5f  gs[i] & KEYINFO_
276d0 4f 52 44 45 52 5f 42 49 47 4e 55 4c 4c 29 20 29  ORDER_BIGNULL) )
276e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
276f0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
27700 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
27710 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  arse->rc==SQLITE
27720 5f 45 52 52 4f 52 5f 4d 49 53 53 49 4e 47 5f 43  _ERROR_MISSING_C
27730 4f 4c 4c 53 45 51 20 29 3b 0a 20 20 20 20 20 20  OLLSEQ );.      
27740 69 66 28 20 70 49 64 78 2d 3e 62 4e 6f 51 75 65  if( pIdx->bNoQue
27750 72 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ry==0 ){.       
27760 20 2f 2a 20 44 65 61 63 74 69 76 61 74 65 20 74   /* Deactivate t
27770 68 65 20 69 6e 64 65 78 20 62 65 63 61 75 73 65  he index because
27780 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20   it contains an 
27790 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 6c 61 74 69 6e  unknown collatin
277a0 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 71  g.        ** seq
277b0 75 65 6e 63 65 2e 20 20 54 68 65 20 6f 6e 6c 79  uence.  The only
277c0 20 77 61 79 20 74 6f 20 72 65 61 63 74 69 76 65   way to reactive
277d0 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 6f   the index is to
277e0 20 72 65 6c 6f 61 64 20 74 68 65 0a 20 20 20 20   reload the.    
277f0 20 20 20 20 2a 2a 20 73 63 68 65 6d 61 2e 20 20      ** schema.  
27800 41 64 64 69 6e 67 20 74 68 65 20 6d 69 73 73 69  Adding the missi
27810 6e 67 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ng collating seq
27820 75 65 6e 63 65 20 6c 61 74 65 72 20 64 6f 65 73  uence later does
27830 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   not.        ** 
27840 72 65 61 63 74 69 76 65 20 74 68 65 20 69 6e 64  reactive the ind
27850 65 78 2e 20 20 54 68 65 20 61 70 70 6c 69 63 61  ex.  The applica
27860 74 69 6f 6e 20 68 61 64 20 74 68 65 20 63 68 61  tion had the cha
27870 6e 63 65 20 74 6f 20 72 65 67 69 73 74 65 72 0a  nce to register.
27880 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
27890 69 73 73 69 6e 67 20 69 6e 64 65 78 20 75 73 69  issing index usi
278a0 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ng the collation
278b0 2d 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 63 6b  -needed callback
278c0 2e 20 20 46 6f 72 0a 20 20 20 20 20 20 20 20 2a  .  For.        *
278d0 2a 20 73 69 6d 70 6c 69 63 69 74 79 2c 20 53 51  * simplicity, SQ
278e0 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 67 69  Lite will not gi
278f0 76 65 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  ve the applicati
27900 6f 6e 20 61 20 73 65 63 6f 6e 64 20 63 68 61 6e  on a second chan
27910 63 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ce..        */. 
27920 20 20 20 20 20 20 20 70 49 64 78 2d 3e 62 4e 6f         pIdx->bNo
27930 51 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20  Query = 1;.     
27940 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
27950 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f 52 45 54  SQLITE_ERROR_RET
27960 52 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  RY;.      }.    
27970 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
27980 55 6e 72 65 66 28 70 4b 65 79 29 3b 0a 20 20 20  Unref(pKey);.   
27990 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20     pKey = 0;.   
279a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
279b0 70 4b 65 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  pKey;.}..#ifndef
279c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
279d0 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
279e0 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  tine is invoked 
279f0 6f 6e 63 65 20 70 65 72 20 43 54 45 20 62 79 20  once per CTE by 
27a00 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
27a10 20 70 61 72 73 69 6e 67 20 61 20 0a 2a 2a 20 57   parsing a .** W
27a20 49 54 48 20 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a  ITH clause. .*/.
27a30 57 69 74 68 20 2a 73 71 6c 69 74 65 33 57 69 74  With *sqlite3Wit
27a40 68 41 64 64 28 0a 20 20 50 61 72 73 65 20 2a 70  hAdd(.  Parse *p
27a50 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
27a60 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
27a70 78 74 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57  xt */.  With *pW
27a80 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ith,            
27a90 2f 2a 20 45 78 69 73 74 69 6e 67 20 57 49 54 48  /* Existing WITH
27aa0 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c   clause, or NULL
27ab0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
27ac0 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me,           /*
27ad0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6d   Name of the com
27ae0 6d 6f 6e 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 45  mon-table */.  E
27af0 78 70 72 4c 69 73 74 20 2a 70 41 72 67 6c 69 73  xprList *pArglis
27b00 74 2c 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e  t,     /* Option
27b10 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c  al column name l
27b20 69 73 74 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ist for the tabl
27b30 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
27b40 51 75 65 72 79 20 20 20 20 20 20 20 20 20 20 2f  Query          /
27b50 2a 20 51 75 65 72 79 20 75 73 65 64 20 74 6f 20  * Query used to 
27b60 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74  initialize the t
27b70 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  able */.){.  sql
27b80 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
27b90 65 2d 3e 64 62 3b 0a 20 20 57 69 74 68 20 2a 70  e->db;.  With *p
27ba0 4e 65 77 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  New;.  char *zNa
27bb0 6d 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  me;..  /* Check 
27bc0 74 68 61 74 20 74 68 65 20 43 54 45 20 6e 61 6d  that the CTE nam
27bd0 65 20 69 73 20 75 6e 69 71 75 65 20 77 69 74 68  e is unique with
27be0 69 6e 20 74 68 69 73 20 57 49 54 48 20 63 6c 61  in this WITH cla
27bf0 75 73 65 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f 74  use. If.  ** not
27c00 2c 20 73 74 6f 72 65 20 61 6e 20 65 72 72 6f 72  , store an error
27c10 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74   in the Parse st
27c20 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e  ructure. */.  zN
27c30 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
27c40 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
27c50 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  e->db, pName);. 
27c60 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 70 57   if( zName && pW
27c70 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ith ){.    int i
27c80 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
27c90 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b  <pWith->nCte; i+
27ca0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
27cb0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61  lite3StrICmp(zNa
27cc0 6d 65 2c 20 70 57 69 74 68 2d 3e 61 5b 69 5d 2e  me, pWith->a[i].
27cd0 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
27ce0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
27cf0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
27d00 70 6c 69 63 61 74 65 20 57 49 54 48 20 74 61 62  plicate WITH tab
27d10 6c 65 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e  le name: %s", zN
27d20 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
27d30 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
27d40 57 69 74 68 20 29 7b 0a 20 20 20 20 73 71 6c 69  With ){.    sqli
27d50 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20  te3_int64 nByte 
27d60 3d 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29  = sizeof(*pWith)
27d70 20 2b 20 28 73 69 7a 65 6f 66 28 70 57 69 74 68   + (sizeof(pWith
27d80 2d 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74 68 2d  ->a[1]) * pWith-
27d90 3e 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e 65 77  >nCte);.    pNew
27da0 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
27db0 6c 6f 63 28 64 62 2c 20 70 57 69 74 68 2c 20 6e  loc(db, pWith, n
27dc0 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
27dd0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
27de0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
27df0 62 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68  b, sizeof(*pWith
27e00 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ));.  }.  assert
27e10 28 20 28 70 4e 65 77 21 3d 30 20 26 26 20 7a 4e  ( (pNew!=0 && zN
27e20 61 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d  ame!=0) || db->m
27e30 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a  allocFailed );..
27e40 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
27e50 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
27e60 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
27e70 65 74 65 28 64 62 2c 20 70 41 72 67 6c 69 73 74  ete(db, pArglist
27e80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
27e90 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
27ea0 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  Query);.    sqli
27eb0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
27ec0 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d  ame);.    pNew =
27ed0 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65 7b   pWith;.  }else{
27ee0 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65  .    pNew->a[pNe
27ef0 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63 74  w->nCte].pSelect
27f00 20 3d 20 70 51 75 65 72 79 3b 0a 20 20 20 20 70   = pQuery;.    p
27f10 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74  New->a[pNew->nCt
27f20 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67 6c  e].pCols = pArgl
27f30 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ist;.    pNew->a
27f40 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61  [pNew->nCte].zNa
27f50 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
27f60 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43  pNew->a[pNew->nC
27f70 74 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20 30 3b  te].zCteErr = 0;
27f80 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b  .    pNew->nCte+
27f90 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  +;.  }..  return
27fa0 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
27fb0 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  Free the content
27fc0 73 20 6f 66 20 74 68 65 20 57 69 74 68 20 6f 62  s of the With ob
27fd0 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
27fe0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
27ff0 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
28000 74 65 33 57 69 74 68 44 65 6c 65 74 65 28 73 71  te3WithDelete(sq
28010 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20  lite3 *db, With 
28020 2a 70 57 69 74 68 29 7b 0a 20 20 69 66 28 20 70  *pWith){.  if( p
28030 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20  With ){.    int 
28040 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
28050 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69  i<pWith->nCte; i
28060 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
28070 74 20 43 74 65 20 2a 70 43 74 65 20 3d 20 26 70  t Cte *pCte = &p
28080 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  With->a[i];.    
28090 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
280a0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65  tDelete(db, pCte
280b0 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20  ->pCols);.      
280c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
280d0 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 53  ete(db, pCte->pS
280e0 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71  elect);.      sq
280f0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
28100 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
28110 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
28120 62 46 72 65 65 28 64 62 2c 20 70 57 69 74 68 29  bFree(db, pWith)
28130 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
28140 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
28150 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a     E_OMIT_CTE) */.